我似乎无法解决这个我一直在努力的VBA谜题,请帮忙。我是新手,我可能过于复杂了
基本上,有两个工作表 - 一个名为 Master ,另一个将按日期每天创建。 主标签包含从列A:X 填充的10000行历史数据。另一个选项卡通常包含大约300行新数据,并且还包含类似列A:X ,仅包含列A:B 中的空白单元格。我试图找到与主选项卡匹配的匹配项,如果是,则将主数据A和B中的相应结果填充到主数据库中。如果没有,请留空。至关重要的是 Cells H:M 和 R:W 是相同的匹配。
以下是我的疯狂尝试,感谢您提前帮助
Sub Previous()
Dim u As Long
u = 2
Do While ActiveSheet.Cells(u, 6) <> ""
Dim i As Long
i = 2
Do While Worksheets("Master").Cells(i, 6) <> ""
If ActiveSheet.Range(Cells(u, 8), Cells(u, 13)) _
= Worksheets("Master").Range(Cells(i, 8), Cells(i, 13)) _
And ActiveSheet.Range(Cells(u, 18), Cells(u, 23)) _
= Worksheets("Master").Range(Cells(i, 18), Cells(i, 23)) _
And ActiveSheet.Cells(u, 2) = "" Then
ActiveSheet.Range(Cells(u, 1), Cells(u, 2)) _
= Worksheets("Master").Range(Cells(i, 1), Cells(i, 2))
Else: i = i + 1
End If
Loop
u = u + 1
i = 2
Loop
End Sub
答案 0 :(得分:1)
首先,我不相信这段代码符合您的想法。
Worksheets("Master").Range(Cells(i, 8), Cells(i, 13))
在该代码段Cells(i,8)
中引用ActiveSheet
,而不是Sheets("Master")
。
有关halfway down the page on msdn's Range Object documentation的说明。
通过分配一些工作表变量,您可以大大简化代码。
dim actWs as Worksheet
dim mstWs as Worksheet
Set actWs = Activesheet
Set mstWs = Sheets("Master")
'then reference your ranges like this
mstWs.Cells(i,8)
但是,这不是造成运行时错误的原因。
简单地说,你不能用这种方式比较范围。您需要检查每个单元格的值,以便最终得到另一层嵌套循环。
dim u as long ' active sheet row counter
dim i as long ' master sheet row counter
dim c as long ' column counter
For u = 2 to actWs.Range("A" & .Rows.Count).End(xlUp).Row 'find last row in column "A" of active sheet
For i = 2 to mstWs.Range("A" & .Rows.Count).End(xlUp).Row 'find last row in column "A" of master sheet
For c = 8 to 13
If actWs.Cells(i,c) = mstWs.Cells(i,c) Then
'Do stuff
End if
next c 'next column
next i 'next master sheet row
next u 'next active sheet row
这显然是您需要做的简化版本。注意行连续(&#34; _&#34;)和代码缩进。很容易欺骗自己认为你的程序应该以一种它不会流动的方式流动。建议您存储值,以便检查变量中的相等性,以便于读取。你可能更容易注意到你出错的地方。
答案 1 :(得分:0)
Sub Previous()
Dim actWs As Worksheet
设置actWs = ActiveSheet
Dim mstWs As Worksheet
设置mstWs =表格(&#34; Master&#34;)
Dim u As Long
Dim i As Long
u = 2
执行actWs.Cells(u,6)&lt;&gt; &#34;&#34;
对于i = 2到mstWs.Range(&#34; C&#34;&amp; Rows.Count).End(xlUp).Row
If actWs.Cells(u, 8) = mstWs.Cells(i, 8) And actWs.Cells(u, 9) = mstWs.Cells(i, 9) And actWs.Cells(u, 10) = mstWs.Cells(i, 10) And actWs.Cells(u, 11) = mstWs.Cells(i, 11) And actWs.Cells(u, 12) = mstWs.Cells(i, 12) And actWs.Cells(u, 13) = mstWs.Cells(i, 13) And actWs.Cells(u, 18) = mstWs.Cells(i, 18) And actWs.Cells(u, 19) = mstWs.Cells(i, 19) And actWs.Cells(u, 20) = mstWs.Cells(i, 20) And actWs.Cells(u, 21) = mstWs.Cells(i, 21) And actWs.Cells(u, 22) = mstWs.Cells(i, 22) And actWs.Cells(u, 23) = mstWs.Cells(i, 23) Then
mstWs.Select
Range(Cells(i, 1), Cells(i, 2)).Select
Selection.Copy
actWs.Select
Range(Cells(u, 1), Cells(u, 2)).Select
actWs.Paste
End If
Next i
u = u + 1
循环
End Sub