0

会計期間に基づいて開始日と完了日を入力するマクロがあります。例: 製品 X は 1 月 12 日から 12 月 12 日に販売されます。マクロは、vlookup/min 配列を使用して開始点を見つけ、vlookup/max 配列を使用して終了点を見つけます。日付は YYYYMM 形式であるため、vlookup は、対応する YYYYMM を開始日または終了日にマップするカレンダー タブを参照しています。コーディングは正常に機能しますが、場合によっては 30,000 ~ 100,000 行あり、実行に 15 ~ 20 分かかることがあります。これをより速く実行する方法について誰かアイデアがありますか?

コードは次のとおりです。

Cells(Rcnt, 5).FormulaArray = "=VLOOKUP(MIN(IF('Normalized'!A:A= " & Cells(Rcnt, 1).Address(False, False) & ", 'Normalized'!J:J )),'カレンダー'!A:C,2,FALSE)"

どんな助けでも大歓迎です。

4

2 に答える 2

0

マクロで数式を使用しないでください。VBA でコードを自分で記述すれば、コードを大幅に高速化できる可能性があります。行内のすべての値をループして、最小値と最大値を保存できます (最大値と最小値を保持できるため、ループは 1 回だけで済みます)。次に、これらの値を適切な場所に書き込みます。これは、Excel の数式よりも高速化されているはずです。

VBA でマクロを書き始めるには、ここを参照してください。具体的には、セルをループする方法を確認する必要があります。max = Jan 1 および min = Dec 31 に設定し、現在調べている値が max より大きい場合は、max を値に等しく設定し、min についても同様に設定します。その行をループすると、その行に最大値と最小値が表示されます。次に、これらの値を他の列に書き込み、最大値と最小値をリセットして、次の行に移動できます。

于 2012-10-24T00:41:55.587 に答える
0

あなたの問題についての私の理解では、あなたのデータは各月の各製品の売上をリストしているため、各製品について最初と最後の月を検索しています。データを製品別、日付別に並べ替えることはできますか? Emschorsch が説明したように、ループを実装する最も簡単な方法は、一度に 1 つの製品しか扱わないためです。

これをスピードアップするための他のいくつかのこと:

  • コードの最初の行を次のように設定します。

    Application.Calculation = xlCalculationManual
    

    そしてあなたの最後の行へ:

    Application.Calculation = xlCalculationAutomatic
    

    (まだ大量のルックアップがありますが、各行の数式を作成するときに一度に 1 つずつではなく、一度にすべて計算されます)

  • データの並べ替えがうまくいかない場合は、各製品を連続してオートフィルターし、日付列を参照して SUBTOTAL() 関数を使用して、最小値と最大値を取得できます。(未使用のセルに SUBTOTAL() 式を配置してコード内でそのセルを参照するか、Application.WorksheetFunction を使用してコード内で直接使用できます)

不要と思われる他の部分 (データを確認しないと確認できない) は、ルックアップを使用して YYYYMM を日付に変換することです。それが本当にすべての日付の形式である場合です。これは、VBA を使用せずに簡単に実行できます。 DATE() 式、またはマクロ内で必要な場合:

cells(Rcnt, 5).Value = DateSerial(Left(x, 4), Right(x, 2), 1)  'x is your date in YYYYMM format
于 2012-10-24T03:10:39.163 に答える