• 締切済み

Excel VBA で「型が一致しませんエラー

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までは上手く動くのですが  それ以上に追加すると「型が一致しません」というエラーが発生します。   原因がわかりましたら教えていただけないでしょうか。よろしくお願い致します。

みんなの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.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関数で結合しても良いかと思います。

cocomoon3
質問者

お礼

回答ありがとうございました。 試してみましたが .CommandText = Join(v, "") の記述では同じく「型が一致しません」エラーになりました。 Join(s) の記述もうまくいきませんでした。 結果、「katacode」の値を見直して減らしてもらい対応することになりました。 いろいろ勉強になりました。 度々回答いただき感謝しております。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

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=?)" ..みたいに繋げて書く事ができます。

cocomoon3
質問者

お礼

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

cocomoon3
質問者

補足

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

関連するQ&A

  • SQL文をVBAで流すと「型が一致しない」というエラーが

    PostgreSQLのDBに、SQL文を投げて、結果をシートに書きだす、というマクロを組みました。 しかし、A5などのソフトでこのSQL文を実行すると正しく結果が返ってくるのですが、下記のマクロで流そうとすると、 .CommandText = Array(myCmd) 部分で”型が一致しません”とエラーを返します。 この原因がおわかりの方がいたら、是非教えて下さい。 netで調べたりしたけどわかりません。 ちなみに、マクロで、注意A)のSQL文を実行すると エラーなく実行できました。尚、下記のSQL文の改行は 見やすくするためにしているだけで、実際とは異なります。 また、SQL文を3つの変数に区切り、最後にmyCmdにドッキングして 実行したりもしましたがダメでした。 Sub test() Dim myCnc As String Dim myCmd As String 'Worksheets.Add 'ワークシートの追加 Sheets("ユーザー名簿").Select '接続先サーバーを指定 myCnc = "ODBC;DRIVER={PostgreSQL Unicode};DATABASE=" & t_name & ";SERVER=" & s_ver & ";PORT=5432;UID=" & user & ";;SSLmode=disable;ReadOnly=0;Protocol=7," 'Select 文 myCmd = "SELECT t_syukka.order_dtl_id As 受注先コード,t_torihikisaki.ryknm As 受注先 FROM t_nonyusaki, t_syukka,t_torihikisaki WHERE t_torihikisaki.tkcd = t_nonyusaki.tkcd And t_nonyusaki.jscd = t_syukka.juchusaki_id And t_syukka.syukka_date >='20091120' And t_syukka.syukka_date <='20091201'" With ActiveSheet.QueryTables.Add( _ Connection:=myCnc, Destination:=Range("A5")) .CommandText = Array(myCmd) .name = t_name .Refresh BackgroundQuery:=False End With End Sub 注意A) myCmd = "SELECT t_syukka.order_dtl_id As 受注先コード,t_torihikisaki.ryknm As 受注先 FROM t_nonyusaki, t_syukka,t_torihikisaki WHERE t_syukka.syukka_date >='20091120' And t_syukka.syukka_date <='20091201'" 環境) DB:Linux PostgrSQL クライアント:WindowsXP,VISTA Office2007

  • Excel VBA 【QueryTables.Add】について

    おしえてください。 マクロの自動記録で、外部からのデータ取り込みをしましたら 以下の様になりました。 With ActiveSheet.QueryTables.Add(Connection:= _ "○○;■■;●●;;□□;▲▲", Destination:=Range("A1")) .CommandText = Array("SELECT * FROM △△.▽▽") .Name = "☆☆ からのクエリ" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .Refresh BackgroundQuery:=False End With このコードについて勉強したくてヘルプやネットで調べましたが どうしても「.Name …」以降の説明がみつかりません; 詳しく説明の載っているサイトもしくは本などご存じでしたら 教えていただけないでしょうか。 よろしくお願い致します。

  • WEBクエリ

    WEBクエリでヤフーから、時系列で株価を取得するマクロを作っています。 シートAの左に、次々と1銘柄1シートで読み込む場合、下のコードをもっと短くする方法はあるのでしょうか?コードは同じで、銘柄の番号のみ違います。よろしくお願いします。 Sheets("A").Select Sheets.Add ActiveSheet.Name = "2002" With ActiveSheet.QueryTables.Add(Connection:="URL;http://table.yahoo.co.jp/t?s=2002.T&g=d", Destination:=Range("A2")) .Refresh BackgroundQuery:=False End With Range("A1").Select ActiveCell.FormulaR1C1 = "2002" Sheets("A").Select Sheets.Add ActiveSheet.Name = "2202" With ActiveSheet.QueryTables.Add(Connection:="URL;http://table.yahoo.co.jp/t?s=2202.T&g=d", Destination:=Range("A2")) .Refresh BackgroundQuery:=False End With Range("A1").Select ActiveCell.FormulaR1C1 = "2202" Sheets("A").Select Sheets.Add ActiveSheet.Name = "3000" With ActiveSheet.QueryTables.Add(Connection:="URL;http://table.yahoo.co.jp/t?s=3000.T&g=d", Destination:=Range("A2")) .Refresh BackgroundQuery:=False End With Range("A1").Select ActiveCell.FormulaR1C1 = "3000" ・ ・ ・ このような感じで銘柄の番号のみが違うコードが続きます。

  • エクセルVBA ”型が一致しません”エラー

    月末の日付分の処理をしており、月末の終わりに 合計欄の表示をしたいと思っております。(合計欄の表示と言っても関数の入っている枠組みだけです) Sub 練習() Dim X As Long Set S1 = Sheets("Sheet1") X = S1.Cells(3, 3).Value 'Xはday関数から求めた月末日が入っている Range("AA1:AF1").Select '合計欄の枠組みをコピー Selection.Copy Range(Cells("J", X)).Select '合計欄を表示させる箇所は列は固定J列行は変数X行 ActiveSheet.Paste End Sub 合計欄を表示させる箇所で”型が一致しません”となるのですが、どのような修正が必要でしょうか、初心者なので 出来ましたら、具体的な説明をよろしくお願い致します。

  • またまたエクセルでWEBデータを取り込む

    下のVBAは以前にお世話になった方に教えていただいたWEBからのデータ取得するものです。 日付を入力することで、その日のデータを取り出すことができます。 ところがWEBのURLが変更になってしまいました。 当方、VBAは疎いため適当に部分修正で利用しようとしたもののなかなかうまくできません。 呼び出したデータも以前と若干形式がちがっているためそのへんも直したいところがあるのですが 取りあえずWEBの取り出し方記述を教えていただければありがたいです。 (70, 80, 32, 62, 101,…というのはたぶんジャンル区分なので今回は不要です。) よろしくお願いします。 WEBURL(旧) http://www.m******/****/0062/00620726.html WEBURL(新) http://m*****/*****/2012-04-17/ ●旧WEB取り出しVBA Sub Using_Web_query30A() Dim arrMenu As Variant Dim myDate As String Dim myURL As String Dim Connection_URL As String arrMenu = Array(70, 80, 32, 62, 101, 102, 90, 120, 40, 22, 31) myDate = InputBox("オープンする日付を「月/日」のように入力してください。", _ "日付の入力", Format(Date, "m/d")) myURL = "0062/0062" & Format(Split(myDate, "/")(0) * 1, "00") & _ Format(Split(myDate, "/")(1) * 1, "00") Connection_URL = "http://www.m*********/***/" & myURL & ".html" Columns(1).ClearContents With ActiveSheet.QueryTables.Add(Connection:= _ "URL;" & Connection_URL, Destination:=Range("A1")) .WebFormatting = xlWebFormattingNone .WebTables = "9" .Refresh BackgroundQuery:=False End With

  • Excel VBA のエラー 5 でトラブルです

    '下記のVBAで---------で囲った部分でエラー 5 「プロシージャの呼び出し、または引数が '不正です。」となります。色々試してみたのですが、何をやってもうまくいきません。 'ご教授頂けないでしょうか '何卒、宜しくお願い致します。 Sub 月次工数_M() ' 月次工数_M Macro MsgBox "挿入する「ファイル」を選択してください" Dim strCdir As String Dim strFname As String With CreateObject("WScript.Shell") 'カレントディレクトリ控え strCdir = CurDir 'カレントネットワークパスの設定 .currentdirectory = "\\fileserver\91_Users\EXCEL" 'ファイルを開くダイアログ表示 strFname = Application.GetOpenFilename("挿入ファイル,*.CSV") If strFname <> "False" Then ' MsgBox "選択したファイル名は" & strFname & "です。" Else MsgBox "キャンセルされました。" Exit Sub End If Dim newbk As String '新規にブックを追加 Workbooks.Add '追加したブックの名前を取得 newbk = ActiveWorkbook.Name Workbooks(newbk).Activate 'カレントディレクトリ復元 .currentdirectory = strCdir End With With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;" & strFname, _ Destination:=Range("$A$1")) ' .CommandType = 0 .Name = "TEXT;" & strFname .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 65001 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = False .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With Dim wk As Variant 'シートの名前を付ける wk = Application.InputBox("新しいシート名を入力してください", Type:=2) If wk <> False Then ActiveSheet.Name = wk Else MsgBox "キャンセルされました。" Exit Sub End If Range("A1").Select Sheets.Add MsgBox "選択したシート名は" & wk & "です。" '----------------------------ここでエラーが発生します------------------------------------------------------ ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ wk & "!R1C1:R95C18", Version:=xlPivotTableVersion15).CreatePivotTable _ TableDestination:="Sheet1!R3C1", TableName:="ピボットテーブル2", DefaultVersion _ :=xlPivotTableVersion15 '--------------------------------------------------------------------------------------------------------------------- Sheets("Sheet1").Select Cells(3, 1).Select With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("UserName") .Orientation = xlRowField .Position = 1 End With ActiveSheet.PivotTables("ピボットテーブル2").AddDataField ActiveSheet.PivotTables( _ "ピボットテーブル2").PivotFields("作業時間"), "合計 / 作業時間", xlSum ActiveSheet.PivotTables("ピボットテーブル2").CompactLayoutRowHeader = "UserName" Rows("1:2").Select Selection.Delete Shift:=xlUp Range("C16").Select Sheets("Sheet1").Select Sheets("Sheet1").Name = "名別"

  • VBAの初心者です。

    ヤフーファイナンスで出来高ランキングのデータを落としているんですけど。 1-50、50-100、101-150と1-1000までわけてるんですが、以下のような感じです。 With ActiveSheet.QueryTables.Add(Connection:= _ \"URL;http://quoterank.yahoo.co.jp/ranking/(省略)\" _ , Destination:=Range(\"A1\")) .RefreshStyle = xlOverwriteCells .AdjustColumnWidth = False .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = \"17\" .Refresh BackgroundQuery:=False End With 多少時間がかかるためもっと早い方法を教えていただけませんか?VBAを学習しはじめたばかりのため、あまり難しいことはわかりかねますが。

  • 型が一致しません

    いつもお世話になっております。 シートごとに元データの値でフィルタをかけ、 フィルタした各シートのD列の文字列を照らし合わせて整合性を確認したく、 下記のようなVBAをつくりましたが、ここで↓ If name_A <> name_B <> name_C <> name_D Then 型が一致しませんとエラーになります。 どなたかアドバイスをお願いいたします。 Sub 不整合チェック()  'フィルター  Worksheets("Aリスト").Select  If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter  Range("B4").AutoFilter  Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3")  Worksheets("Bリスト").Select  If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter  Range("B4").AutoFilter  Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3")  Worksheets("Cリスト").Select  If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter  Range("B4").AutoFilter  Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3")  Worksheets("Dリスト").Select  If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter  Range("B4").AutoFilter  Selection.AutoFilter field:=1, Criteria1:=Worksheets("元データ").Range("C3") '整合性チェック  Dim name_A As String  Dim name_B As String  Dim name_C As String  Dim name_D As String  name_A = Worksheets("Aリスト").Cells(65536, 4).End(xlUp).Value  name_B = Worksheets("Bリスト").Cells(65536, 4).End(xlUp).Value  name_C = Worksheets("Cリスト").Cells(65536, 4).End(xlUp).Value  name_D = Worksheets("Dリスト").Cells(65536, 4).End(xlUp).Value  If name_A <> name_B <> name_C <> name_D Then   MsgBox "データ不整合を発見しました。 処理を中断します。", vbCritical   Exit Sub  ElseIf mykouiji_kouji = name_nyukin = name_kokyaku = name_uriage Then   MsgBox "問題なし。"  End If End Sub

  • 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】実行中に「型が一致しません」というエラーが発生します。 http://d.hatena.ne.jp/language_and_engineering/20090710/p1 上記URLの中の『もっと楽にコーディングしたい』項のコードを実行すると、 getElementByIdの引数のところで、 「型が一致しません」 というエラーが発生します。 原因がわからないのでわかる方居らっしゃったらお答えいただければと思います。 環境は以下のとおりです。 Window 7 IE 9 Excel 2003 おそらく上記環境が原因かと思うのですが…

専門家に質問してみよう