2011-07-01 6 views
0

この質問は2つの部分です。最初は、迅速かつ簡単なコードがあるかどうかを確認して、現在のサブに組み込んで、サブがどれくらい速く実行するかを確認することができます。私はちょうど秒まで、そしておそらく数分の精度が必要です。VBA:プログラムの最適化

第2は、現在サブの実行時間を最適化しようとしています。これは、ユーザーが検索するために選択する変数を指定し、次のワークシートに結果を表示する検索機能です。私はネットサーフィンと私は可能 な限りクリップボードに私のサブ

  • 回避コピー&ペーストの冒頭で私のプログラム

    1. 無効画面の更新をスピードアップするために、以下の一般的なアプリケーションをやりました

    しかし、私のプログラムは、ユーザーが検索を実行するたびに5〜10秒かかります。この時間をできるだけ減らしたいと思います。

    私のコードを見ることなく、具体的な提案は難しいと思いますが、現在は一般的な提案を探しています。一般原則が実装されてもまだ遅い場合は、私のコードをここに掲載します。

    私の検索プログラムは線形検索プログラムであり、値を配列に格納します。私の検索機能は最大4つの検索変数を収容することができます。各検索を配列に格納し、最終結果配列に配列を統合します。

  • +0

    検索はどのように実装されていますか?リニア?バイナリ?キャッシング/ルックアップテーブルや他の最適化を使用していますか? – Jacob

    +1

    場合によっては、Excelの隠しシートにデータを書き込んで[Auto Filter](http://office.microsoft.com/en-us/excel-help/filter-by-using-advanced-criteria-HP005200178)を使用する方が高速になることがあります.aspx)をワイルドカード基準で検索します。 – osknows

    +0

    私はルックアップテーブルを使用していませんし、Cularisをキャッシュすることが何を意味するのか分かりません。私はVBAの初心者ですので、私はまだ勉強しています。 –

    答えて

    0

    私は一般にGetTickCount API関数を使用します。あなたが数週間または数ヶ月以上の時間を測定しようとしていない限り、正確でなければなりません。以下は、異なるループ測定が時間通りに行われていることを示す例です。 1 tick = 1ms

    Private Declare Function GetTickCount Lib "kernel32"() As Long 
    
    Sub test() 
    Dim nTime 
    
    nTime = GetTickCount 
    Set load_array = Range("a5:z65000") 
    array_index = WorksheetFunction.Match("Test 15", WorksheetFunction.Index(load_array, 0, 1), 0) 
    
    rngtimer = GetTickCount - nTime 
    
    
    nTime = GetTickCount 
    load_array = Range("a5:z65000").Value 
    array_index = WorksheetFunction.Match("Test 15", WorksheetFunction.Index(load_array, 0, 1), 0) 
    
    arraytimer = GetTickCount - nTime 
    
    
    nTime = GetTickCount 
    load_array = Range("a5:z65000").Value 
    For a = LBound(load_array) To UBound(load_array) 
    If load_array(a, 1) = "Test 15" Then 
    array_index = a 
    End If 
    Next 
    
    arraylooptimer = GetTickCount - nTime 
    
    nTime = GetTickCount 
    
    For a = 1 To 65000 
    If Range("a5").Offset(a, 0) = "Test 15" Then 
    array_index = a 
    End If 
    Next 
    
    excelooptimer = GetTickCount - nTime 
    
    MsgBox ("Range Search: " & rngtimer & vbCrLf & _ 
    "Array Search: " & arraytimer & vbCrLf & _ 
    "ArrayLoop Search: " & arraylooptimer & vbCrLf & _ 
    "ExcelLoop Search: " & excelooptimer) 
    End Sub