此代码使用列标题将数据从一个工作表复制到另一个工作表。
但我需要一个条件,以便它只复制列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
答案 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)
,那就更好了。