Excel 如何比较两个工作簿中唯一数据的列
我想比较fortest1.xlsx中D列的数据和tested.xlsm中F列的数据。如果它们匹配,则什么也不做。如果它们不匹配,则将fortest.xlsx中的A到C列复制到tested.xlsm中的C到E列。我可以知道我怎样才能做到这一点吗?我的代码运行时没有错误,但是,它不会生成任何结果 提前谢谢Excel 如何比较两个工作簿中唯一数据的列,excel,vba,Excel,Vba,我想比较fortest1.xlsx中D列的数据和tested.xlsm中F列的数据。如果它们匹配,则什么也不做。如果它们不匹配,则将fortest.xlsx中的A到C列复制到tested.xlsm中的C到E列。我可以知道我怎样才能做到这一点吗?我的代码运行时没有错误,但是,它不会生成任何结果 提前谢谢 Sub test() 'Application.ScreenUpdating=True 将WbA设置为工作簿 设置WbA=thisworkbook Dim WbB As Workbook Set
Sub test()
'Application.ScreenUpdating=True
将WbA设置为工作簿
设置WbA=thisworkbook
Dim WbB As Workbook
Set WbB = Workbooks.Open(Filename:="C:\Users\maggie\Desktop\fortest1.xlsx")
Dim SheetA As Worksheet
Dim SheetB As Worksheet
Set SheetA = WbA.Sheets("up")
Set SheetB = WbB.Sheets("up")
Dim eRowA As Integer
Dim eRowB As Integer
eRowA = SheetA.Range("F" & Rows.Count).End(xlUp).Row 'Last line with data in Workbook A (ActiveWorkbook)
eRowB = SheetB.Range("D" & Rows.Count).End(xlUp).Row 'Last line with data in Workbook B (Opened Workbook)
Dim match As Boolean
Dim erow As Long
Dim i, j As Long
Dim r1, r2 As Range
For i = 1 To eRowA
Set r1 = SheetA.Range("F" & i)
match = False
For j = 1 To eRowB
Set r2 = SheetB.Range("D" & j)
If r1 = r2 Then
match = True
End If
Next j
If Not match Then
erow = Range("C" & Rows.Count).End(xlUp).Row + 1
SheetB.Range("A" & j & ":C" & j).Copy Destination:=SheetA.Range("C" & erow & ":E" & erow)
End If
Next i
WbB.Close (False)
端接头
我不太确定我是否理解您真正想要实现的目标,但代码有几个问题 适当的缩进是问题之一。乍一看,代码是如何嵌套的并不明显
- 当比较不为true时,match变量不会重置为false,因此它仍然显示为true。修复:将
移动到j循环中,因此在j循环开始时将其设置为Falsematch=False
- 设置匹配变量,然后在j循环中覆盖七次,然后再对其求值并对其进行处理李>
For i = 1 To eRowA
Set r1 = SheetA.Range("F" & i)
' match = False ' move this into the j loop
For j = 1 To eRowB
match = False
Set r2 = SheetB.Range("D" & j)
If r1 = r2 Then
match = True
End If
' Next j ' this loops too early and overwrites the match variable
If Not match Then
erow = Range("C" & Rows.Count).End(xlUp).Row + 1
SheetB.Range("A" & j & ":C" & j).Copy Destination:=SheetA.Range("C" & erow & ":E" & erow)
End If
Next j
Next i
代码现在在i循环中运行两次,在每个i循环中运行j循环七次。如果这不是你想要实现的,那就直说吧。你有没有仔细检查代码并检查它的功能?一旦你到了一个你认为它应该做某事而它没有做的点,你检查过变量了吗?问题出在哪一行?是的。似乎从未执行以下命令的步骤:erow=Range(“C”和Rows.Count)。End(xlUp)。Row+1 SheetB.Range(“A”&j&“:C”&j)。复制目标:=SheetA.Range(“C”&erow&“:E”&erow)。当您执行这些步骤时,您是否意识到为什么不执行这些步骤?此时匹配变量的值是多少?上次设置变量是什么时候?你看到哪里出了问题吗?这个变量仍然是真的。你明白为什么了吗?嗨,泰琳,非常感谢。您的代码运行并给出结果。但是,它只将最后一行从fortest.xlsx复制到第8行,而不复制所有其他不匹配的值。我想要实现的是,如果fortest1.xlsx中的D列与tested.xlsm中的F列匹配,那么什么也不做。如果它们不匹配,则将fortest.xlsx中的A到C列复制到tested.xlsm.not中的C到E列。它在第一个i循环中复制第2到7行,在第二个i循环中复制第1和第3到7行。我从你的截图中准确地输入了数据,这就是我希望代码能做的。我知道那不是你想要的。理顺你的逻辑,理顺循环。一步一步地思考每一步。我认为外环应该通过fortest测试,内环应该通过测试,但这只是一个臀部。您需要定义业务逻辑。然后假装你是一台计算机,看看每一行代码,然后决定怎么做。