Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何比较两个工作簿中唯一数据的列_Excel_Vba - Fatal编程技术网

Excel 如何比较两个工作簿中唯一数据的列

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

我想比较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 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。修复:将
    match=False
    移动到j循环中,因此在j循环开始时将其设置为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测试,内环应该通过测试,但这只是一个臀部。您需要定义业务逻辑。然后假装你是一台计算机,看看每一行代码,然后决定怎么做。