【问题标题】:How to loop through each row where there are a varying number of rows?如何遍历行数不同的每一行?
【发布时间】:2022-03-06 18:34:03
【问题描述】:

我有一个名为“旧”的电子表格:

col1 col2 col3
A B C
D E F
-- -- --

我有另一个名为“new”的电子表格是空的。

我想将具有“col3 = C”“col2以B结尾”的“old”中的每一行复制到“new”。

这是我尝试过的。
我在应用过滤器之前选择了 A1 - L34,因为我的测试数据只有 A1 - L34 中的条目,但这显然不可扩展。
我想要它,所以范围不是硬编码的。

Sub Test()

    Sheets("Old").Select
    Range("A1:L34").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$O$8351").AutoFilter Field:=3, Criteria1:="C"
    ActiveSheet.Range("$A$1:$O$8351").AutoFilter Field:=2, Criteria1:="=*B", _
        Operator:=xlAnd
       
    Range("A1:L34").Select
    Selection.Copy
   
    Sheets("New").Select
    Range("A1").Select
    ActiveSheet.Paste
End Sub

【问题讨论】:

  • 我已经添加了我现在对问题所做的事情

标签: excel vba autofilter


【解决方案1】:

试试下面的子。

Sub CopyCB()
Dim rng As Range
Dim lRow As Long
Dim sh As Worksheet

    Set sh = Sheets("old")
    lRow = sh.Cells(sh.Rows.Count, 1).End(xlUp).Row

    Set rng = Range("A1:L" & lRow)
    rng.AutoFilter
    rng.AutoFilter Field:=3, Criteria1:="C"
    rng.AutoFilter Field:=2, Criteria1:="=*b", Operator:=xlAnd
    rng.SpecialCells(xlCellTypeVisible).Copy Sheets("new").Range("A1")
    
Set rng = Nothing
Set sh = Nothing
End Sub

【讨论】:

    【解决方案2】:
    Sub Test()
    
        Sheets("Old").Select
        ActiveSheet.UsedRange.Select
        Selection.AutoFilter
        ActiveSheet.UsedRange.AutoFilter Field:=3, Criteria1:="C"
        ActiveSheet.UsedRange.AutoFilter Field:=2, Criteria1:="=*B", _
            Operator:=xlAnd
           
        ActiveSheet.UsedRange.Select
        Selection.Copy
       
        Sheets("New").Select
        Range("A1").Select
        ActiveSheet.Paste
    End Sub
    

    【讨论】:

    • 在不必要的时候使用select 是不好的做法
    【解决方案3】:

    复制符合条件的行

    Option Explicit
    
    Sub Test()
        Dim rng As Range
        With ThisWorkbook.Worksheets("Old")
            .AutoFilterMode = False
            With .Range("A1").CurrentRegion
                .AutoFilter Field:=2, Criteria1:="=*B"
                .AutoFilter Field:=3, Criteria1:="C"
                On Error Resume Next
                Set rng = .Resize(.Rows.Count - 1).Offset(1) _
                    .SpecialCells(xlCellTypeVisible)
                On Error GoTo 0
            End With
            .AutoFilterMode = False
        End With
        If Not rng Is Nothing Then
            rng.Copy ThisWorkbook.Worksheets("New").Range("A1")
        End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 2015-06-16
      相关资源
      最近更新 更多