Excel VBA将过滤的数据从一张纸复制到另一张数据

我试图将过滤的数据从一张表复制到另一张表,并成功,除了它将所有内容复制到同一行。

我如何使它填充所有的行,而不是复制在同一行?

这里是我修改的代码:

Private Sub Workbook_Open() Dim i, LastRow LastRow = Sheets("Scheduled WO's").Range("A" & Rows.Count).End(xlUp).Row Sheets("Branden").Range("A2:Q10000").ClearContents For i = 2 To LastRow If Sheets("Scheduled WO's").Cells(i, "G").Value = "Branden" Then Sheets("Scheduled WO's").Cells(i, "G").EntireRow.Copy Destination:=Sheets("Branden").Range("A" & Rows.Count).End(xlUp).Offset(1) End If Next End Sub 

你必须取消声明

 Sheets("Branden").Range("A2:Q10000").ClearContents 

在每次打开工作簿时清除“Branden”工作表单元格

此外,由于您的需求正在过滤 ,您可能需要使用自动 过滤 器并避免在单元格中循环

 Private Sub Workbook_Open() With Worksheets("Scheduled WO's") With .Range("G1:G" & .Cells(.Rows.Count, 1).End(xlUp).Row) .AutoFilter field:=1, Criteria1:="Branden" If Application.WorksheetFunction.Subtotal(103, .Cells) - 1 > 0 Then .Offset(1).Resize(.Rows.Count - 1).SpecialCells(XlCellType.xlCellTypeVisible).EntireRow.Copy Worksheets("Branden").Range("A" & Rows.Count).End(xlUp).Offset(1) End With .AutoFilterMode = False End With End Sub 

根据匹配标准从一张到另一张复制行


有两种方法可以解决这个问题。

代码1

第一个是坚持你正在做的事,这可能是也可能不是实现这个的较慢的方法(取决于你移动的细胞数量)。

 Option Explicit Private Sub Workbook_Open() Dim wsWO As Worksheet: Set wsWO = ThisWorkbook.Sheets("Scheduled WO's") Dim wsB As Worksheet: Set wsB = ThisWorkbook.Sheets("Branden") Dim LastRow As Long: LastRow = wsWO.Cells(wsWO.Rows.Count, 1).End(xlUp).Row Dim i As Long wsB.Range("A2:Q10000").ClearContents For i = 2 To LastRow If wsWO.Cells(i, "G").Value = "Branden" Then _ wsWO.Cells(i, "G").EntireRow.Copy _ wsB.Range("A" & wsB.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1) Next i End Sub 

代码2

另一种方式是通过专门查找“Branden”的出现,并复制这些行。

 Option Explicit Private Sub Workbook_Open() Dim wsWO As Worksheet: Set wsWO = ThisWorkbook.Sheets("Scheduled WO's") Dim wsB As Worksheet: Set wsB = ThisWorkbook.Sheets("Branden") Dim findBranden As Range: Set findBranden = wsWO.Range("G:G") _ .Find(What:="Branden", LookIn:=xlValues, LookAt:=xlWhole) Dim firstResult As String wsB.Range("A2:Q10000").ClearContents If Not findBranden Is Nothing Then firstResult = findBranden.Address Do findBranden.EntireRow.Copy _ wsB.Range("A" & wsB.Cells(wsB.Rows.Count, 1).End(xlUp).Row + 1) Set findBranden = wsWO.Range("G:G").FindNext(findBranden) Loop While Not findBranden Is Nothing And findBranden.Address <> firstResult Else: MsgBox "Nothing to move today.", vbInformation, "" End If End Sub 

你会注意到这两个代码中都有一些新的东西。

一个重要的是Option Explicit 如果你有任何未声明的variables,将它包含在你的代码模块的顶部将在编译时提醒你。 这非常有用,因为它会在你的代码运行之前发生拼写错误等。 我敢说,所有有经验的VBA编码器都使用Option Explicit或者在Tools> Options> Editor菜单中打开Require Variable Declaration

另一个非常重要的变化是声明我们正在使用的特定types的variables。 在你的代码中, LastRowi被假定为Varianttypes,因为你从来没有指定它的使用。 在编码方面尽可能具体,特别是在variables声明方面,因为这会使你的代码故障排除变得简单得多。

我还将工作表声明为variables,使书面代码更小,更易于阅读。


您可能会find有用的文学

为什么Option Explicit

为什么Require Variable Declaration

为什么要声明特定types的variables?


两种方法都是可行的,而且易于操作。 让我知道如果我设法帮助:)