将If语句添加到使用列标题复制的代码

时间:2016-08-16 17:26:27

标签: excel vba excel-vba

此代码使用列标题将数据从一个工作表复制到另一个工作表。

但我需要一个条件,以便它只复制列L与$ AB $ 1的值匹配的行。我似乎无法正确使用语法,它只是忽略我添加的if语句而只是复制所有内容。

编辑澄清......我想复制L#= $ AB $ 1的行。如果L2 = AB1,则不全部复制。有意义吗?

有什么想法吗?

Sub Test()

Dim ws As Worksheet
Dim ws2 As Worksheet
Set ws = Worksheets("CurrentPayrollNonExempt")
Set ws2 = Worksheets("BiWkly Template")

    With ws
        For i = 1 To .UsedRange.Columns.Count
            If (.Cells(2, "L").Value) = .Range("$AB$1").Value Then
                Set x = ws2.Rows(4).Find(ws.Cells(1, i).Value, LookIn:=xlValues, Lookat:=xlWhole)
                If Not x Is Nothing Then
                    y = .Cells(Rows.Count, i).End(3).Row
                    .Range(.Cells(2, i), .Cells(y, i)).Copy
                    ws2.Cells(5, x.Column).PasteSpecial xlValues
                End If

                Set x = Nothing
            End If
        Next i
    End With

End Sub

3 个答案:

答案 0 :(得分:0)

什么是x,什么是y?你从未定义过那些。如果你插入

Option Explicit

在模块的顶部,它会强制您声明变量。

我不能代表所有人,但这似乎是你在WITH声明中提出了很多问题。就个人而言,我会将该代码分解为更易于管理和更易于读取的块,并且您的调试可能更容易启动。将代码压缩到绝对最小值没有奖励点;)。

电子表格的数据格式是什么?你在用桌子吗?表ListObject通常使数据处理更容易。

修改 看来你只是在第2行的所有列中循环,而你永远不会沿着行向下。添加另一个控制索引,如下所示:

With ws
for j = 2 to .UsedRange.Rows.Count - 1
    For i = 1 To .UsedRange.Columns.Count
        If (.Cells(j, "L").Value) = .Range("$AB$1").Value Then
            Set x = ws2.Rows(4).Find(ws.Cells(1, i).Value, LookIn:=xlValues, Lookat:=xlWhole)
            If Not x Is Nothing Then
                y = .Cells(Rows.Count, i).End(3).Row
                .Range(.Cells(2, i), .Cells(y, i)).Copy
                ws2.Cells(5, x.Column).PasteSpecial xlValues
            End If

            Set x = Nothing
        End If
    Next I
Next j
End With

j循环应该沿着行向下,从第2行开始,并且考虑到由于标题行而结束将是-1。因此,.Cells(j,“L”)将是每个行传递的常量值。

答案 1 :(得分:0)

我希望我理解你想要的东西,因为你没有提高你的搜索条件,我把它放在For循环之外。

Sub Test()

Dim ws As Worksheet
Dim ws2 As Worksheet
Set ws = Worksheets("CurrentPayrollNonExempt")
Set ws2 = Worksheets("BiWkly Template")

    With ws
        If Not IsError(Application.Match(.Range("$AB$1").Value, .Columns("L:L"), 0)) Then
            For i = 1 To .UsedRange.Columns.Count
                Set x = ws2.Rows(4).Find(ws.Cells(1, i).Value, LookIn:=xlValues, Lookat:=xlWhole)
                If Not x Is Nothing Then
                    y = .Cells(Rows.Count, i).End(3).Row
                    .Range(.Cells(2, i), .Cells(y, i)).Copy
                    ws2.Cells(5, x.Column).PasteSpecial xlValues
                End If

                Set x = Nothing
            Next i

        Else
            ' for debug purposes only
            MsgBox "Value in Cell $AB$1 not found"
        End If
    End With

End Sub

答案 2 :(得分:0)

这是您想要做的最小编辑版本:

[15,34,595,NaN]

它只隐藏列L不等于所需值的行。确保其他一切都能按预期工作。

小心使用Sub Test() Dim ws As Worksheet Dim ws2 As Worksheet Set ws = Worksheets("CurrentPayrollNonExempt") Set ws2 = Worksheets("BiWkly Template") With ws ' Filter out the rows to ignore .UsedRange.Autofilter 12, .Range("$AB$1").Value ' column 12 = "L" For i = 1 To .UsedRange.Columns.Count Set x = ws2.Rows(4).Find(ws.Cells(1, i).Value, LookIn:=xlValues, Lookat:=xlWhole) If Not x Is Nothing Then y = .Cells(Rows.Count, i).End(3).Row .Range(.Cells(2, i), .Cells(y, i)).Copy ws2.Cells(5, x.Column).PasteSpecial xlValues End If Set x = Nothing Next i End With End Sub (在我的编辑和原文中)。根据您的工作表,这可能会非常糟糕,因为UsedRange可能不是您所期望的。如果您在UsedRange之类的列中循环,并且如果您在已知的表格范围内过滤了For i = 1 To .Cells(1, .Columns.Count).End(xlLeft).Column),那就更好了。