Vba Excel宏不';不复制行的内容

Vba Excel宏不';不复制行的内容,vba,excel,Vba,Excel,我试图创建一个宏,它比较两列,每列来自不同的文件,并将每个匹配项与其中一个文件中的一些附加单元格一起放入第三个文件 另外,在前两个文件中,对它们进行了一些编辑,因此它们包含实际数据的单元格从各自列的第4行和第2行开始,因此我使用了两个不同的变量,以便循环从这些单元格开始 问题是,即使我的宏运行没有错误,它也不会将数据复制到第三个文件 我有以下代码: Sub Compare() Dim w1 As Worksheet, w2 As Worksheet, w3 As Worksheet

我试图创建一个宏,它比较两列,每列来自不同的文件,并将每个匹配项与其中一个文件中的一些附加单元格一起放入第三个文件

另外,在前两个文件中,对它们进行了一些编辑,因此它们包含实际数据的单元格从各自列的第4行和第2行开始,因此我使用了两个不同的变量,以便循环从这些单元格开始

问题是,即使我的宏运行没有错误,它也不会将数据复制到第三个文件

我有以下代码:

Sub Compare()
    Dim w1 As Worksheet, w2 As Worksheet, w3 As Worksheet
    Dim range1 As Range, range2 As Range

    Set w1 = Workbooks("Worksheet_Name1").Worksheets("Sheet1")
    Set w2 = Workbooks("Worksheet_Name2").Worksheets("Sheet2")
    Set w3 = Workbooks("Worksheet_Name3").Worksheets("Sheet3")

    Set range1 = w1.Range("E4", w1.Range("E" & Rows.Count).End(xlUp))
    Set range2 = w2.Range("A2", w2.Range("A" & Rows.Count).End(xlUp))

    For Each c In range2
        rangeVar2 = c
        If rangeVar2 > 3 Then
            For Each n In range1
                rangeVar1 = n
                If rangeVar > 2 Then
                    If w1.Cells(n, "E").Value = w2.Cells(c, "A").Value Then
                        w3.Cells(c, "A").Value = w1.Cells(c, "E").Value
                        w3.Cells(c, "B").Value = w2.Cells(c, "A").Value
                    End If
                End If
            Next n
        End If
    Next c
End Sub

好吧,我为你重新写了这篇文章,并改变了一些东西。这仍然可以修改一点,但至少现在应该可以

rangeVar1
rangeVar2
是完全冗余的,也会阻止代码运行(我认为)。不需要这些

Sub ReWrite()
Dim w1 As Worksheet, w2 As Worksheet, w3 As Worksheet

Set w1 = Workbooks("Worksheet_Name1").Worksheets("Sheet1")
Set w2 = Workbooks("Worksheet_Name2").Worksheets("Sheet2")
Set w3 = Workbooks("Worksheet_Name3").Worksheets("Sheet3")

Dim lastrow1 As Long, lastrow2 As Long, i As Long, j As Long

lastrow1 = w1.Cells(w1.Rows.Count, "E").End(xlUp).Row
lastrow2 = w2.Cells(w2.Rows.Count, "A").End(xlUp).Row

For i = 4 To lastrow1
    For j = 2 To lastrow2
        If w1.Range("E" & i).Value = w2.Range("A" & j).Value Then
            w3.Range("A" & j).Value = w1.Range("E" & i).Value
            w3.Range("B" & j).Value = w2.Range("A" & j).Value
            End If
    Next j
Next i

End Sub

虽然我更喜欢I=1的
For lastrow
循环,而不是遍历预设的范围,但我认为它的可读性更强一些。但是,我要说的是,代码的某些部分是冗余的-当您的范围是预先设置的时,为什么需要
rangeVar2
rangeVar1
?如果w1.Cells(n,“E”).Value=w2.Cells(c,“a”).Value比较值并手动检查:
MsgBox“Comparing”&w1.Cells(n,“E”).Value&“和”&w2.Cells(c,“a”).Value&“…”,则在上述
中添加一个MsgBox
现在,无论出于何种原因,我都会收到一个运行时错误“9”:下标超出范围,因为它找不到我要比较的工作簿。@otorinolaringologista man您是否将w1 w2 w3中的名称改回了实际名称?我以为你在这个例子中改变了它们是的,我把它们改回了正常状态。问题是我的一个WORSKEET没有打开,所以宏无法找到。所以没问题,我只是个傻瓜。我运行了你的代码,它没有显示错误,但也没有给我任何结果,工作表只是空出来,我想我会尝试将每个工作表的内容保存在不同的工作表中,看看他们是否真的在读东西。不管怎样,我都会给你分数,因为从技术上讲,代码运行正常。你是否在工作簿3上向下滚动并检查以确保下面没有数据?因为我注意到你的代码有一个问题,那就是它在工作簿3上打印的值与value
j
在同一行上,这可能是工作表上的yy。你在处理多少行?实际上有很多行。但我向下滚动,它没有任何包含数据的行或单元格。也许在这些工作表中没有匹配的案例,但无论如何我都必须检查它,或者创建一个带有匹配结果的测试表。