2015-09-08 2 views
1

Я пытаюсь применить макрос при изменении значения ячейки. Я этот код в Dashboard листе:Применить макрос при изменении значения ячейки: 1004 error

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Target.Worksheet.Range("FilterChoice")) Is Nothing Then Call ApplyDashboardFilter 
End Sub 

Триггер работает отлично и макрос выполняется сразу после, но не знаю, почему я получил ошибку на расширенной функции фильтра: «приложение или объектная ошибка "

Option Explicit 

Sub ApplyDashboardFilter() 
    Dim rng As Range 
    Dim filterName As String 
    Dim tableName As String 
    filterName = "Filter" & Replace(Sheets("Dashboard").Range("FilterChoice").Value, " ", "") 
    tableName = filterName + "[#All]" 
    Sheets("Dashboard").Activate 
    Sheets("Dashboard").Columns("A:AN").Cells.Clear 
    Sheets("Critical Flows").Range("ClosingFlows[#All]").AdvancedFilter Action:=xlFilterCopy _ 
     , CriteriaRange:=Sheets(filterName).Range(tableName) _ 
     , CopyToRange:=Sheets("Dashboard").Range("A1"), Unique:=False 
    Set rng = Range(Range("A1"), Range("A1").CurrentRegion) 
    ActiveSheet.ListObjects.Add(xlSrcRange, rng, , xlYes).Name = _ 
     "Flows" & filterName 
    ActiveSheet.ListObjects("Flows" & filterName).TableStyle = "TableStyleMedium3" 
    If Sheets("Dashboard").Range("FilterChoice").Value = "Orchestrated" Then 
     Call ApplyFlormulaRunbookName 
    End If 
End Sub 

Макрос работает при срабатывании кнопки на листе панели.

Я что-то упустил?

Спасибо заранее,

EDIT:

Ну, что-то странное случилось. Я только что повторно открыл файл после перерыва и работал. Я подозреваю, что что-то случилось с ActiveSheet и/или конфликтом с другой книгой, так как я играю с 2 другими книгами и 10 листами в целом.

Возможно ли это?

+0

Похоже, это пример того, почему вы должны ссылаться на правильные листы, а не на ActiveSheet. Похоже, что «Dashboard» - это активный лист, поэтому передайте это переменной и используйте это. Например. - 'Set wrkSht = Thisworkbook.worksheets (« Dashboard »): wrksht.Columns (« A: AN »). ClearContents: Установите rng = wrksht.Range (« A1 »). CurrentRegion' и т. Д. –

+0

Я думаю это могло быть проблемой. Поскольку я не могу проверить это, я предполагаю, что это путь. Я изменяю свой код на основе вашего ответа, спасибо! – FaXaq

ответ

1

Я добавил в качестве ответа, поскольку комментарии не позволят мне правильно отформатировать. Этот код просто ссылается на листах, а не выбирать их:

Sub ApplyDashboardFilter() 
    Dim rng As Range 
    Dim filterName As String 
    Dim tableName As String 
    Dim wrkShtDash As Worksheet 
    Dim wrkShtFlows As Worksheet 

    Set wrkShtDash = ThisWorkbook.Worksheets("Dashboard") 
    Set wrkShtFlows = ThisWorkbook.Worksheets("Critical Flows") 

    filterName = "Filter" & Replace(wrkShtDash.Range("FilterChoice").Value, " ", "") 
    tableName = filterName + "[#All]" 
    wrkShtDash.Columns("A:AN").Cells.Clear 
    wrkShtFlows.Range("ClosingFlows[#All]").AdvancedFilter Action:=xlFilterCopy _ 
     , CriteriaRange:=ThisWorkbook.Worksheets(filterName).Range(tableName) _ 
     , CopyToRange:=wrkShtDash.Range("A1"), Unique:=False 
    Set rng = wrkShtDash.Range(wrkShtDash.Range("A1"), wrkShtDash.Range("A1").CurrentRegion) 
    wrkShtDash.ListObjects.Add(xlSrcRange, rng, , xlYes).Name = _ 
     "Flows" & filterName 
    wrkShtDash.ListObjects("Flows" & filterName).TableStyle = "TableStyleMedium3" 
    If wrkShtDash.Range("FilterChoice").Value = "Orchestrated" Then 
     Call ApplyFlormulaRunbookName 'Spelt correctly? 
    End If 
End Sub 

Примечания: Я не проверял код, это просто показывает, что вы не должны активировать лист перед началом работы на нем и явно о с файлом или листом, с которым он работает - ThisWorkbook означает файл, в котором находится код VBA.

Смежные вопросы