• ベストアンサー

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

エクセル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 --------------------------------------

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

  • ベストアンサー
  • bkbkb
  • ベストアンサー率33% (97/289)
回答No.4

簡単にいっていまうと、Variantは小難しい事を考えなくてもそういう風に使えるよ、っていうことです。 イメージ的にはVriant型のでっかい変数の中にVariantの配列が入ってるみたいな感じですかね。

参考URL:
http://pc.nikkeibp.co.jp/article/NPC/20070803/279065/
lelion1000
質問者

お礼

なるほど。わりました。 これはVriant型だから成り立つようですね。 その辺が混乱してたみたいです。 どうもありがとうござました。

その他の回答 (3)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

エラーが出るのは、mainで Dim e As Variantと、eを配列で宣言してないのに Sub pRo(ByRef c() As Variant) の引数を c() と配列にしてるからです。   e = fuN() これで初めて、eは配列になりますが、eに()を付けることができるのは   A=e(0)   e(0)=100 のように、eの配列要素に値を代入したり取り出したりするときだけで 今回のように、eの配列全体を表すときなどは、()を付けることはできません。 よって、 '----------------------------------------- Sub pRo(c As Variant)  '●c()の()を外す   MsgBox c(0) End Sub '--------------------------------------- のように、c()の()を外さなければいけません。  

lelion1000
質問者

お礼

ありがとうござます。 >のように、eの配列要素に値を代入したり取り出したりするときだけで >今回のように、eの配列全体を表すときなどは、()を付けることはできません。 ただhimajin100000様のおっしゃるように、配列を定義する際に、()をつけることでも OKのようです。結局どちらがいいのか良く分かりません。 引き続きよろしくお願いします。

回答No.2

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 'コレでも通るっぽい '質問文が何故通らないのかは解らん。

lelion1000
質問者

お礼

ああ神様! 動きました。どうもありがとうございました。 ただ配列の()が必要なときと必要ないときが違いが 分からないので、質問は継続します。

  • bkbkb
  • ベストアンサー率33% (97/289)
回答No.1

多分 Sub pRo(ByRef c As Variant) で動くと思いますよ そのまま配列として使えるはずです。 ちょっと自信がありませんが…

lelion1000
質問者

お礼

おお神様! 動きました。どうもありがとうございました。 ただ配列の()が必要なときと必要ないときが違いが 分からないので、質問は継続します。

