我编写了一个很长的宏,它查看报告表,根据许多不同的标准对其进行细分(将一些结果放在不同的工作表上),并进行数百次计算。一切看起来都很好,直到我注意到当结果只有一行时,它计算不正确。我将其追溯到这个块。(前两行是 .showalldata 方法无法正常工作的解决方法。)
Worksheets("900").ListObjects("NF900T").ShowAutoFilter = False
Worksheets("900").ListObjects("NF900T").ShowAutoFilter = True
sh900.Range("A1").CurrentRegion.AdvancedFilter xlFilterInPlace, shNFTeen.Range("GC63").CurrentRegion
shNFSnap.Range("C109") = "=subtotal(3,NF900T[BID])"
shNFSnap.Range("E109") = "=subtotal(9,NF900T[CIRC])"
sh900.Range("A1").SpecialCells(xlCellTypeVisible).Copy
shScratch.Range("A1").PasteSpecial xlPasteValues
一切正常,直到第 6 行需要复制可见单元格。(这个特定的块没有自动过滤器,但有些块有,所以我不得不使用可见单元格属性来不包含这些块上的任何过滤结果。)当它运行此行时,它只选择/复制 A1,即使还有其他标题和已填写的单元格。当有多行结果时,它似乎工作正常(选择并复制所有内容)。
另外,我使用了 sh900.Range[...],但我应该引用该表而不是工作表和范围吗?或者在一种情况下是六个,在另一种情况下是六个,这无所谓吗?
答案1
我不确定我是否完全理解您所述的问题,但假设您试图选择NF900T
可能已应用过滤器的 ListObject 的标题和可见单元格,然后使用 ListObject 本身。
复制标题并粘贴到新工作表中。然后复制 DataBodyRange 的可见单元格并粘贴到粘贴的标题下方。
Dim lo As ListObject
Set lo = Worksheets("900").ListObjects("NF900T")
' (Clear the target area in wsScratch if needed)
lo.HeaderRowRange.Copy
wsScratch.Range("A1").PasteSpecial xlPasteValues
' Copy only the visible cells within the data body range
lo.DataBodyRange.SpecialCells(xlCellTypeVisible).Copy
' Paste the copied data body range below the header in wsScratch
wsScratch.Range("A2").PasteSpecial xlPasteValues
Application.CutCopyMode = False