1

シミュレーションへの入力が 1 つのシートのセルから取得される VB (Excel マクロ) でシミュレーターを作成しようとしています。入力は、timePerUser(10) や bytesPerUser(10) などの多数の配列に配置されます。次に、配列に基づいて計算を行う単純な if/for/while 処理がいくつかあり、最後に結果を Excel に書き戻します。そのため、Excel は入力データの提供と結果の表示にのみ使用され、配列内の値の変更を含め、他のすべてはマクロ内で行われます。

私はMatlabでの作業に慣れていますが、このシミュレーターには使用できません。そのため、ここに私の質問があります:

  1. Excel マクロ内で使用できる既存の行列/配列操作はありますか? たとえば、配列内の最小値または次に小さい値をチェックするコマンドはありますか? エクセルの関数「SMALL」があれば完璧なのですが、マクロではうまくいかないようです。それとも、単に for ループでこれを解決する必要がありますか?

  2. 配列を作成する方法について他に何か提案はありますか? 各行が時間、データ、ユーザーなどに対応する 1 つの大きな行列 (NxM 行列) を使用する方が良いですか、それともパラメーターごとに個別の配列を使用する方が良いですか?

  3. 行列/配列操作を高速化するには? 一般的な提案はありますか?

ありがとう!オスカー

4

1 に答える 1

4

Excel には単純な配列操作がいくつかあります - SUMPRODUCT (Matlab の同等物: A*B')、MIN、MAX、... SMALL を含むこれらのほとんどは、Application.WorksheetFunction.xxx;を使用して呼び出す必要があります。たとえば、関数 SMALL は VBA で次のように呼び出すことができます。

nthSmallest = Application.WorksheetFunction.Small(r, n)

ここで、r は配列または範囲であり、n は 1 ~ の整数です。r.Cells.Count

1 つの 2D 配列で複数のエンティティを賢く使おうとするのではなく、概念変数ごとに 1 つの変数を使用することを強くお勧めします。Speedwise の違いは小さいと思います。しかし、読めないコードを書く機会は重要です。

高速化に関しては、変数 (特に配列) を (Variant ではなく) 固定型として定義すると非常に役立ちます。たとえば、次のようになります。

Dim a(1 To 10) as Double
Dim ii as Integer

また、すべての配列で同じ (既定の) ベースを使用すると、少しは役立つ場合があります。私自身が Matlab ジャンキーなので、1 から始まる配列インデックスを使用することがよくあります。VBA でこれを強制するには、

Option Base 1

モジュールの最初に。この時点で宣言すると

Dim a(10) as Double

それは同等です

Dim a(1 To 10) as Double

また、VBA に習熟していない人にとっても良い習慣です。

Option Explicit

これは、宣言しなかった変数 (または、より頻繁にスペルを間違えた変数) がインタープリター エラーを生成することを保証するためです。

配列に関するもう 1 つのこと: Matlab のユーザーとして、必要に応じて配列のサイズを増やす Matlab に慣れています。VBA では、実行時に配列のサイズを動的に変更することができます。

ReDim Preserve a(1 To 20)

これにより、配列aのサイズは 20 要素になります。短い場合はゼロで埋められます。それより長い場合は、トリミングされます。これは便利ですが、多くの場合、配列全体を新しい場所にコピーする必要があるため、非常に高価です。配列の大きさが事前にわからない場合は、配列を大きくする必要があるたびに ReDim を行うよりも、過大評価 (および境界のチェック) を行う方ReDimが適切です。

始めるにはこれで十分だと思います!

于 2013-02-28T21:49:21.970 に答える