各ループを10×10でネストすると、1000以上のループになります。

各ループを10×10でネストすると、1000以上のループになります。

私はこの問題に本当に驚いています。ネストされた for-next ループがあり、1,000 を超えるループが発生します。このコードを見るとこれがわかります。

'find row ranges for department 1-10
    For i = 1 To 10 Step 1
        Dim tempRange As Range
        Set tempRange = GetRowRange(importsheet, DepColumn, i)
        'and iterate through the columns to insert them
        ' find row ranges for section
        If Not (importsheet.UsedRange.Find("afdeling_" & i) Is Nothing) Then
            Dim SecColumn
            Dim secRange As Range
            SecColumn = importsheet.UsedRange.Find("afdeling_" & i).column
            Set bCell = tempRange.Columns(SecColumn)
            tempRange.Sort Key1:=bCell, Order1:=xlAscending, Header:=xlYes
            For ix = 1 To 10 Step 1
                'check for a valid section column
                Set secRange = GetRowRange(tempRange, SecColumn, ix)
                totalposts = totalposts + IterateColumns(secRange, spgsheet, importsheet, debugsheet, year, month, week, Hospital, i, ix, varType, False)
                Progress
            Next ix
        Else
        totalposts = totalposts + IterateColumns(tempRange, spgsheet, importsheet, debugsheet, year, month, week, Hospital, i, 0, varType, False)
        End If
        Progress
    Next i

私の進捗関数は次のようになります:

Function Progress()
iProgress = iProgress + 1
Application.StatusBar = Format(iProgress, "0%") & " Completed"
End Function

ただし、プログレスバーには 3300% まで表示されることがよくあります。

どうしてそんなことが可能なのでしょうか?

答え1

コード全体が表示されていません。たとえば、これはiProgressグローバルに定義されていると思いますが、ここではそれがわかりません。

また、なぜDIMループ内でステートメントを実行するのでしょうか? ステートメントは 1 回だけ実行し、nothing終了したらオブジェクト変数を設定する必要があります。これを行わないと、途中で厄介なメモリの問題が発生する可能性があります。

具体的な質問に答えます。iProgress% ではなくカウンターに設定しました。

% を取得するには、進行状況バーを開始する前に、反復処理するアイテムの数を知る必要があります。次に、現在のアイテム カウンターと合計が必要になります。これによりCurrentCount/TotalItemCount進行状況がわかります。

関連情報