0

プログラムがフリーズする原因となっている Excel VBA サブルーチンを作成しました。問題をサブ内の Do-Until ループに切り分けました。

最初に少し背景情報を示します。

マージする必要がある 2 つのシートがあります。マージ後、一部の行には重複データが含まれます。重複する行は、列 D に同じ値を持ちます。

Do-Until ループは、各行の列 D の値を下の行の値と比較します。値が同じ場合、その行は削除されます。また、列 A で特別な行番号式を使用しているため、削除があるたびに、削除によって式内の参照が台無しになるため、サブは現在の行から下の行に式をコピーします。ループは、空の行に到達するまで続きます。

現在、シートには 500 行近くあるので、大量のデータですが、それほど多くはありませんよね? サブは Office 2003 で作成され、xls ファイルにあります。現在 Office 2010 を実行しており、互換モードでファイルを操作しています。

とにかく、以下のループのコードをコピーしました。ループが原因でプログラムがフリーズする理由を知っている人はいますか? 前もって感謝します。

Do Until IsEmpty(ActiveCell)

' Define rows and cells
  Row1 = ActiveCell.row()
  RowPlus1 = ActiveCell.row() + 1
  RowMinus1 = ActiveCell.row() - 1

  Row1Student = "D" & Row1
  RowPlus1Student = "D" & RowPlus1

  Row1Number = "A" & Row1
  RowMinus1Number = "A" & RowMinus1

  If Val(Range(Row1Student)) = Val(Range(RowPlus1Student)) Then
    ActiveCell.EntireRow.Select
    Selection.Delete Shift:=xlUp
    Range(RowMinus1Number).Select
    Selection.Copy
    Range(Row1Number).Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    ActiveCell.Offset(-1, 0).Select
  End If

  ActiveCell.Offset(1, 0).Select

Loop

PS: 私は決してプロのプログラマーではありません。私は独学で VBA を学んだので、自分のコードがきれいではない可能性があることは十分承知しています。そのため、実際に VBA のトレーニングを受けた人からのフィードバックを期待しています。

編集して追加: わかりました、ループのコピー アンド ペースト部分を削除したところ、かなりスピードアップしたようです。それで、サブの特定の部分が問題を引き起こしている理由を誰か知っていますか?

4

1 に答える 1

5

IsEmpty(ActiveCell) が true を返さないため、頭のてっぺんから (テストなしで)、最終行に到達して無限にループしているように見えます。

(最後の行を選択すると、それ以降の行は削除できませんが、現在の ActiveCell 以外に移動する場所がありません。)

@HeadofCateringが言うように、データのサンプルを小さくしてコードをステップ実行すると、それが見つかります

于 2012-06-02T08:17:13.730 に答える