関連するQ&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()の宣言方法、使用法等ご指導お願いします。

  • 値渡し?参照渡し?をやりたい

    「#00B7EF」を「&HEFB700」にする関数を作ってるのですが 初心者のため躓いてしまいました。 コードは ++++++++++++++++++++++++++++++++++++++++++++++++++++ Sub 色コード() myStr = "#00B7EF" Debug.Print 色コード変換(myStr) End Sub Function 色コード変換() Dim myStr1 As String Dim myStr2 As String Dim myStr3 As String myStr1 = Mid(myStr, 2, 2) myStr2 = Mid(myStr, 4, 2) myStr3 = Mid(myStr, 6, 2) 色コード変換 = "&H" & myStr3 & myStr2 & myStr1 End Function ++++++++++++++++++++++++++++++++++++++++++++++++++++ を作ったのですが、 End Functionを過ぎてから 実行時エラー_型が一致しません。(Error13) になります。 Sub 色コード()の時に、型を宣言してないからでしょうか? しかし、 Function 色コード変換(as String) にすると赤くなってしまいます。 ご教授よろしくお願いします。

  • VB2005での関数への配列の参照渡しの方法

    Visual Basic 2005で、 =============================================================== Function func(ByVal a As Integer, ByRef b() As Integer) As Integer  a += 1 : b(0) = 1 : b(1) = 2 : b(2) = 3 Return 0 End Function ============================================================== という関数があったとしてメインのプロシージャに ================================================================ Dim c As Integer Dim d As Integer Dim e() As Integer = Array.CreateInstance(GetType(Integer), 10) d=7 c = func(d, e) ================================================================ と書き入れると結果はd=7(∵値渡し)、e(0)=1,e(1)=0,e(2)=0(∵参照渡し)となってしまうと思います。 e(0)=1,e(1)=2,e(2)=3としたい場合はどのように記述すればよいのでしょうか?

  • 参照渡し(ByRef)

    参照渡しについてわからないのですが Option Explicit Dim buf As String Sub Sample1() buf = "aaa" Call Sample2("bbb") MsgBox buf End Sub Sub Sample2(ByRef a As String) a = "ccc" End Sub を実行すると、msgboxには、aaaが表示されますが、 途中のbbb,cccはどんな意味があるのでしょうか? また、 Sub Sample2(ByRef a As String) を Sub Sample2(a As String) にしてもコードは問題なく動きますが、 ByRefは役に立ってるのですか?

  • [Excel2000_VBA] 型が一致しませんメッセージが表示

    各サイトを調べたのですが、自分のレベルに合った解答内容がなくよく理解できなかったので、質問させて頂きます(初歩的な質問で申し訳ありません) ユーザー定義を使用し、以下のコードを作ってみました。 配列を引数にして、まとめて返したいと考えていますが、構造体を使用すると「型が一致しません」と表示されてしまいます。 何が原因しているのでしょうか? さっぱり分かりませんので、ご教示お願いいたします。 Type test aaaa As Integer End Type Sub sbTest() Dim myAns() As test myAns = Sample1(myAns) End Sub Function Sample1(ByRef Ans() As test) Dim i As Integer Dim ret(0 To 9) As test For i = 0 To 9 ret(i).aaaa = i Next Ans = ret '配列名で配列を戻り値 End Function

  • .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

  • 配列と互換性のない型の要素にアクセスしようとしまし

    以下のソースでサブルーチン呼び出し行で例外「配列と互換性のない型の要素にアクセスしようとしました」が出ます。 -------------------------------------------------------------------------- Private Sub メインルーチン()  Dim Rows() As Data.DataRow = MyDataSet.Tables(MyTableName).Select("条件") if Rows.Count <> 0 then サブルーチン (Rows(0)) end if End Sub Private Sub サブルーチン(ByRef Row As Data.DataRow) '処理 End Sub ---------------------------------------------------------------------------- サブルーチンを呼び出す前に以下のようにするとエラーはでません。 Dim Row as Data.DataRow = Rows(0) サブルーチン (Row) これはなぜなのでしょうか?RowはData.DataRow型であり、配列の要素Rows(0)もData.DataRow型でありエラーが出る意味が分からないのですが。

  • VBA「型が一致しません」とエラーが出ます

    下記記事の関連質問です。 Excel 文字列抜き出しについて https://okwave.jp/qa/q9979633.html 記事を参考に複数行にマッチするように下記のようにコードを考えましたが msplit(mRng, " ", iii)で「型が一致しません」とエラーが出ます。 なぜでしょうか? テスト用のA4セル 1 01 45124422 ミント 09/01~03/01 108 98 01/05~02/01 Option Explicit Sub test() Dim msplit As Variant Dim buf As String, i As Long, ii As Long, iii As Long, cnt As Long Dim mRng As Range For ii = 4 To Cells(Rows.Count, 1).End(xlUp).Row buf = Cells(ii, "A") For i = 1 To Len(Cells(ii, "A")) If Mid(buf, i, 1) = " " Then cnt = cnt + 1 Next For iii = 1 To cnt Set mRng = Cells(ii, "A") ’Stop Cells(iii + 1, ii) = msplit(mRng, " ", iii) Next Next Set mRng = Nothing End Sub Function msplit(ByRef mRng As Range, ByVal Spstr As String, ByVal num As Long) As Variant msplit = Split(mRng, Spstr)(num - 1) End Function

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?

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

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

専門家に質問してみよう