Excel VBA在过滤的数据中复制范围,并在另一个工作表上附加到表的末尾

我有一个问题,但我的VBA是新手,无法弄清楚我的代码出了什么问题。

我试图达到的是:

第1步 。 在工作表1中,单元格B8:BR8中的标题下方有大量数据

第2步 。 我过滤单元格BE8为非空白

第3步 。 我将BE8:BN8下方的过滤数据(不包括标题,我不需要所有的数据,因此我只是复制完整数据的一个子集)

第四步 。 我去了工作表2,我有一个填充的表格,标题为C8:L8,与表格1中的标题BE8:BN8完全一致

第5步 。 我想将这个新复制的数据集添加到表2中的这个表的末尾

第6步 。 我想回到表1并删除一些过滤的数据,特别是在标题BE8,BK8下的数据:BN8

这是我尝试从另一个代码改编的尝试:

Sub TransferData() Dim WS1 As Worksheet, WS2 As Worksheet Dim RngBeforeFilter As Range, RngAfterFilter As Range Dim LCol As Long, LRow As Long With ThisWorkbook Set WS1 = .Sheets("Sheet1") Set WS2 = .Sheets("Sheet2") End With With WS1 'Make sure no other filters are active. .AutoFilterMode = False 'Get the correct boundaries. LRow = .Range("BE" & .Rows.Count).End(xlUp).Row LCol = .Range("BE8:BN8").Column 'Set the range to filter. Set RngBeforeFilter = .Range(.Cells(1, 2), .Cells(LRow, LCol)).Offset(1) RngBeforeFilter.Rows(8).AutoFilter Field:=56, Criteria1:="<>" 'Set the new range, but use visible cells only. Set RngAfterFilter = .Range(.Cells(1, 7), .Cells(LRow, LCol)).SpecialCells(xlCellTypeVisible) 'Copy the visible cells from the new range. RngAfterFilter.Copy WS2.Range("C65536").End(xlUp) 'Clear filtered data (not working) Sheets("Sheet1").Range("B8", Range("B8").End(xlDown)).SpecialCells(xlCellTypeVisible).ClearContents .ShowAllData End With End Sub 

我将不胜感激任何帮助,你可以提供。

谢谢Jacque

这里有几个问题:

 .Range("BE8:BN8").Column 

可能没有达到你所期望的 – 它只会返回BE的列号(即57)。

RngBeforeFilter什么都不做 – 你可以使用

 .Rows(8).AutoFilter Field:=56, Criteria1:="<>" 

你说你想在BE:BN中复制数据,但是你从列A开始了RngAfterFilter(即.Cells(1,7))。

 WS2.Range("C65536").End(xlUp) 

给出使用的最后一行,而您将要粘贴到下一行。

您正在清除B列,而不是BE,BK和BN列。

因此,请试试这个:

  Sub TransferData() Dim WS1 As Worksheet, WS2 As Worksheet Dim RngBeforeFilter As Range, RngAfterFilter As Range Dim BECol As Long, BNCol As Long, LRow As Long With ThisWorkbook Set WS1 = .Sheets("Sheet1") Set WS2 = .Sheets("Sheet2") End With With WS1 'Make sure no other filters are active. .AutoFilterMode = False 'Get the correct boundaries. LRow = .Range("BE" & .Rows.Count).End(xlUp).Row BECol = .Range("BE8").Column BNCol = .Range("BN8").Column 'Set the range to filter. .Rows(8).AutoFilter Field:=BECol - 1, Criteria1:="<>" 'Set the new range, but use visible cells only. Set RngAfterFilter = .Range(.Cells(9, BECol), .Cells(LRow, BNCol)).SpecialCells(xlCellTypeVisible) 'Copy the visible cells from the new range. RngAfterFilter.Copy WS2.Range("C65536").End(xlUp).Offset(1) 'Clear filtered data .Range("BE9", Range("BE8").End(xlDown)).SpecialCells(xlCellTypeVisible).ClearContents .Range("BK9", Range("BK8").End(xlDown)).SpecialCells(xlCellTypeVisible).ClearContents .Range("BN9", Range("BN8").End(xlDown)).SpecialCells(xlCellTypeVisible).ClearContents .ShowAllData End With End Sub