• ベストアンサー

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

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

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

  • ベストアンサー
回答No.1

Sub Test(ByRef MyArray()) ではなく Sub Test(ByRef MyArray() as Long) としてみてはどうですか? 型が宣言されてないのでエラーになるのではないかと思うのですが… (VBAじゃ確認してませんが、VB.Netではこの方法で書けます)

takaandhiro
質問者

お礼

できました。 間抜けな質問にお手数おかけしました。 ありがとうございました。

その他の回答 (1)

回答No.2

Sub Test(ByRef i as Long , BuVal j as Long)のように、配列でもLongなどの型を書かなくてはいけないです。 例えば、Dim MyArray(10) As Stringだったら、 Sub Test(ByRef MyArray() As String)となります。 がんばってください。

takaandhiro
質問者

お礼

ありがとうございました。

関連するQ&A

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • 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()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。 ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。

  • ExcelVBAで他のファイル(project)のプロシージャから配列の戻り値を取得したい

    自作アドインに、byref型で配列を引数にしたプロシージャを作り、別のファイルのプロシージャからそのアドインを呼び出して、アドインのプロシージャで配列に処理をして、その結果を呼び出し元のファイルのプロシージャで使用したいのですが、処理できないようです。 例えば、 アドイン側 myAddin.xla sub test(byref strAry() as string) strAry(0)="a":strary(1)="b" end sub 呼び出し元 sub execute() dim myAry() as string redim myAry(1) application.run macro:="myAddin.xla!test",arg1:=myAry() msgbox myAry(0) & "-" & myAry(1) end sub 上記のコーディングをしても、表示されるメッセージは "-" のみです。 アドインの処理はまったく反映されていません。 変数であればアドイン側をFunctionにして戻り値を取得できたのですが、配列ですとうまくいきません。 別のプロジェクトから、配列を返す方法はありませんか?

  • プロシージャー名を変数にはできない?

    シートに test1 test2 test3 として、 -------------------------------- Sub Sample() Dim myRow As Long Dim procedure As String For myRow = 1 To Cells(Rows.Count, "A").End(xlUp).Row procedure = Cells(myRow, 1) Call procedure Next myRow End Sub Sub test1() End Sub Sub test2() End Sub Sub test3() End Sub -------------------------------- こういう事ってできないのでしょうか? シートの文字を読み取ってプロシージャーを実行できれば、順番変えたり、要らないプロシージャーを消したりを、シート上で管理できるから楽なのになと思ったのですが。 これをやろうとすると、procedureというプロシージャーがないから Sub、Function、または Property が必要です。 になってしまいます。

  • VB6.0の参照渡し

    VC++6.0で作成したDLLへVBの配列を渡そうと思っています。 いくつかためしたのですが、 「配列引数は ByRef でなければなりません。」 というエラーがでてしまいます。 標準モジュール内の記述 Declare Function fncTest Lib "Test.dll" (ByRef test() As Long) As Long フォーム内 Private Sub Test_Click() dim test() as Long dim i as integer for i = 0 to 3 test(i) = i next i fncTest(Test()) End Sub とりあえず、こんな形でかいてみましたが、 Sub内のtest()の宣言方法、使用法等ご指導お願いします。

  • 参照渡しをする時は、渡される側は違う変数を使う?

    参照渡しをする時は、渡される側は違う変数を使うべきなのでしょうか? VBAのお勉強をしているのですが Sub test1() Dim mystr As String mystr = "a" Call test2(mystr) Call test3(mystr) End Sub Sub test2(ByRef mystr As String) MsgBox mystr End Sub Sub test3(ByRef mystr2 As String) MsgBox mystr2 End Sub この場合、test2とtest3ではどちらを使ったほうがいいのでしょうか? test3は、mystr2 というmystrとは違う変数を使っていますが、 test2は、test1のmystrと同じ変数を使っています。 test1と同じ変数を使おうが違う変数を使おうが どちらにしろ (ByRef 変数名 As String) で宣言するから、変わらないのでしょうか?

  • 引数(配列)について

    呼ぶ側: 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()の変数宣言せずに何とかなりませんでしょうか? 宜しくお願いいたします

  • 配列のフリーズを解消してください。

    Sub データ原本() Dim wsAll As Worksheet Set wsAll = Worksheets("All(5)") Dim lRow As Long, lCol As Long Dim i As Long, j As Long, cnt As Long With Worksheets("データ原本") '日付S行を日付に変更(「.」を「/」に置換) lRow = .Cells(Rows.Count, 1).End(xlUp).Row Dim MyArray As Variant MyArray = Range(.Cells(10, 1), .Cells(lRow, 1)) For i = 1 To lRow - 9 MyArray(i, 1) = Replace(MyArray(i, 1), ".", "/") Next Range(.Cells(10, 1), .Cells(lRow, 1)) = MyArray Erase MyArray '配列の初期化 '「天気」両サイドの &「内・外」両サイドの空白スペースを削除 lRow = .Cells(Rows.Count, 1).End(xlUp).Row MyArray = Range(.Cells(10, TNK), .Cells(lRow, TNK)) For i = 1 To lRow - 9 MyArray(i, 1) = Trim(MyArray(i, 1)) Next Range(.Cells(10, TNK), .Cells(lRow, TNK)) = MyArray Erase MyArray '配列の初期化 '数値0のデータ行の行削除 lRow = .Cells(Rows.Count, 1).End(xlUp).Row lCol = .Cells(9, Columns.Count).End(xlToLeft).Column Dim arr_A As Variant, arr_B As Variant arr_A = Range(.Cells(9, 1), .Cells(lRow, lCol)).Value ReDim arr_B(1 To lRow - 8, 1 To lCol) cnt = 0 For i = 1 To lRow - 8 If arr_A(i, 18) <> 0 Then cnt = cnt + 1 For j = 1 To lCol arr_B(cnt, j) = arr_A(i, j) Next j End If Next i .Range("A9").Resize(lRow, lCol).Value = arr_B End With End Sub  上記のコードを2回実行すると2回目には、 MyArray(i, 1) = Replace(MyArray(i, 1), ".", "/")のところで「型が一致しません。」とフリーズします。かと言って 「 '数値0のデータ行の行削除」コードを一括削除して、実行ボタンを何度押してもフリーズすることはありません。どこに不具合が生じているのかわからないのですが、どなたか名回答を宜しくお願いします。

  • VC6.0で作成したDLLでVBからの配列を受け取る方法

    VC++でDLLを作成しています。 VBから呼び出しで、配列を渡し、その配列の値を VCで使用したいのです。 通常変数でテストして、うまくいっているのですが、 配列に変更したところ、値がうまく渡りません。 どなたかお分かりになられる方いらっしゃいましたら お力をお貸し願えないでしょうか? 変数で成功しているプログラム VB6.0 標準モジュール Declare Function fncTest Lib "fncTest.dll" (a As Long) As Long フォーム Private Sub Test_Click() dim i as integer i = fncTest(1) End Sub VC++6.0 fncTest.h fncTest_API int _stdcall fncTest(int); fncTest.cpp fncTest_API int _stdcall fncTest(int a) { a = a+1; return a; } fncTest.def     省略 変数aを配列に変更して作ってみたもの(配列bにVBからの配列aの値を入れようとしていますが、 うまくいっていません。) VB6.0 標準モジュール Declare Function fncTest Lib "fncTest.dll" (ByRef a() As Long) As Long フォーム Private Sub Test_Click() Dim i As Integer Dim hairetu(7) As Long Dim values As Variant For i = 0 To 7 hairetu(i) = i Next i values = fncTest(hairetu()) End Sub VC++6.0 fncTest.h fncTest_API int _stdcall fncTest(int*); fncTest.cpp fncTest_API int _stdcall fncTest(int* a) { int b[7]; int i; for (i = 0;i <= 7;i++){ b[i] = a[i]; } return 0; } 以上よろしくお願いします。

  • 配列変数 インデックス番号の最小値

     特に指定しない場合、配列変数のインデックス番号の最小値は0から始まるはずですが、下記のプロシージャでは、abの最小インデックス番号は1,2次元とも「0」でなく「1」から始まります(ウォッチ式で見ても「1」から始まっています)。 「0」から始まらない理由が分かりません。 ご教授を よろしくお願いいたします。 Public Sub セル参照() ' "A1:B10"のセル範囲のデータを順番にメッセージボックスに表示する。 Dim ab As Variant Dim i As Integer, j As Integer ab = Worksheets("Sheet1").Range("A1:B10").Value For i = 1 To UBound(ab, 1) For j = 1 To UBound(ab, 2) MsgBox ab(i, j) Next j Next i End Sub

専門家に質問してみよう