1

私はExcelでVBAを使用して、ロイター3000データベースからいくつかの情報を取得しています。私が取得するデータは、日付を保持する1つの列と、数値を保持する他の列で構成される2次元配列として提供されます。

2秒以内のプロセスで情報を取得した後、このデータをワークシートに書き込みたいと思います。ワークシートには、日付の列と数値の列がいくつかあり、各列には同じカテゴリの値が含まれています。配列の行を繰り返して日付と数値を取得し、それらを変数に保持します。次に、ワークシートの日付列で日付を検索し、日付を見つけたら値を書き込みます。これが私のコードです:

Private Sub writeRetrievedData(retrievedData As Variant, dateColumnRange As String, columnOffset As Integer)

Dim element As Long: Dim startElement As Long: Dim endElement As Long
Dim instrumentDate As Variant: Dim instrumentValue As Variant
Dim c As Variant: Dim dateCellAddress As Variant

Application.ScreenUpdating = False    
Sheets("Data").Activate
startElement = LBound(retrievedData, 1): endElement = UBound(retrievedData, 1)
Application.DisplayStatusBar = True
Application.StatusBar = "Busy writing data to worksheet"

For element = startElement To endElement
    instrumentDate = retrievedData(element, 1): instrumentValue = retrievedData(element, 2)
    Range(dateColumnRange).Select
    Set c = Selection.Find(What:=instrumentDate, After:=ActiveCell, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)
    If Not c Is Nothing Then
        c.offset(0, columnOffset).Value = instrumentValue            
    End If
Next element

Application.DisplayStatusBar = False

End Sub

私の問題は、このプロセスが非常に遅いことです。配列に5行しかない場合でも、タスクを完了するのに約15秒かかります。このプロセスを数回(データベースから取得するデータのセットごとに1回)繰り返したいので、実行時間をできるだけ短縮したいと思います。

ご覧のとおり、パフォーマンスを向上させるための最も頻繁なアクションの1つである、画面の更新を無効にしています。実行時間をさらに短縮する方法について誰か提案がありますか?

PS。私はすでにその部分をテストしているので、データ取得プロセスにそれほど時間がかからないことを知っています(データが取得されるとすぐにMsgBoxに値を表示します)

よろしくお願いします。

4

2 に答える 2

6

これは、パフォーマンスを向上させるために私が行ったことです。

  • 値を書き込むときにセルを選択しないでください。これはティム・ウィリアムズの提案でした。
  • プロパティApplication.CalculationをxlCalculationManualに設定しました
  • Find()関数を使用して日付を検索する代わりに、ワークシートからすべての日付を配列にロードし、この配列を反復処理して行番号を取得しました。これは、Find()関数よりも高速であることがわかります。

    Private Function loadDateArray() As Variant
    
        Dim Date_Arr() As Variant
    
        Sheets("Data").Activate
        Date_Arr = Range(Cells(3, 106), Cells(3, 106).End(xlDown))
        loadDateArray = Date_Arr
    
    End Function
    
    Private Function getDateRow(dateArray As Variant, dateToLook As Variant)
    
        Dim i As Double: Dim dateRow As Double
    
        For i = LBound(dateArray, 1) To UBound(dateArray, 1)
            If dateArray(i, 1) = dateToLook Then
                dateRow = i
                Exit For
            End If
        Next i
    
        getDateRow = dateRow
    
    End Function
    

よろしくお願いします!

于 2012-11-29T16:11:13.967 に答える
1

シートを選択しないことで、もう少しスピードを上げることができます。それ以外の

Sheets("Data").Activate
Date_Arr = Range(Cells(3, 106), Cells(3, 106).End(xlDown))
loadDateArray = Date_Arr

試す

With Sheets("Data")
Date_Arr = .Range(Cells(3, 106), Cells(3, 106).End(xlDown))
End With
于 2013-03-28T20:37:09.830 に答える