- ベストアンサー
配列を返り値、でエラー
Excelで、ボタンが押されるとファンクションを呼び出し、 指定した文字列を文字列型の配列に格納して返す、 というマクロを作成したいのですが ―Sheet1―――――――――――― Private Sub btn_Click() Dim inpt(3) As String inpt = Module1.getArg() End Sub ―――――――――――――――― ―Module1――――――――――― Function getArg() As String() Dim ret(3) As String ret(0) = "1番目" ret(1) = "2番目" ret(2) = "3番目" getArg = ret End Function ―――――――――――――――― inpt = Module1.getArg() の部分で「配列には割り当てできません」とエラーが出てしまいます。 色々試してはみたのですが、どうも解決できません。 ヒントだけでも構いませんのでご助力お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「配列には割り当てできません」というエラーは Dim inpt(3) As String ReDim inpt(4) とするのと同じエラーですから、 「宣言時に要素数を定義した配列は要素数を変更することができない」 ということですね。 Excel などの VBA では関係ないかもしれませんが、 CやC++では Static 変数や要素数が決まっている配列が割り当てられるメモリ領域と、動的に( VB の ReDim のような方法で)割り当てられるメモリ領域は異なっていて、別々に管理されています。おそらく開発ツールの VB ( VBA ではない)もC/C++と同じメモリ管理手法を取っていると思われるのですが、この仕様はそのあたりから来たものではないかと思います。 ( 「VBA では VB とは違って宣言時に要素数を定義した配列を ReDim できる」ようにできなくもないような気もするのですが・・・) 何にしろ、そういう仕様だから、ということには間違いないと思います。
その他の回答 (2)
- GuruGuru22
- ベストアンサー率51% (177/346)
あー、聞かれると思ったけど、 私はわかりません。 詳しい人の回答待ってみて。 個人的には、getArgで返ってくる配列の個数が 確定しない場合もあるので、そういう仕様に なってるんだと思うけど。
お礼
GuruGuru22さんの仰っている内容で合ってるのでは、と 素人なりに思いましたが、そういう内部に詳しい方が回答して下さるのを 首を長くして待とうと思います。 GuruGuru22さん、ご回答頂いて本当にありがとうございました。
- GuruGuru22
- ベストアンサー率51% (177/346)
ヒントっつーか、答えだけど。 Dim inpt() As String にしてみそ。
お礼
あ、ホントですね…動きました。 物凄く迅速かつ明確な回答ありがとうございました。 そこで一つ質問させて頂きたいのですが 配列の長さを指定して宣言していたら何故いけなかったのでしょうか 少し詳しい説明頂けるとありがたいです。
お礼
なるほど…そういう事でしたか。 以前に動的に配列の要素数を変更したくて Dim inpt(3) As String ReDim inpt(4) と同じような事をやってエラーが出ていた事を思い出しました。 その際には Dim inpt() As String ReDim inpt(4) で解決できていたのに… もうちょっと学習しながらコーディングするべきですね。反省です。 他の言語を例に出して頂き、非常に分かりやすかったです。 ありがとうございました。