VB.net 引数で配列変数を渡す際の要素数

このQ&Aのポイント
  • 配列変数を他のプロシージャに引数で渡す際の、配列変数の要素数をあらかじめ宣言していないとエラーになります。
  • 要素数が未確定の配列変数を渡すことはできないため、要素数をあらかじめ宣言する必要があります。
  • 配列変数の要素数がどこまで増加するか分からない場合は、大きな要素数を宣言することで対応できます。
回答を見る
  • ベストアンサー

VB.net 引数で配列変数を渡す際の要素数

VB.net 2010 の質問です。 配列変数を他のプロシージャに引数で渡す際の、配列変数の要素数をあらかじめ宣言していないとエラーになります。 Dim Hairetsu() As String ' ←エラー Dim Hairetsu(100) As String ' ←正常 Public Sub aaa(ByRef Hairetsu() As String) Hairetsu(0) = "Test" '←正常の場合と、エラーの場合 End Sub Hairetsu(100) のように、要素数を宣言していると、エラーにならないのですが、 プログラム中、要素数がどこまで増加するか、分かりません。 Hairetsu()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。 ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

まずは、VB.NETでの配列の正体を知っておいた方がよいでしょう。 http://msdn.microsoft.com/ja-jp/library/dd314345.aspx 特に > 3-3-3 参照型としての配列変数 から下をよく読んで理解してください。 > Dim Hairetsu() As String は、Stringの配列を覚えることができる変数Hairetsuを用意するだけで、配列の実体は用意されません。 上記URLの「図 3-11 Nothing が代入されるのは、あくまで配列変数 D 自体」が近い状態です。 この図の「配列の実体」が最初から存在しない、というものです。 > Public Sub aaa(ByRef a() As String) > a(0) = "Test" '←正常の場合と、エラーの場合 ※ 念の為、仮引数の名前を変えました。 このsubを aaa(Hairetsu) と呼び出した場合、 Hairetsu() しただけの場合は、a = Nothing となっています。 よって、 a(0) は Nothing(0) ということになり、そんなものは無いのでエラーになります。 ※ エラーメッセージはちゃんと読みましょう。 ※ 質問するなら、ただ「エラーになります」では対処しようがありません。 ※ 正確なエラーメッセージを記載るようにしましょう。 ※ 例えば、そのエラーは ※ 「 NullReferenceException "オブジェクトのインスタンスを指定する必要がある部分に null 値が指定されています" 」 ※ とか表示されていませんでしたか? 対策ですが、いくつもあるので、目的によって選択することになります。 ○ aaa内で Nothingだったら処理を中止するようなコードにする 例) if a is Nothing then exit sub ○呼び出し元で、Hairetuをredimしてからaaaを呼び出す。 ○aaa内でredim する。仮引数aはByRefになっているので、呼び出し元の変数が変更される。  ※ なお、参照型の特性として「a(0) = "Test" 」だけなら、ByVal a でも同じ「配列の実体」にアクセスすることになります。 ○ sub aaaではなく、 function aaa() as String() 等といった配列も返す関数にする ○ List(of T) 等の可変長で配列っぽく使えるクラスを使う

ultgoo
質問者

お礼

kmee様 配列の基礎が学べる、良いアドバイスをいただき有難うございます。 是非、参考にさせて頂きます。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

