プロが教えるわが家の防犯対策術!

Excel VBA で「型が一致しません」というエラーが発生します。

--------------------------------------------------------------------------------
Dim katacode as String

katacode = "(1001,1002,1005,1010,1015,1020,1030,1035,1036,1040,…(省略)…,1150)"

With ActiveSheet.QueryTables.Add(Connection:= _
pubfncgetConnectString,Destination:=Range("A1"))
.CommandText = Array(_
"SELECT ~
FROM ~
WHERE コード IN katacode

--------------------------------------------------------------------------------

「katacode」の値が、文字列の長さが155までは上手く動くのですが
 それ以上に追加すると「型が一致しません」というエラーが発生します。
 

原因がわかりましたら教えていただけないでしょうか。よろしくお願い致します。

A 回答 (2件)

>Arrayをとった記述をしてみましたが、SELECT~の文が長くて複雑で


>うまくいきませんでした。
では、試しに
>--------------------------------------------------------------------------------
>Dim katacode as String
>katacode = "(1001,1002,1005,1010,1015,1020,1030,1035,1036,1040,…(省略)…,1150)"
>With ActiveSheet.QueryTables.Add(Connection:= _
> pubfncgetConnectString,Destination:=Range("A1"))
> .CommandText = Array(_
> "SELECT ~
> FROM ~
> WHERE コード IN katacode
>--------------------------------------------------------------------------------
Dim katacode as String
Dim v
katacode = "(1001,1002,1005,1010,1015,1020,1030,1035,1036,1040,…(省略)…,1150)"
With ActiveSheet.QueryTables.Add(Connection:= _
 pubfncgetConnectString,Destination:=Range("A1"))
 v = Array(_
 "SELECT ~",
 " FROM ~",
 " WHERE コード IN " & katacode
 .CommandText = Join(v, "")

みたいにワンクッション入れてみたらどうなりますか?

もしくは、例えば
Sub sample()
  Dim katacode As String
  Dim s(2) As String

  katacode = "(1001,1002,1005,1010,1015,1020,1030,1035,1036,1040,…(省略)…,1150)"
  s(0) = "SELECT ~"
  s(1) = "FROM ~"
  s(2) = "WHERE コード IN " & katacode
  MsgBox Join(s)
End Sub
..のように適宜、解かり易く句単位で区切って文字列型配列に入れ、
Join関数で結合しても良いかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
試してみましたが
.CommandText = Join(v, "") の記述では同じく「型が一致しません」エラーになりました。
Join(s) の記述もうまくいきませんでした。

結果、「katacode」の値を見直して減らしてもらい対応することになりました。

いろいろ勉強になりました。
度々回答いただき感謝しております。

お礼日時:2013/06/26 20:56

CommandTextプロパティの値の設定に、Array関数を使っているからです。


(おそらく)この時のArray関数の引数に1要素あたりの文字数制限があると思われます。
(255or256文字くらい?)

マクロ記録で、SQL文が長いとArray関数を使ったものが記録されますが、
これはマクロ記録時の制限によるものです。
実際にはCommandTextプロパティには255文字を超えた文字列を直接設定できます。
例えば
.CommandText = Array( _
    "SELECT field1, field2, field3, ..(途中省略).., fie" _
    , _
    "ldX, fieldXX, ..(途中省略).., fieldXXX " & Chr(13) & "" & Chr(10) & "_
    , _
    "FROM [data$]" & Chr(13) & "" & Chr(10) & "WHERE (CODE=?)")

こんな感じのCommandTextは

.CommandText = "SELECT field1, field2, ..(途中省略).., fieldXXX FROM [data$] WHERE (CODE=?)"

..みたいに繋げて書く事ができます。

この回答への補足

Arrayをとった記述をしてみましたが、SELECT~の文が長くて複雑で
うまくいきませんでした。
他にいい方法がありましたら教えてください。

補足日時:2013/06/24 22:51
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
Arrayをとった記述で試してみます。

お礼日時:2013/06/19 18:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!