- ベストアンサー
マクロ Publicでの配列定義
Excelマクロで、Publicステートメントで配列を定義し、 プロシージャ内で配列要素を増やすことはできないのでしょうか? 下記ロジックで2つのMsbBoxが表示されるようにしたいです。 よろしくお願いします。 Public pubTMP Sub test() pubTMP(2,2)="aaa" test222 Msgbox pubTMP(2,2) Msgbox pubTMP(3,3) End Sub Sub test222() pubTMP(3,3)="bbb" End Sub
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
これは変数のスコープの問題ではありません。 一度DimまたはRedimで定義した配列は Redimで要素数を変更出来るのは最後尾にある次元の要素数だけです。 (Public pubTMP() の()付きで配列宣言しましょう) 上記の通り(2,2)から(3,3)へはRedim出来ません。 (2,2)から(2,3) 3次元配列だと(2,2,2)から(2,2,3)という具合です。 これらを踏まえると、必要なサイズ(1次元目の要素数)を何らかの方法で取得しておいて 初めのRedimで定義しましょう。2次元目の要素数は必要な時にRedimすれば良いでしょう。 i = 1次元目の必要なサイズ Redim pubTMP(i,2) 2次元目の要素数を一つ上げる時 ReDim Preserve pubTMP(i, Ubound(pubTMP, 2) + 1) どうしても1次元目を増やしたいんだ!という事であれば 配列に配列を格納するジャグ配列というものがあるので(使い方は難しいですけど) 興味があれば調べてみて下さい。うまくジャグ配列が使えればお望みの事は実現出来ます。
その他の回答 (2)
- MARU4812
- ベストアンサー率43% (196/452)
> この場合、test222の処理で「SubまたはFunctionが定義されていません」 > とエラーになってしまいます。 こちらの環境ではエラーにならないですけどね。。。 同じクラス内(Sheet1の中に全部書く)なら Private でも通ります。 標準モジュールに宣言してあっても通ります。 Sheet1に宣言してあって、Sheet2で使うのはエラーになります。
sub testでpubTMPの2次元配列を設定し直せば良いのではないでしょうか。 Public pubTMP(3, 3) As Stringにすれば上記のredimは不要ですが。 希望されてる方法で無い場合はご容赦下さい。 sub test() ReDim pubTMP(3, 3) As String pubTMP(2,2)="aaa" test222 Msgbox pubTMP(2,2) Msgbox pubTMP(3,3) End Sub
補足
ご回答ありがとうございます! この場合、test222の処理で「SubまたはFunctionが定義されていません」とエラーになってしまいます。 やはりPublicステートメントで定義しても、Subプロシージャ間での配列の共有はできないのでしょうか。 親プロシージャで"Dim pubTMP"と定義し、ByRefで子プロシージャに引数で渡し、"ReDim Preserve pubTMP(3,3)"と要素を増やしセットは可能なのですが、 親プロシージャで更に要素増"ReDim Preserve pubTMP(5,5)"することができません。 1つのプロシージャ内でしか要素を増やすことができないように感じています
お礼
ありがとうございます! 大変参考になりました。 incrで要素を定義するようにします!