
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()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。
ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
まずは、VB.NETでの配列の正体を知っておいた方がよいでしょう。
http://msdn.microsoft.com/ja-jp/library/dd314345 …
特に
> 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) 等の可変長で配列っぽく使えるクラスを使う
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
このQ&Aを見た人はこんなQ&Aも見ています
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
VBのFunctionで、配列を引数や返却値にできますか?
Visual Basic(VBA)
-
VBで構造体の配列を関数に渡す方法?
Visual Basic(VBA)
-
-
4
Functionの戻り値を配列にしたいのですが
Visual Basic(VBA)
-
5
2次元動的配列の第一引数のみを可変にする
Visual Basic(VBA)
-
6
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
7
配列を関数に渡す方法
Visual Basic(VBA)
-
8
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
9
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
10
Functionの戻り値を2次元配列にする方法
Visual Basic(VBA)
-
11
CloseとDisposeの違い
Visual Basic(VBA)
-
12
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
13
配列の重複する値とその個数を取得したい
Visual Basic(VBA)
-
14
クラスに配列を渡す方法
Visual Basic(VBA)
-
15
Visual Basic.NETの、Form 間での引数の引渡し方法を教えてください。
Visual Basic(VBA)
-
16
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
17
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
18
VBでグローバル変数を宣言するには
Visual Basic(VBA)
-
19
VB.NETで他のEXEを実行させる
Visual Basic(VBA)
-
20
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
動的配列が存在(要素が有る)か...
-
IF関数でEmpty値を設定する方法。
-
C言語 重複しない4ケタの乱数...
-
VBAで配列の計算
-
VB.net 引数で配列変数を渡す際...
-
For文と配列
-
VBで作った乱数を一度も重複さ...
-
C# での文字列パディング
-
EXCEL VBA で、0から?1から?
-
パソコンキーボードで時分秒を...
-
遅延バインディングを使用でき...
-
エクセルで小数の中の最大値を...
-
Excel VBAで配列の途中から(X)M...
-
ラジオボタンのチェックをEnter...
-
配列通しのOR演算
-
複数のテキストボックスに同じ...
-
Visual C++ でコントロールを...
-
排列と配列の漢字の使い分けは
-
C#の質問
-
10進数を4桁のバイト配列に格納...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
動的配列が存在(要素が有る)か...
-
IF関数でEmpty値を設定する方法。
-
EXCEL VBA で、0から?1から?
-
VBAで配列の計算
-
VB.net 引数で配列変数を渡す際...
-
パソコンキーボードで時分秒を...
-
変数を動的に作るには?
-
VBでbyte配列型のインスタンス...
-
VBで作った乱数を一度も重複さ...
-
Excel VBAで配列の途中から(X)M...
-
配列の要素数を超えた参照のコ...
-
複数のテキストボックスに同じ...
-
ラジオボタンのチェックをEnter...
-
C言語 重複しない4ケタの乱数...
-
排列と配列の漢字の使い分けは
-
For文と配列
-
Visual C++ でコントロールを...
-
C++、クラスメンバの構造体配列...
-
遅延バインディングを使用でき...
-
int型配列の一括初期化
おすすめ情報