【问题标题】:How to copy all rows that have specific values in multiple columns excel?如何复制多列excel中具有特定值的所有行?
【发布时间】:2018-02-15 08:23:24
【问题描述】:

我正在尝试复制 Excel 工作表 Sheet1 中在 AB 列中具有特定值的所有行。然后将它们粘贴到新工作表Sheet2 中。我的具体示例是我已经想出我想复制在列A 中具有0 的行以及在列B 中具有4000 的行。

我遇到的问题是代码复制了A 列中所有具有0 的行,而不仅仅是满足这两个条件的行。

我的代码如下供参考:

Sub Temp_copy()
    set i = Sheets("Sheet1")
    set e = Sheets("Sheet2")
    Dim d
    Dim j
    d = 1
    j = 2

    Do Until IsEmpty(i.Range("A" & j))
        If i.Range("A"&j) = Range("B6"&j) And i.Range("B" & j) = Range(B"10"&j) Then
            d=d+1
            e.Rows(d).Value=i.Rows(j).Value
        End If
        j = j+1
    Loop

End Sub

希望这是有道理的。我是 VBA 新手,因此非常感谢任何帮助或指导来实现我所需要的。

【问题讨论】:

    标签: excel vba multiple-columns


    【解决方案1】:

    可以使用Range对象的AutoFilter()方法,如下(cmets中的解释):

    Sub foo()
        Dim wsResult As Worksheet
        Set wsResult = Sheets("Sheet02")
    
        With Worksheets("Sheet01")
            With .Range("A2:B" & .Cells(.Rows.Count, "A").End(xlUp).Row) 'reference its columns A:B cells from row 2 (header) down to last not empty one in column "A" (If you need to copy more columns than simply adjust "A2:B" to whatever columns range you need)
                .AutoFilter field:=1, Criteria1:="0" ' filter referenced cells on 1st column with "0" content
                .AutoFilter field:=2, Criteria1:="4000" ' filter referenced cells on 2nd column with "4000" content
                If Application.WorksheetFunction.Subtotal(103, .Columns(1)) > 1 Then .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy Destination:=wsResult.Range("A1") ' if any filtered cell other than the header then copy their first five columns and paste to 'wsResult' sheet starting from its column A last not empty cell
            End With
            .AutoFilterMode = False
        End With
    End Sub
    

    【讨论】:

    • 谢谢!完美运行。我现在正试图更进一步。我想有多个可以考虑的条件。我的意思是具有我们之前讨论过的初始条件(A 列中的 0 和 B 列中的 4000),但还要考虑所有在 A 列中具有 2 且在 B 列中具有 8000 的行。我想添加一个 Or 语句,但是不确定放在哪里。我问的是可能的吗?
    • 是的。您可以简单地复制代码并首先复制/粘贴满足第一个条件的单元格,然后复制/粘贴满足第二个条件的单元格。或者您可以复制代码并将两个范围合并,然后复制/粘贴它。或使用 AutoFilter 允许的多条件模式(请参阅 msdn 站点中的文档
    • 我知道有一张表,其中包含 A 到 E、G 到 K 和 M 到 Q 列中的数据。我试图获取所有值为“0”(从“C1”引用)和“ 12.05'(这是从每个相应行的第 4 列中的单元格“C2”引用的。为此,我使用了与上面类似的代码,但使用 field = 4 而不是 =1 并将 with 语句更改为 .Range( "A1:E & cells . rows.count, "D"); ("G1:K & cells . rows.count, "J" 等等。对吗?我知道的问题是只有值是“0”被复制粘贴。知道为什么会这样吗?
    • 我相信是因为代码只能读取整数?有办法解决吗?
    • 这可能是数字格式的问题:excel UI 中的单元格显示“12.05”,但实际值可能是“12.054269”。您最好在新场景中发布一个新问题以及适当的详细信息(一些数据截图)。
    【解决方案2】:

    试试这个:

    Sub Temp_Copy()
        Dim cl As Range, rw As Integer
    
        rw = 1
        For Each cl In Worksheets("Sheet1").Range("A1:A10") //Set range as needed
            If cl = 0 And cl.Offset(0, 1) = 4000 Then
                cl.EntireRow.Copy Destination:=Worksheets("Sheet2").Range("A" & rw)
                rw = rw + 1
            End If
        Next cl
    End Sub
    

    【讨论】: