在AdvancedFilter VBA生成表中引用表标头

时间:2016-02-12 22:15:42

标签: excel vba excel-vba

我有一个宏,它接受一些用户输入值来过滤并将原始数据复制到用户可见的工作表。

-o

从这个新复制的数据生成一个表。

Sheets("RawData").Range("Raw[#All]").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("RawData").Range("AH1:AL" & (i + 1)), _
CopyToRange:=Sheets("User").Range("A15"), Unique:=False

我有一张桌子" Pareto"如果事件发生在同一日期,则另一张要匹配的工作表:

Sheets("User").Range("A15").CurrentRegion.Select
Set rng = Selection
Set tbl = Sheets("User").ListObjects.Add(xlSrcRange, rng, xlYes)
    tbl.Name = "userSelections"

但是,当宏重新生成" userTable"它在" Pareto"中重新创建标题和公式。失去对" userTable"的引用这会导致#REF错误

=COUNTIFS(userSelections[MMM-YY], [Event Date])

将计算模式转换为手动模式不起作用,仅使用=COUNTIFS(#REF!,[Event Date]) DataBodyRange.Rows.Delete删除表格内容无效。

2 个答案:

答案 0 :(得分:0)

您的问题是您每次都要删除该表并重新创建它。删除表时,引用该特定表的任何公式都将具有引用错误,因为该表不再存在(即使新表具有相同的名称)。

我建议删除表格数据,然后将新数据插入现有表格。

<强>未测试

Sub main()
    Dim tbl As ListObject
    Dim rng As Range

    'set the tbl variable to the existing table
    Set tbl = Sheets("User").ListObjects("userSelections")

    'delete the data from the existing table
    tbl.DataBodyRange.Delete

    'add the new data to the existing table
    'tbl.Range accesses the range the tbl covers
    'tbl.Range.Cells(1,1) references the first row and column (first cell) in the table range
    'tbl.Range.Cells(1,1).Offset(1,0) references the second row in the table, where your data will start
    Sheets("RawData").Range("Raw[#All]").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("RawData").Range("AH2:AL" & (i + 1)), _
    CopyToRange:=tbl.Range.Cells(1, 1).Offset(1, 0), Unique:=False
End Sub

这会将数据复制到表中。该表将自我展开以包含所有数据,因此实际上不需要每次都创建一个新表。

答案 1 :(得分:0)

我无法找到保留引用的方法,但是每次重新创建表后插入公式都找到了解决方法:

Sheets("RawData").Range("Raw[#All]").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("RawData").Range("AH1:AL" & (i + 1)), _
CopyToRange:=Sheets("User").Range("A15"), Unique:=False

Sheets("User").Range("A15").CurrentRegion.Select

Set rng = Selection
Set tbl = Sheets("User").ListObjects.Add(xlSrcRange, rng, xlYes)
    tbl.Name = "userSelections"

Sheets("Totals").ListObjects("tblTotal").ListColumns("Total Events").DataBodyRange.FormulaR1C1 = _
"=IF([RowNum] = """", """", COUNTIF(userSelections[MMM-YY], [Event Date]))"