我对Excel中的Macros和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不匹配时。
首先,我希望它对照A中的下一行检查B行1,并继续遍历表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将在一个循环(或某个循环)内,该循环将逐行循环遍历表。然后整个过程将在另一个循环(或其他循环)中循环通过表B。
在过程结束时,将没有高亮显示所有输入的数据正确的单元格,或者将高亮显示不匹配数据的单元格。
我相当确定,通过表B循环不是问题。相反,如果不匹配,我很难使宏移到下一张表。
请让我知道是否需要详细说明。
谢谢!
答案 0 :(得分:0)
您可以尝试:
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页结构: