Excel VBA在比较不同工作表中的两列时崩溃

Excel VBA在比较不同工作表中的两列时崩溃,vba,excel,Vba,Excel,我有这个问题,我想比较一个工作表中的两列和另一个工作表中的两列,如果是真的,用数据填充另一列。 我写了一些代码,但它只工作到47行。我不知道这个问题。Excel没有响应。这是我的密码。也许有人能解释一下我做错了什么 Sub Compare() Dim i, j As Integer For i = 2 To 2175 For j = 2 To 3834 If (ActiveWorkbook.Worksheets("Ar

我有这个问题,我想比较一个工作表中的两列和另一个工作表中的两列,如果是真的,用数据填充另一列。 我写了一些代码,但它只工作到47行。我不知道这个问题。Excel没有响应。这是我的密码。也许有人能解释一下我做错了什么

  Sub Compare()
      Dim i, j As Integer
      For i = 2 To 2175
          For j = 2 To 3834

              If (ActiveWorkbook.Worksheets("Arkusz2").Range("B" & i) = ActiveWorkbook.Worksheets("Arkusz3").Range("A" & j) _
              And ActiveWorkbook.Worksheets("Arkusz2").Range("C" & i) = ActiveWorkbook.Worksheets("Arkusz3").Range("B" & j)) _
              Then ActiveWorkbook.Worksheets("Arkusz2").Range("E" & i).Value = ActiveWorkbook.Worksheets("Arkusz3").Range("C" & j).Value

          Next j
      Next i

End Sub

试试这个。我在下面更改的行中添加了注释

Sub Compare()
    Dim i as Integer, j As Integer
    ' You need to specify the value type for *all* variables

    Dim ws1 as Worksheet, ws2 as Worksheet

    Set ws1 = ActiveWorkbook.Worksheets("Arkusz2")
    Set ws2 = ActiveWorkbook.Worksheets("Arkusz3")
    ' Setting these as their own variables makes the code far more readable

   For i = 2 To 2175
       For j = 2 To 3834

           If (ws1.Range("B" & i).Value = ws2.Range("A" & j).Value _
              And ws1.Range("C" & i).Value = ws2.Range("B" & j).Value) Then 
              ' Make sure you are comparing the VALUES and not the range objects

              ws1.Range("E" & i).Value = ws2.Range("C" & j).Value

              Exit For    
              ' If we've found a match, exit the inner loop early (if it *would* find 
              ' another match, the orig. value would just be overwritten, anyways) 
              ' This will likely reduce the time to complete significantly
            End If

        Next j
     Next i

End Sub


编辑:为添加了退出,以便在找到匹配项后尽早退出内部循环。感谢您的建议。

小注释-当您说“Dim i,j为整数”时,Excel不承认i是整数,因此默认为包含不同类型数据的通用变量类型。你基本上说了“Dim i作为变量,Dim j作为整数”。您必须是显式的,并说“Dim i为整数,J为整数”。另外-请注意我是如何重新格式化您的代码的,以更清楚地显示For语句的逻辑布局-以前,很难立即判断下一个j/Next I是否关闭了那些For循环。我想您应该在它完成之前给出它。除了花很长时间来完成这个过程之外,我看不出它崩溃的原因。看看如何优化。我建议添加类似
的内容,如果I Mod 100=0,则调试。将I
打印到外部循环。这将在即时窗口中提供一些进度反馈(即8个循环!)@Andre:关于将循环计数器添加到外部循环的好建议。几乎可以肯定的是,与他们使用的嵌套
For
循环相比,有一种更快、更有效的方法可以做到这一点。。。但是,如果不更好地了解他们实际使用的数据以及他们最终试图实现的目标,就很难提出任何替代方法。您正在比较2173*3832=8'326'936个数据单元。。。。难怪这会压碎。。。听说过office cache吗?有时可能会耗尽…
在找到匹配项后退出内部循环中的
:无需处理以下j值。。。