2017-09-05 14 views
-2

以下のコードを実行するたびに、ExcelとVBAがフリーズし、数秒後にクラッシュします。私はなぜそれを理解しようとしており、それを修正しようとしています。関連コードは以下のとおりです。次のVBAコードを実行するとExcelがなぜクラッシュするのですか?

  Dim ws As Worksheet, ws2 As Worksheet 
      Dim i As Long, j As Long 
      Application.ScreenUpdating = False 
      Application.Calculation = xlCalculationManual 
      Application.EnableEvents = False 
      Set ws = ThisWorkbook.Sheets("SomeSheet") 
      Set ws2 = ThisWorkbook.Sheets("SomeSheet2") 

      i = 2 
      j = 4 
      For Each rw In ws2.Rows 

        While Not IsEmpty(ws2.Cells(1, j)) 
         ws2.Cells(i, j).Value = (Application.WorksheetFunction.SumIfs(ws.Range("P:P"), ws.Range("A:A"), "=" & ws2.Cells(i, 1).Value, ws.Range("C:C"), "=" & ws2.Cells(i, 2), ws.Range("E:E"), "=" & ws2.Cells(i, 3), ws.Range("J:J"), "=" & ws2.Cells(1, j)))/8 
         Debug.Print i 
         Debug.Print j 
         j = j + 1 
        Wend 
        j = 4 
        i = i + 1 
      Next rw 

「SomeSheet」は約50k行のデータシートです。 "SomeSheet2"は、 "SomeSheet2"の行と列に基づいて、 "SomeSheet"内のデータからのsumifs結果がプログラムで埋められたテーブルです。コードは3行目と25列目(i = 3、j = 25)の後で凍結してから完全にクラッシュします。それは同じ正確な場所では決してない。これは問題がデータではないと私に思い出させます。私はこの問題は、 "SUMIFS" コールに関係するかもしれないと思ったが、私はこの行を交換する場合:

ws2.Cells(i, j).Value = 1 

ws2.Cells(i, j).Value = (Application.WorksheetFunction.SumIfs(ws.Range("P:P"), ws.Range("A:A"), "=" & ws2.Cells(i, 1).Value, ws.Range("C:C"), "=" & ws2.Cells(i, 2), ws.Range("E:E"), "=" & ws2.Cells(i, 3), ws.Range("J:J"), "=" & ws2.Cells(1, j)))/8 

をそれはまだ(I =〜50、J =〜が、後にクラッシュします60)。私はそれが何とかいっぱいになっているExcelのメモリに関連していると思うが、限界を知らずに、私はそれをコードし、何をしたいのかわからない...

+1

実際にクラッシュするか、「応答しない」と表示されますか? – Moacir

+0

「応答していません」と表示されます。エラーメッセージなど何もありません。私はそれが再び応答を開始するかどうかを確認するために1時間実行させようとしましたが、それはしませんでした。 – user2997154

+1

'For Each rw In ws2.Rows'の後、次の行に' DoEvents'を挿入します。応答しなくなると、これは優れた性能を発揮します。しかし、計算が遅くなります。あなたが入力をしたり、別のシートを使用しようとすると、あなたのコードに望ましくない影響が出る可能性があります。 – Moacir

答えて

1

何が起こっているかは、多くのデータを扱うことができます。時間がかかるので、のように見えますが、実際には動作しています。それは最終的に解凍されます。

しかし、DoEventsを追加することができます。コードがこれを実行するたびに、それはあなたにExcelのバックコントロールを与え、再び機能させます。

しかし、コントロールが戻ってくるので、誤って1つのセルにデータを入力するとコードが停止することがあります。このような場合は、やり直す必要があります。

また、これによりコードの実行が遅くなります。それはすでに取っているよりも時間がかかる。

関連する問題