2015-09-08 71 views
1

我试图在单元格中的值发生更改时应用宏。我有这个代码在仪表盘表:在单元格值更改上应用宏:1004错误

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 

宏在Dashboard表单上的按钮触发时工作。

我错过了什么吗?

由于提前,

编辑:

好,奇怪的事情发生了。我休息一会儿就重新打开了文件,它工作了。 我怀疑ActiveSheet发生了什么和/或与另一个工作簿冲突,因为我正在玩2个其他工作簿和总计10张。

可能吗?

+0

这样的声音是为什么你应该引用正确的工作表而不是ActiveSheet的一个例子。它看起来像'仪表板'是活动工作表 - 所以传递给一个变量并使用它。例如。 - 'Set wrkSht = Thisworkbook.worksheets(“Dashboard”):wrksht.Columns(“A:AN”)。ClearContents:Set rng = wrksht.Range(“A1”)。CurrentRegion' etc ..... –

+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代码所在的文件。