0

次のvbaコードを使用して、テキスト文字列の日付をExcelの実際の日付に変更し、論理的な比較などに使用できるようにしています。

問題は、これが約4000行で機能し、毎週更新する必要があることです。このコードは非常に低速です。

Sub Datechange()

Dim c As Range
    For Each c In Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)
        c.Value = CDate(c.Value)
    Next c

End Sub

同じことをもっと早くできる別の方法はありますか?非常に遅い理由の一部は、単一セルの選択とコードの繰り返し処理に関連するオーバーヘッドがあるためだと思いますが、他の方法でそれを行う方法がわかりませんか?

また、下部の行の一部には「指定なし」という単語が含まれており、コードがこれらのセルに到達すると、次のように壊れます。

実行時エラー「13」:タイプの不一致

次のコードを完了できるように、これを停止する方法はありますか?

4

2 に答える 2

6

最初のステップは次のとおりです。

  • 画面の更新をオフにする
  • 計算をオフにします
  • 範囲の読み取りと書き込みを一度に行う

以下のコードのように見える可能性があります-画面の更新をオフにしたり、計算モードを変更したりしてスプレッドシートを残さないように、エラーハンドラーを含めることをお勧めします。

Sub Datechange()

    On Error GoTo error_handler

    Dim initialMode As Long

    initialMode = Application.Calculation 'save calculation mode
    Application.Calculation = xlCalculationManual 'turn calculation to manual
    Application.ScreenUpdating = False 'turn off screen updating

    Dim data As Variant
    Dim i As Long

    'copy range to an array
    data = Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)

    For i = LBound(data, 1) To UBound(data, 1)
        'modify the array if the value looks like a date, else skip it
        If IsDate(data(i, 1)) Then data(i, 1) = CDate(data(i, 1))
    Next i

    'copy array back to range
    Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row) = data

exit_door:
    Application.ScreenUpdating = True 'turn screen updating on
    Application.Calculation = initialMode 'restore original calculation mode

    Exit Sub

error_handler:
    'if there is an error, let the user know
    MsgBox "Error encountered on line " & i + 1 & ": " & Err.Description
    Resume exit_door 'don't forget the exit door to restore the calculation mode
End Sub
于 2013-01-15T10:50:14.393 に答える
0

1つの「プル」で値を配列に取り込み、配列を操作して書き戻す方がよいでしょう。それは高価な範囲操作を回避するでしょう。

dim c as range
set c = Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)

dim ArrValue() as Variant

set ArrValue = c.value

次のステップ:その配列を繰り返し処理してから、書き戻します。

c.value = Arrvalue

コードをテストする時間がないので、自分で修正してください。申し訳ありません。

于 2013-01-15T10:41:39.647 に答える