- ベストアンサー
配列の参照渡しで型が一致しません。
エクセル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 --------------------------------------
- lelion1000
- お礼率70% (49/70)
- Visual Basic
- 回答数4
- ありがとう数5
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
簡単にいっていまうと、Variantは小難しい事を考えなくてもそういう風に使えるよ、っていうことです。 イメージ的にはVriant型のでっかい変数の中にVariantの配列が入ってるみたいな感じですかね。
その他の回答 (3)
- onlyrom
- ベストアンサー率59% (228/384)
エラーが出るのは、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()の()を外さなければいけません。
お礼
ありがとうござます。 >のように、eの配列要素に値を代入したり取り出したりするときだけで >今回のように、eの配列全体を表すときなどは、()を付けることはできません。 ただhimajin100000様のおっしゃるように、配列を定義する際に、()をつけることでも OKのようです。結局どちらがいいのか良く分かりません。 引き続きよろしくお願いします。
- himajin100000
- ベストアンサー率54% (1660/3060)
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)
多分 Sub pRo(ByRef c As Variant) で動くと思いますよ そのまま配列として使えるはずです。 ちょっと自信がありませんが…
お礼
おお神様! 動きました。どうもありがとうございました。 ただ配列の()が必要なときと必要ないときが違いが 分からないので、質問は継続します。
関連する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()の宣言方法、使用法等ご指導お願いします。
- ベストアンサー
- C・C++・C#
- 値渡し?参照渡し?をやりたい
「#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) にすると赤くなってしまいます。 ご教授よろしくお願いします。
- ベストアンサー
- その他MS Office製品
- 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としたい場合はどのように記述すればよいのでしょうか?
- ベストアンサー
- Visual Basic
- 参照渡し(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
- ベストアンサー
- Visual Basic
- .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
- ベストアンサー
- Visual Basic
- 配列と互換性のない型の要素にアクセスしようとしまし
以下のソースでサブルーチン呼び出し行で例外「配列と互換性のない型の要素にアクセスしようとしました」が出ます。 -------------------------------------------------------------------------- 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型でありエラーが出る意味が分からないのですが。
- 締切済み
- Visual Basic
- 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
- ベストアンサー
- Excel(エクセル)
- 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を使わない限り、 参照渡しまたは値渡ししてるとは言えないのでしょうか? ご回答よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
お礼
なるほど。わりました。 これはVriant型だから成り立つようですね。 その辺が混乱してたみたいです。 どうもありがとうござました。