関連するQ&A

  • 配列の宣言時の要素数について

    VBAで、配列を始めて使うものです。ここで、以下のコードを実効すると「定数式が必要」とエラーがでてきます。どうも配列の宣言時の要素数[SampleCount-1]に問題あるようです。SampleCountは、このコードを使用するにあたり変化する値で、実際には変数として使用するつもりです。したがってここでは仮に[SampleCount = 5]としています。上述の意図を満たすにはこのコードをどうのように変化すればよいのでしょうか?教えてください。 Dim SampleCount As Integer Sub DiameterAndRatio() SampleCount = 5 Dim AAA(SampleCount - 1) As integre For i = 1 To SampleCount AAA(i - 1) = Cells(5 + i - 1, 2) MsgBox AAA(i - 1) Next i End Sub

  • .NET - 配列変数を省略可能の引数にする方法

    お世話になっています。 .NETでのコーディングを行っています。 標記の件ですが、初めてなので .NETからなのか、もともとそうなのかは不明なのですが、 プロシージャの引数をOptionalで宣言すると、 省略された時の値を設定する必要がありますよね。 省略可能の引数を配列変数にしたい場合、どのように宣言したら良いのでしょうか? 初期値って言っても、今回省略可能にしたい変数は、 検索結果を格納するための変数ですので、 省略されたときには何の値も入っていなくて良いんです。 宣言部分は以下のとおりです。 Public Function CM_fun_b_Get_WeekdayNm(ByRef Wstr_WeekKb() As String, _ ByRef Wstr_WeekNm() As String, _ ByRef Wstr_WeekNmR() As String) As Boolean この、Wstr_WeekNmR()を省略可能にしたいのです。 このような場合、どうやって宣言するべきなのでしょうか? ヘルプを見たのですが、よくわからなくて・・・(;_;) 念のため、省略された時に、何らかの値を設定する方法も知りたいです。 よろしくお願いいたします。

  • 配列をプロシージャの変数としたい

    ExcelVBAです。 Sub Test(ByRef i as Long , BuVal j as Long) のように、SUBプロシージャのカッコ内に変数をおき、他のプロシージャから呼び出して使うような場合についてですが、その変数を配列にしたいのですが、書き方が分かりません。 Sub Test(ByRef MyArray()) というようにしたらできるかと思ったのですが、できません。 よろしくお願いいたします。

  • 配列の要素数について

    下記の記述の場合、配列の要素数っていくつになりますか? Dim strArray() As String ReDim strArray(0) また下記のように、配列の要素数を具体的に書かずに使った場合不具合はでますか? Dim strArray() As String strArray(0) = "aa" strArray(1) = "bb"

  • 配列の要素数に変数を入れたいときには

    よろしくお願いします。 配列の要素数には定数しか入れられないのですが,どうしても変数を入れたいときは,それを引数として関数を呼び出すしか方法はないでしょうか。 具体的には,scanfで手に入れたint型の変数を要素数とする配列を宣言したいのですが,どうすれば良いでしょうか。 ご教授ください。

  • VB.NET の配列の要素数

    VB.NETで List(Of String()) の多次元配列を宣言したとします。 Listの要素数とListの中のStringの要素数はどのように確認すれば わかるでしょうか? どうぞ、よろしくお願いいたします。

  • 配列変数を引数として(参照)値渡しをしたいのですが

    プロシージャ間で配列変数を引数として(参照)値渡ししたいのですが、例えば以下のような場合、2箇所のXXX部分はどのように記述したらよいのでしょうか。 よろしくお願いします(Excel2000使用) Public Sub give()   Dim a(2) As Byte   a(0) = 3   a(1) = 15   take XXX End Sub Public Sub take(XXX)   (処理省略。受け取り側でも配列変数で処理したい) End Sub ※上記の例では配列の要素数が2ですが、実際はもっと多いので、例えば「take a(0),a(1),・・・」というふうな記述は(仮に適切なものであったとしても)記述しきれません。

  • 引数(配列)について

    呼ぶ側: Sub main()  Call func(test(),test_id) end Sub 呼ばれる側:  Private Sub func(Byref test() as string, Byval test_id as long) と言う関係がある場合で 引数(1)test() の値がなく渡したくない場合は、どのように記述すればいいのでしょうか? 引数(2)test_id の値がなく渡したくない場合は、0を渡しています  また、呼ぶ側で test() を宣言し、tast()=""を代入すれば問題ないことは分かっているのですが、test()の変数宣言せずに何とかなりませんでしょうか? 宜しくお願いいたします

  • 配列を引数で渡したりするには?

    初心者なので困っています。配列をほかのサブルーチンへ渡して、その中で配列の値を書き換えて、上層のルーチンへ渡すにはどうしたらよいのでしょうか? 初心者なので、みなまさまのお知恵を拝借させてください。よろしくお願いします。 Private Sub Print() Dim C_ALL(3) As Integer Dim D_ALL(3) As Integer Data_Set(C_ALL(), D_ALL()) MsgBox(C_ALL() & " " & D_ALL()) '配列内容すべて表示 End Sub Private Sub Data_set(ByRef C_ALL As Integer, ByRef D_ALL As Integer) Dim i As Integer For i = 0 To 4 C_ALL(i) += i D_ALL(i) += i i += 1 Next End Sub

  • VBAで配列の要素と、配列外の他の変数との時刻比較

    独学の者です、お願いいたします。 Dim item(1 To 288) As Date  ’ 配列をDate型、各要素は07:05のような時刻データ Dim kunt_d As Date  ’上記配列の各要素と別の時刻データ、Date型 If kunt_d = item(a) Then  ’配列の要素と他の変数とを比較、どちらも時刻データ。 この際、上記の同じDate型ですと動作しません、時刻が一致している場合でも、 条件式はスルーされます。 そこで、配列と比較する別の方は、String型にしてみたところ 動作しました。 このケースで、Date型同士は間違った使い方でしょうか? また、配列と配列外の変数との比較は型の一致は必要無いのでしょうか? よろしくお願いいたします。

専門家に質問してみよう