以下のコードを実行するたびに、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のメモリに関連していると思うが、限界を知らずに、私はそれをコードし、何をしたいのかわからない...
実際にクラッシュするか、「応答しない」と表示されますか? – Moacir
「応答していません」と表示されます。エラーメッセージなど何もありません。私はそれが再び応答を開始するかどうかを確認するために1時間実行させようとしましたが、それはしませんでした。 – user2997154
'For Each rw In ws2.Rows'の後、次の行に' DoEvents'を挿入します。応答しなくなると、これは優れた性能を発揮します。しかし、計算が遅くなります。あなたが入力をしたり、別のシートを使用しようとすると、あなたのコードに望ましくない影響が出る可能性があります。 – Moacir