2

私は次のコードを持っており、必要なことを正確に実行しますが、ループの実行には時間がかかりすぎます (3 分以上)。私は VBA を初めて使用するので、1) 最適な代替手段は何か、2) その代替手段に適切な構文を使用してコードを問題なく実行する方法が正確にはわかりません。ありがとう!

Dim i As Integer
For i = 2 To 13000

If Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police" 
    And Sheets("Sheet1").Range(Cells(i, 14), Cells(i, 14)) = "Bi-wkly Uniform Pay" Then _
Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police - Uniform"

Next i
4

3 に答える 3

1

ループ内のシートへのアクセスは非常に遅くなります。より良いアプローチは、データを配列のVariant, 配列ループにコピーしてから、結果をシートにコピーして戻すことです。

このようなもの:

Sub Demo()
    Dim i As Long
    Dim datCol3 As Variant
    Dim datCol14 As Variant

    With Sheets("Sheet1")
        ' Copy data into a Variant Array
        datCol3 = .Range(.Cells(1, 3), .Cells(13000, 3)).Formula
        datCol14 = .Range(.Cells(1, 14), .Cells(13000, 14)).Value
        ' Loop over the array
        For i = 2 To 13000
            If datCol3(i, 1) = "Police" And datCol14(i, 1) = "Bi-wkly Uniform Pay" Then
                datCol3(i, 1) = "Police - Uniform"
            End If
        Next
        'Return the results to the sheet
        .Range(.Cells(1, 3), .Cells(13000, 3)).Formula = datCol3
    End With
End Sub
于 2012-11-16T20:32:40.457 に答える
0

これは最良の答えではないかもしれませんが、ローカル変数を設定してみてください

Var sht1 = Sheets("Sheet1") は、シート オブジェクトの選択をわずかに減らす可能性があります。また、(i、3)を使用して範囲とセルを選択する必要はありません。これは、単一のセルの範囲であるため、組み合わせると次のようになります

 If sht1.Range.Cells(i,3) = "Police" And sht1.Range.Cells(i,14) = "Bi-wkly Uniform Pay" Then sh1.Range.Cells(i,3) = "Police Uniform" 
Next i

それが機能せず、別の列 (列 O または 15 など) に配置できる場合は、数式を使用してからドラッグ/ダブルクリックするか、同様に列全体で配列数式を使用して、次に、ctrl + shift + enter を押して、配列数式として計算します。

これが少しでも役立つことを願っています。

于 2012-11-16T20:17:16.787 に答える
0

提案 1

交換:

If Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police" 
    And Sheets("Sheet1").Range(Cells(i, 14), Cells(i, 14)) = "Bi-wkly Uniform Pay" Then _
  Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police - Uniform"

に:

With Sheets("Sheet1")
  If .Range(Cells(i, 3), Cells(i, 3)) = "Police" _
      And .Range(Cells(i, 14), Cells(i, 14)) = "Bi-wkly Uniform Pay" Then _
    .Range(Cells(i, 3), Cells(i, 3)) = "Police - Uniform"
End With

提案 2

交換:

.Range(Cells(i, 3), Cells(i, 3))

.Cells(i, 3)

提案 3

追加:

Application.ScreenUpdating = False

このステートメントがないと、変更のたびに画面が再描画されます。それは何よりも時間を食いつぶします。

于 2012-11-16T20:29:56.310 に答える