【问题标题】:Excel VBA copying rows using autofilterExcel VBA使用自动过滤器复制行
【发布时间】:2014-03-30 06:09:55
【问题描述】:

希望使用 VBA 从除我的活动工作表之外的所有工作表中复制满足 J 列中特定条件的行。

没有用 VBA 编写代码的经验,所以我试图通过查看其他问题和答案将必要的部分组合在一起;

下面是我目前写的代码;

Sub CommandButton1_Click()

  Dim lngLastRow As Long
  Dim ws As Worksheet
  Dim r As Long, c As Long
  Dim wsRow As Long

  Set Controlled = Sheets("Controlled") ' Set This to the Sheet name you want all Ok's     going to

  Worksheets("Controlled").Activate
  r = ActiveSheet.Cells(Rows.Count, 2).End(x1up).Row
  c = ActiveSheet.Cells(1, Columns.Count).End(x1ToLeft).Column
  Range("J").AutoFilter

  For Each ws In Worksheets
    If ws.Name <> "Controlled" Then
       ws.Activate
       wsRow = ActiveSheet.Cells(Rows.Count, 2).End(x1up).Row + 1
       Range("A" & r).AutoFilter Field:=10, Criteria1:="Y"
       .Copy Controlled.Range("A3" & wsRow)
    End If 
  Next ws
End If


Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic

End Sub

其中 Controlled 是我希望数据出现在其他工作表中的工作表,并搜索所有其他工作表以查看其列 J 是否符合条件 =“Y”

我不需要复制格式,因为所有表格的格式都完全相同,如果可能,我希望复制的行从第 3 行开始

【问题讨论】:

  • 仅供参考 - 在 for 循环之后您有一个额外的 End If
  • 查看我的帖子,我假设您在所有工作表中的数据在第一行都有标题。另外,我假设您在第二行的Controlled Sheet 中有标题,因此数据将在第三行复制。

标签: vba excel autofilter


【解决方案1】:

试试这个:

Option Explicit
Sub ConsolidateY()

Dim ws As Worksheet, wsCtrl As Worksheet
Dim lrow As Long, rng As Range

Set wsCtrl = Thisworkbook.Sheets("Controlled")

With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
End With

For Each ws In Thisworkbook.Worksheets
    If ws.Name = "Controlled" Then GoTo nextsheet
    With ws
        lrow = .Range("J" & .Rows.Count).End(xlUp).Row
        .AutoFilterMode = False
        Set rng = .Range("J1:J" & lrow).Find(what:="Y", after:=.Range("J" & lrow))
        If rng Is Nothing Then GoTo nextsheet
        .Range("J1:J" & lrow).AutoFilter Field:=1, Criteria1:="Y"
        .Range("J1:J" & lrow).Offset(1,0).SpecialCells(xlCellTypeVisible).EntireRow.Copy
        wsCtrl.Range("A" & wsCtrl.Rows.Count).End(xlUp).Offset(1,0).PasteSpecial xlPasteValues
        .AutoFilterMode = False
        Application.CutCopyMode = False
    End With
nextsheet:
Next

With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
End With

End Sub

我认为这涵盖了您的所有或大部分要求。
虽然没有测试,所以我把它留给你。
如果您遇到问题,请告诉我。

【讨论】:

  • 嘿,这段代码非常完美,唯一不太对的地方是;当从工作表复制数据时,它会附带所有标题,因此我最终会在新的受控工作表上将每个工作表中的数据由标题分隔。
  • .Offset(1,0) 应该注意这一点,除非您在每张工作表中的数据在第二行都有标题。如果是这种情况,那么.Range("J1:J" &amp; lrow) 应该更改为.Range("J2:J" &amp; lrow)
  • 太好了,我玩过范围的起点和偏移量,但它以前没有用过,你建议确认如果我改变范围它会起作用。我不得不将其更改为 .range("j3:j" & 1row) ,每张纸在第二行之前都不能有标题,因为我需要在每张纸上都有公司徽标和标题。非常感谢您的帮助!
  • np,很高兴你已经弄清楚了逻辑:D 祝你未来的编码好运。如果你被困在某个地方,请回到这里。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多