1. ホーム
  2. vba

[解決済み] Redimを使用して配列のデータ型を設定する

2022-02-09 11:30:49

質問

最初に配列を作成するとき、データ型を設定するのが一番良いのは分かっていますが、デフォルトの Variant は遅いので、VBAでは避けた方がよいでしょう。

ということに気づきます。

Redim t(1 To 10) As String

と同じ効果があるように見えます。

Dim t() As String
Redim t(1 To 10)

が、どうなんだろう。最初のオプションは、最初にキャストするのだろうか。 t() として Variant に変換した後 String とか、二重書き込みでメモリを浪費? それとも、2行のため、2番目のオプションの方が実際に遅いのでしょうか?メモリ上で実際に起こるのは Dim は、サイズを指定せずに配列を作成できますか?

もちろん

Dim t(1 To 10) As String

は最も効率的であるように見えますが、私は Redim Preserve というのは、どうせ後で使うのだから、そんなことはできない。

解決方法は?

<ブロッククオート

を実行すると、メモリ上で実際に何が起こるのでしょうか? Dim は、サイズを指定せずに配列を作成できますか?

uninitializedを取得します。 動的なサイズの配列 : VBAはメモリに場所を確保します。P-Codeをリバースエンジニアリングしない限り(そもそもコンパイルされたP-Codeを抽出できると仮定して)、それがどのように機能するかはMicrosoftだけが知っている内部配管なのです。

両方 DimReDim は宣言文として機能します。 べきである - から MSDN (強調)。

<ブロッククオート

ReDim文は、それが宣言する変数がモジュールレベルやプロシージャレベルに存在しない場合、宣言文として機能します。同じ名前の別の変数が後から作られた場合、たとえOption Explicitが有効であっても、ReDimは後の変数を参照し、必ずしもコンパイルエラーを引き起こさない。このような衝突を避けるために ReDimは宣言文としてではなく、単に配列の寸法を変更するために使用すべきです。 .


と言われたとき。

それとも、2番目の選択肢の方が2行ある分、実は遅いのでしょうか。

を忘れていませんか? Dim は実行可能なステートメントではありません(ブレイクすることはできません)。 Dim ステートメント)。 ReDim がありますが。ですから、両方の "options" は、ランタイムに関する限り、最初のもの (quot;option")を除いて、本質的に同じです。 ReDim を宣言文として使用することは、ベストプラクティスに反しています。

したがって、動的配列が必要な場合は、動的配列を Dim :

Dim foo() As String

そして、サイズを変更する必要があるときは ReDim を実行します。

ReDim foo(1 To bar)


経験則から言うと、以下のようなことは気にする必要はないでしょう。 Dim よりも効率的です。 ReDim もし、あなたのコードにパフォーマンスの問題がある場合、99.99999997%の確率で、問題はあなたのアルゴリズムにあり、VBAが変数や配列の割り当てをどのように実装したかにあるわけではありません。