質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2296閲覧

動的配列に値を追加する際、redimしなくて良い理由

Eisaku_Yoshida

総合スコア11

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/11/08 13:13

以下のコードがなぜ成立するのかがわかりません。

vba

1dim msg as string: msg = "my name is Bob." 2'動的配列宣言 3dim words() as string: 4 5'ここ! 6words = split(msg) 'このコード!(※) 7 8 9debug.print words(0), words(1), words(2), words(3) 10'表示内容------------------------------------------- 11'my name is bob 12'-------------------------------------------------- 13

(※)の部分について、
redim words(3)
words(0) = split(msg)(0)
ではないのかと思うのです。
(このコードを実行したとたん、Excelが落ちるので、違うのだとは思うのですが。。。)

まず、動的配列なのに、redimをしなくて良い意味が分からなくて困っております。
さらに、よくよく考えてみたら、どういった仕組みで、split関数によって、戻り値として返された、『分割された1次元配列』が、動的配列に、代入されるのか見当がつきません。

ご教授いただけませんでしょうか?

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

動的配列には、「配列をまるごと代入」ができます。その時点で代入元のサイズでRedimしたのと同じことになります。

VBA

1ReDim words(5) 2Debug.Print UBound(words) 3Debug.Print UBound(Split(msg)) 4words = Split(msg) 5Debug.Print UBound(words)

を、「ここ」と書いてあるところに入れてみてください。配列上限が変更されていることがわかると思います。

投稿2021/11/08 14:00

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eisaku_Yoshida

2021/11/09 11:06

ご回答ありがとうございます! 確かに、配列の上限が、変わっていました! 動的配列には、配列を入れることができて、その際、その動的配列は、内部的に、redim されるのですね。。 納得しました! このようなVBAの仕様?が乗っているような書籍等、ご存じだったりしますでしょうか?
otn

2021/11/09 13:18

この件がどう載っているのか知りませんが、公式リファレンスに載っているのでは?
Eisaku_Yoshida

2021/11/12 08:38

そうですよね! Microsoftの公式リファレンスを見てみます! ありがとうございました!
guest

0

引用テキスト動的配列なのに、redimをしなくて良い意味が分からなくて困っております。

Split()関数の中でRedimされているのです。
以下のコードを実行してみてください。

vb

1'動的配列宣言 2Dim words() As String: 3words = sample(3) 'このコード!(※) 4Debug.Print LBound(words), UBound(words) 5Debug.Print words(1), words(2), words(3) 6'表示内容------------------------------------------- 7'1 3 8'1 2 3 9'-------------------------------------------------- 10 11Function sample(n As Long) As Variant 12 ReDim Result(1 To n) As String 13 Dim i 14 For i = 1 To n 15 Result(i) = i 16 Next 17 sample = Result 18End Function

投稿2021/11/11 12:44

takanaweb5

総合スコア359

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eisaku_Yoshida

2021/11/12 08:48

ご回答ありがとうございます! なるほど、内部的に、redimされているのですね。 そして、redimされた配列を動的配列に格納しているのだということですね。 理解できました! ありがとうございます!
guest

0

意味など詮索するのは無意味です。

仕様です。
マイクロソフトがその様に作った。
それだけです。

それを素直に受け入れて使うのがプログラマの仕事です。

投稿2021/11/08 13:22

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eisaku_Yoshida

2021/11/09 10:45

ご回答ありがとうございます! 仕様なのですね! そういうものだと納得することも大切なのだなと思いました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問