【问题标题】:Excel Macro doesn't copy contents of rowsExcel 宏不会复制行的内容
【发布时间】:2017-09-26 14:25:51
【问题描述】:

我正在尝试创建一个宏来比较 2 列,每一列来自不同的文件,并将每个匹配项连同其中一个文件中的一些其他单元格一起放入第三个文件中。

另外,在前 2 个文件中对它们进行了一些编辑,因此它们的单元格具有实际数据,从各自列的第 4 行和第 2 行开始,所以我使用了 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

【问题讨论】:

  • 代码对我来说看起来不错,虽然我更喜欢 For i = 1 to lastrow 循环而不是遍历预设范围,但我认为它提供了更多的可读性。但是,我会说,您的代码的某些部分是多余的 - 当您的范围已预设时,为什么需要 rangeVar2rangeVar1?那些不会总是评估为True
  • If w1.Cells(n, "E").Value = w2.Cells(c, "A").Value上方添加一个MsgBox,用于比较值并手动检查:MsgBox "Comparing " & w1.Cells(n, "E").Value & " and " & w2.Cells(c, "A").Value & "..."

标签: vba excel


【解决方案1】:

好的,我为您重新编写了这篇文章并更改了一些内容。这仍然可以稍作修改,但至少现在应该工作

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

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

【讨论】:

  • 现在无论出于何种原因,我都收到运行时错误“9”:下标超出范围,因为它找不到我想要比较的工作簿。
  • @Otorrinolaringologista-man 您是否将 w1 w2 w3 中的名称改回原来的名称?我假设你在这个例子中改变了它们
  • 是的,我把它们改回了正常状态。问题是我的一个工作盘没有打开,所以无法找到宏。所以没问题,只是我是个假人。我运行了您的代码,它没有显示错误,但也没有给我任何结果,工作表只是空的,我想我会尝试将每个工作表内容保存在不同的工作表中,看看它们是否是实际上在阅读一些东西。无论如何我都会给你分数,因为从技术上讲,代码运行正常。
  • 您是否向下滚动工作簿 3 并检查以确保那里没有数据?因为我注意到您的代码的一个问题是它在工作簿 3 上与值 j 在同一行打印值,这可能会在工作表上有所下降。您正在处理多少行?
  • 实际上有很多行。但我向下滚动,它没有任何包含数据的行或单元格。也许这些工作表中没有匹配的案例,但无论如何我都必须检查它或创建一个具有匹配结果的测试表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多