【问题标题】:Comparing two data tables on different tabs in Excel using VBA使用 VBA 比较 Excel 中不同选项卡上的两个数据表
【发布时间】:2019-01-14 14:10:11
【问题描述】:

我对 Excel 中的宏和 VBA 比较陌生,因此我需要一些有关如何解决当前问题的指导。

我的项目的最终目标是让一个宏比较两组数据,这些数据组织成行和列(我们会说表 A 是源数据,表 B 是基于用户输入的)。表 B 中的每一行都应该对应表 A 中的一行,但它们可能是乱序的,或者表 B 中的条目可能不正确。

我的想法是,对于每个表的第一行,宏会从左到右比较每个单元格:

If Sheets("sheet1").Cells(2, 1) = Sheets("sheet2").Cells(2, 1) Then
    If Sheets("sheet1").Cells(2, 2) = Seets("sheet2").Cells(2, 2)

等等,等等。

当表 B 中的单元格与表 A 不匹配时,我的问题就出现了。

首先,我希望它检查 B 行 1 与 A 中的下一行,并继续遍历表 A,直到找到与行匹配的所有五列的“完全匹配”。

我一直在尝试使用 Else if 和 For/Next 语句来做到这一点

For row= 2 to 10
'if statements go here
     Else If Sheets("sheet1").Cells(2, 1) <> Sheets("sheet2").Cells(2, 1)
Next row

我可能完全误解了这里的语法,但我还没有产生如果不满足条件,它会转到下一行的情况。

如果未找到完全匹配,则应突出显示表 B 第 1 行中无法匹配的最后一个单元格。

那么无论是否找到匹配,我们都会移动到表 B 的第 2 行,然后重新开始整个过程​​。

所以,我已经制定了逻辑(我认为),比较 ifs 将在一个循环(或其他东西)内,该循环将逐行循环遍历表 A。然后整个过程将在另一个循环(或其他东西)中循环通过表 B。

在流程结束时,要么没有突出显示的单元格显示所有输入的数据都是正确的,要么突出显示单元格显示不匹配的数据。

我相当肯定,循环通过表 B 不是问题。相反,如果某些内容不匹配,我很难让宏移动到下一个表 A 行。

如果我需要详细说明任何事情,请告诉我。

谢谢!

【问题讨论】:

  • 您可以通过连接每一行并在查找哪个单元格不匹配之前进行比较来简化该过程。

标签: excel vba


【解决方案1】:

你可以试试:

Option Explicit

Sub test()

    Dim Lastrow1 As Long, Lastrow2 As Long, i As Long, j As Long
    Dim Str1 As String, Str2 As String

    'Find the last row of sheet 1
    Lastrow1 = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Row

    'Find the last row of sheet 2
    Lastrow2 = Sheet2.Cells(Sheet2.Rows.Count, "A").End(xlUp).Row

    For i = 2 To Lastrow1
        'Let us assume that table has 3 columns. Merge 3 columns' values and create a string for each line
        Str1 = Sheet1.Cells(i, 1).Value & "_" & Sheet1.Cells(i, 2).Value & "_" & Sheet1.Cells(i, 3).Value

        For j = 2 To Lastrow2
            'Let us assume that table has 3 columns. Merge 3 columns' values and create a string for each line
            Str2 = Sheet2.Cells(j, 1).Value & "_" & Sheet2.Cells(j, 2).Value & "_" & Sheet2.Cells(j, 3).Value

            'If both strings match a message box will appear
            If Str1 = Str2 Then
                MsgBox "Line " & i & " in table A match with line " & j & " in table B!"
                Exit For
            End If

        Next j

    Next i

End Sub

表 1 结构:

表 2 结构:

【讨论】:

  • 感谢您这么快回复!您的编码示例将字段连接起来,这绝对是我正在考虑做的事情,我只是不知道我是否能够用这种方法单独指出不匹配的单元格内容,这就是我走向嵌套 ifs 的原因。当我尝试您的代码以确保我理解语法时,似乎消息框没有触发?我尝试了一些不同的修复,似乎 Lastrow1 和 Lastrow2 变量是罪魁祸首。我自己也无法让这些工作,知道发生了什么吗?
  • 只要 Str1(A、B、C 列的 Sheet1 值)与 Str2(A、B、C 列的 Sheet2 值)相同,就会弹出消息框。 Lastrows,似乎是正确的。
  • 有趣。每当我尝试单步执行代码时,它都会直接从“For i = 2 To Lastrow1”转到“End Sub”。我正在一个我没有重命名的新工作簿中尝试这个。我没有看到对特定工作簿名称的任何引用,是这样吗?如果这很重要,我还保留了默认选项卡名称。
  • Lastrow1 & Lastrow2 的值是多少?
猜你喜欢
  • 2015-07-19
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多