复制具有多个子标准的行

时间:2017-03-08 23:23:00

标签: excel vba excel-vba

我正在研究一个宏,它将搜索不同县的List表,然后将整行粘贴到当前工作表上。我有一个每个人的工作表(名为马克,约翰等),每个人都被分配了几个县。马克有三个县,列在单元格J1:L1中,我将其命名为范围(MyCounties)。我的宏查看每个县的Sheet“List”列“I”,并将整行复制到Sheet“Mark”,从“A4”开始。我对此非常有效的宏。

对于像洛杉矶县这样的较大的地区,它分为6个人,每个人在该县内的不同城市,在洛杉矶市内,采取不同的邮政编码。是否有可能搜索匹配的县和城市(对于所有城市而不是洛杉矶),以及洛杉矶(城市)和邮政编码?县是列“I”,城市是列“G”,Zip是列“H”。所以“安德鲁”将在洛杉矶县城内的阿罕布拉,阿卡迪亚等地以及洛杉矶(城市)邮政编码为90004,90006等。我知道下面发布的宏不适用于此,但有没有编辑它的方式让它做我想做的事情?我有一个帮助表(“洛杉矶”),显示人员姓名(彼得)在A1:D1(合并单元格),B3和向下是县过滤,C3和向下是要过滤的城市,D3和向下是邮政编码过滤。然后我们跳过一列,F1:I1是下一个人。

我有一份测试文件,一旦我弄明白该怎么做,我就会附上。 test doc

Sub MoreReports()
    Dim w As Long, cVar As Variant, zVar As Variant, rw As Long, sDoc As Worksheet, tDoc As Worksheet

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    Set sDoc = Sheets("List")
    Set tDoc = Sheets("Peter")
    Set cVar = Sheets("Los Angeles").Range("C3:C52")
    Set zVar = Sheets("Los Angeles").Range("d3:d52")


         With sDoc
            If .AutoFilterMode Then .AutoFilterMode = False
            With .Range(.Cells(4, "G"), .Cells(.Rows.Count, "I").End(xlUp))
                .AutoFilter field:=3, Criteria1:="Los Angeles", Operator:=xlAnd
                .AutoFilter field:=1, Criteria1:=cVar, Operator:=xlFilterValues
                .AutoFilter field:=1, Criteria1:="Los Angeles", Operator:=xlAnd
                .AutoFilter field:=2, Criteria1:=zVar, Operator:=xlFilterValues
                .AutoFilter field:=3, Criteria1:="Ventura", Operator:=xlFilterValues                    
                With .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count)
                    If CBool(Application.Subtotal(103, .Cells)) Then
                        .Cells.EntireRow.Copy Destination:=tDoc.Cells(rw, "A")
                    End If
                End With
            End With
            If .AutoFilterMode Then .AutoFilterMode = False
        End With

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With

End Sub

1 个答案:

答案 0 :(得分:0)

所以,我将尝试为此举一个例子(托马斯)。请注意,我只关注城市/邮编,因为该县应该包含这两个独特的价值观;一些城市可以共享相同的邮政编码。

我打算遵循的整个过程是:

.1)记住参考表上的范围(我这样做,所以我可以正确设置我的匹配)

Sheets("Los Angeles").Range("W4:W15") 'City
Sheets("Los Angeles").Range("X4:X15") 'Zip

.2)记住列表表中的范围

Sheets("List").Range("G6:G338") 'City
Sheets("List").Range("H6:H338") 'Zip

.3)设置一个循环,用于对托马斯的参考文献进行分类

Dim i As Integer

For i = 15 to 4

.4)在循环中,创建另一个循环来搜索List

上的值
Dim j As Integer

For j = 6 to 338

.5)使用If语句检查条件

If Match(Sheets("Los Angeles").Range("W"&j),Sheets("List").Range("G"&i))=Match(Sheets("Los Angeles").Range("X"&j),Sheets("List").Range("H"&i)) Then

.6)如果满足条件,我们将剪切并粘贴到相应的工作表

Sheets("List").Row(j).Copy Sheets("Thomas").Row(j)

.7)关闭If语句

End If

.8)转到循环中的下一个j

Next j

.9)转到循环中的下一个

Next i

.10)按邮政编码过滤Thomas'表(应删除所有空行)

Sheets("Thomas").Range("A1:I338").Sort key1:=Range("H1:H338"), order1:=xlAscending, Header:=xlYes

通过这个例子,你应该能够设置彼此的人的床单!

总的来说,它看起来像(可能有更好的方法,但这是我能想到的最简单的Match()事情,在我看来比Find()替代方案更容易):

Dim i As Integer
Dim j As Integer

For i = 15 to 4
    For j = 6 to 338

        If Match(Sheets("Los Angeles").Range("W"&j),Sheets("List").Range("G"&i))=Match(Sheets("Los Angeles").Range("X"&j),Sheets("List").Range("H"&i)) Then
            Sheets("List").Row(j).Copy Sheets("Thomas").Row(j)
        End If
    Next j
Next i