プロが教えるわが家の防犯対策術!

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

A 回答 (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次元目を増やしたいんだ!という事であれば
配列に配列を格納するジャグ配列というものがあるので(使い方は難しいですけど)
興味があれば調べてみて下さい。うまくジャグ配列が使えればお望みの事は実現出来ます。
    • good
    • 0
この回答へのお礼

ありがとうございます!
大変参考になりました。
incrで要素を定義するようにします!

お礼日時:2014/02/28 14:45

> この場合、test222の処理で「SubまたはFunctionが定義されていません」


> とエラーになってしまいます。
こちらの環境ではエラーにならないですけどね。。。

同じクラス内(Sheet1の中に全部書く)なら Private でも通ります。

標準モジュールに宣言してあっても通ります。

Sheet1に宣言してあって、Sheet2で使うのはエラーになります。
    • good
    • 0

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つのプロシージャ内でしか要素を増やすことができないように感じています

補足日時:2014/02/27 12:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A