3

OK、スタック オーバーフローの質問を書く 2 回目の試みです。

2年半かけて構築されたフランケンシュタインスタイルのExcelマクロを書き直しています(少しずつ追加されています)。私がしなければならないことの 1 つは、データの精度と速度のために、データを配列に 1 回だけロードすることです。私のスキルレベルでは、アレイ方法論に固執します。

私の2つのアプローチは次のとおりです。

  • グローバルで淡色表示された動的配列を使用する
  • Main プロシージャの動的配列を薄暗くし、呼び出されたプロシージャに渡します

では、スタック オーバーフローは、これら 2 つの方法の長所と短所についてどのように考えているのでしょうか? ありがとう、クレイグ...

4

2 に答える 2

9

まず、具体的には尋ねなかった質問に答えるために、カスタム クラスをセットアップし、その中にデータをロードします。真剣に、後で私に感謝します。

OK、あなたの質問に進みます。範囲をできるだけ限定することから始めます。つまり、プロシージャ間で変数を渡しています。すべての変数のスコープが可能な限り制限されている場合、問題に遭遇することはほとんどありません。

変数が 2 レベルの深さを通過すると (手順を第 1 層に、第 1 層から第 2 層に)、自分の構造を批判的に調べ始めます。通常 (常にではありません)、3 つのプロシージャがすべて同じモジュール内にある場合は、モジュール レベルの変数を作成します (Dim の代わりに Private キーワードを使用します)。モジュールを正しく (恣意的にではなく) 分離すれば、大きなリスクなしにモジュール レベルの変数を使用できます。

最初から常にグローバルな変数がいくつかあります。アプリ名とアプリのバージョンを保持する変数です。アプリが実行されている限りスコープを失うことのない最上位のクラス モジュール。コマンドバー名などを保持する定数(変数ではないことはわかっています)。私はこれらのグローバルが必要であることを知っているので、そのように開始します。

モジュール レベルの変数がグローバル変数に移行することは決してない、と言いたいところです。グローバル変数は、その性質上、そのように開始されます。モジュール レベルの変数を使用するのが面倒に思える場合、それはおそらく、正当な理由もなくモジュールを分割したか、フレームワーク全体を再考する必要があるためです。

だからと言って、不正行為をしてグローバルを使用すべきでないときに使用したことがないと言っているわけではありません。私たちは皆それをやったので、あなたもやったとしても睡眠を失うべきではありません.

したがって、この投稿を適切に締めくくるには、強制されない限り、配列の使用をやめます。カスタムクラスを使用する理由

ActiveCell.Value = Invoice.LocalSalesTaxAmount

よりもデバッグする方がはるかに優れています

ActiveCell.Value = aInvoice(35,2)

カスタム クラスを操作するには、さらにスキルが必要だと思われる場合に備えて、私もそうしました。

于 2010-02-03T02:11:36.230 に答える
2

Excel VBA のグローバルには注意が必要です。アプリケーションが何らかのバグに遭遇し、何らかのソフト リセットを実行すると (ただし、アプリは引き続き機能します)、グローバルが消去されてしまうからです。

私は完璧なアプリを書いていないので、グローバルをあきらめなければなりませんでした。

于 2010-02-02T23:59:25.080 に答える