如何比较两个excel工作表之间的特定数据范围,确定差异并填写空白?

时间:2014-05-25 04:41:10

标签: excel vba excel-vba

我似乎无法解决这个我一直在努力的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

2 个答案:

答案 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