• ベストアンサー

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

プロシージャ間で配列変数を引数として(参照)値渡ししたいのですが、例えば以下のような場合、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),・・・」というふうな記述は(仮に適切なものであったとしても)記述しきれません。

noname#128465
noname#128465

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

  • ベストアンサー
  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.3

Public Sub give()   Dim a(2) As Byte   a(0) = 3   a(1) = 15   call take(a) End Sub '配列の場合は参照渡しとなります。 '省略するとこの形になっています。 '処理速度も参照渡しの方が高速です。 Public Sub take(ByRef b() as Byte) ~ End Sub ---- 'ただしVariantなら値渡しも可能です。 Public Sub take(ByVal b as Variant) ~ End Sub

noname#128465
質問者

お礼

未だスクリプトが完成しておらず、完全には確認できていないのですが、おかげ様でとりあえず今のところは成功しています。今回の質問はここでいったん締め切ります。 ありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

Private Sub test01() Dim a(5) Dim b(2) a(0) = 1 a(1) = 8 a(2) = 4 Call shori(a(), b()) MsgBox a(5) MsgBox b(0) End Sub '------ Private Sub shori(x(), y()) x(5) = (x(0) + x(1)) * x(2) MsgBox x(5) y(0) = x(0) + x(1) MsgBox y(0) End Sub http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200_050.html を参考に

noname#128465
質問者

お礼

未だスクリプトが完成しておらず、完全には確認できていないのですが、おかげ様でとりあえず今のところは成功しています。今回の質問はここでいったん締め切ります。 ありがとうございました。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.1

Public Sub give()   Dim a(2) As Byte   a(0) = 3   a(1) = 15   take a End Sub Public Sub take1(XXX() As Byte) Debug.Print XXX(0) Debug.Print XXX(1) End Sub 受け取り側は Public Sub take(XXX As Variant) でも大丈夫です。

noname#128465
質問者

お礼

未だスクリプトが完成しておらず、完全には確認できていないのですが、おかげ様でとりあえず今のところは成功しています。今回の質問はここでいったん締め切ります。 ありがとうございました。

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

  • 配列の参照渡しで型が一致しません。

    エクセル2003です。 いつもお世話になります。 以下のコードを実行すると「配列の型が一致しません。」というエラーが出ます。 typeNameで確認しても配列の型はvariant()で正しいと思うのですが。。。 皆様のお知恵を拝借させていただけないでしょうか。 -------------------------------------- Sub main() Dim e As Variant e = fuN() Call pRo(e)  '←ここでエラーになる。 End Sub Function fuN() As Variant Dim a(0) As Variant a(0) = "zero" fuN = a End Function Sub pRo(ByRef c() As Variant) '処理っす End Sub --------------------------------------

  • .netからアクセスへの配列変数渡しについて

    .NET 2010でアクセスのモジュールを実行させようとしております。 アクセスに配列を引数にしようとしていますが “Public ReadOnly Default Propety Chars(index as Integer) as Charに対する引数が多すぎます。” のエラーが発生しており困っております。 これはどのようなことが原因でエラーが発生しているのでしょうか。 また、解決策がありましたらご教授していただけないでしょうか。 .net側 Private sub AcsRun() Dim strdata as string Dim pData(50,10) as object Strdata =数値1 pData(1,1) = 文字2 pData(2,1) = 数値2     ・・・・・・・   ‘ここでpDataでエラーがでます。 If app.Run("AcsMdl"( Strdata, pData) = False) Then    Exit sub End If End sub アクセス側 Public Function AcsMdl (Strdata As Integer, pData () As Variant) As Integer AcsMdl = false ‘処理 AcsMdl = true End function

  • 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にして戻り値を取得できたのですが、配列ですとうまくいきません。 別のプロジェクトから、配列を返す方法はありませんか?

  • 変数の配列の使い方教えてください。(初心者)

    VBで関数を作ってるのですが、 Function kansuu as Long Dim a(50) as Long Do (処理) Loop End Function ↑こんな形になってまして、変数a(0)~a(50)にはそれぞれ値が入ってます。{a(50)まで全部使うとは限りません。} Do文を抜ける条件として、途中に「もしa(0)~a(50)の値が全て"0"ならDo文を抜ける」という処理を入れたいのですが、変数aの"配列要素全て"という文の記述方法が分かりません。どなたか教えてください

  • 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) で宣言するから、変わらないのでしょうか?

  • ASPでの引数の配列渡しについて

    下記のようなコードで検証してみました。 関数の内部に配列を渡すことには成功しているようですが、関数内で書き換えを行っても元の配列には反映されません。 こういうことは「できない」と解釈していいのでしょうか? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Dim n(10) Dim a(10) n(0) = 1 n(1) = 2 a(0) = "a" test(n) test(a) response.Write("n(0)=" & n(0) & "<br>") response.Write("n(1)=" & n(1) & "<br>") response.Write("a(0)=" & a(0) & "<br>") response.Write("a(1)=" & a(1) & "<br>") Sub test(byref x) response.Write("ubound=" & UBound(x) & "<br>") response.Write("x(0)=" & x(0) & "<br>") response.Write("x(1)=" & x(1) & "<br>") x(0) = x(0) & x(0) x(1) = x(1) & x(1) End Sub

  • Excel VBA onTime関数のプロシージャ引数に、引数(変数)つきのプロシージャを呼び出す方法を教えてください。

    現在ExcelVBAで一定時間ごとにメッセージを出すツールを作成しています。 その際にonTime関数を使っていますが、その引数のひとつである呼び出すプロシージャに「引数(変数)つきのプロシージャ」を設定しようとしています。 サイトを探してみたところ、引数にシングルクオーテーションで囲むなど書いてあったのですが、変数を引数としたプロシージャを設定すると、「プロシージャが見つかりません」のエラーがでます。 どなたかお力を貸してくれませんでしょうか。 ちなみに僕のコードは以下の通りです。(簡略化) ------フォーム Private Sub cmbOk_Click() Call メッセージ実行(txtTime.Text, txtContent.Text) End Sub ------ThisWorkbook Private Sub メッセージ実行(ByVal time As String, ByVal content As String) Dim starttime As Double MsgBox time & "毎に" & vbCr & content & vbCr & "を表示します。", vbInformation Unload frmSet starttime = Now + CDbl(TimeValue(time)) Application.OnTime starttime, "'expressContent" & time & content & "'" End Sub ------標準モジュール Dim starttime2 As Double Sub expressContent(ByVal time2 As String, ByVal content2 As String) MsgBox "content2", vbInformation starttime2 = Now + CDbl(TimeValue(time2)) Application.OnTime starttime2, "'expressContent" & time & content & "'" End Sub よろしくお願い致します。

  • これは参照渡し・値渡ししてる事になりますか?

    Dim a As String Sub マクロ1() a = "test" Call マクロ2 a = Empty End Sub Sub マクロ2() MsgBox a End Sub これは参照渡し・値渡ししてる事になりますか? ByRefやByValを使わない限り、 参照渡しまたは値渡ししてるとは言えないのでしょうか? ご回答よろしくお願いします。

専門家に質問してみよう