0

これは、このコードを記述する効果的な方法ではないためですか、それともこのように Excel で作業するのが遅いためですか? Windows 8 64 ビットで Excel 2007 を使用しています。私のオフィスのノートブックは、最新の I5 CPU を搭載した最新のものです。コードは次のとおりです。

Private Sub CommandButton1_Click()

Sheets("data").Select


For rcounter = 2 To 45752

For xcounter = 26 To 50
For ycounter = 2 To 414

If (Cells(1, xcounter) = Cells(rcounter, 4)) Then
If (CInt(Cells(ycounter, 25)) = CInt(Cells(rcounter, 10))) Then

Cells(ycounter, xcounter).Value = Cells(ycounter, xcounter).Value + 1


End If
End If

Next ycounter
Next xcounter

Next rcounter


End Sub
4

3 に答える 3

2

問題はネストされたループです。これは分解できます。

最初のループは 45,751 回実行されます。

最初のループが実行されるたびに、2 番目のループが 25 回実行され、2 番目のループが 1,143,775 回実行されます。

2 番目のループが実行されるたびに、3 番目のループが 413 回実行されます。3 番目のループは、合計で 472,379,075 回実行されます。

このスクリプトで何を達成しようとしているのかわかりませんが、あまり効率的ではありません。

于 2013-10-24T02:17:57.590 に答える
2

ここで説明したように、Excel-VBA の計算パフォーマンスを向上させるための最も重要な手順は、セルごとに参照するのではなく、範囲配列のコピーを使用することです。

あなたの例でこれを行う方法は次のとおりです。

Private Sub CommandButton1_Click()

Sheets("data").Select

Dim cels() as Variant
cels = Range("A1", "AA45752")

For rcounter = 2 To 45752

    For xcounter = 26 To 50
        For ycounter = 2 To 414

            If (cels(1, xcounter) = cels(rcounter, 4)) Then
                If (CInt(cels(ycounter, 25)) = CInt(cels(rcounter, 10))) Then

                    cels(ycounter, xcounter).Value = cels(ycounter, xcounter).Value + 1

                End If
            End If

        Next ycounter
    Next xcounter

Next rcounter

Range("A1", "AA45752") = cels

End Sub

これははるかに高速です。もちろん、まだ(45752-1)*(50-25)*(414-1)472,379,075 回ループしているため、まだ時間がかかる場合があります。これらすべてのセルを複数回チェックする必要があるかどうかを検討する必要がある場合があります。

于 2013-10-24T02:46:25.230 に答える
1

これが状況の改善に役立つかどうかはわかりません。次の行を移動してみてください

If (Cells(1, xcounter) = Cells(rcounter, 4)) Then

For ycounter = 2 To 414

不要な比較を減らす

于 2013-10-24T02:21:27.470 に答える