Excel: SQL実行関数のエラー原因を知るには?

このQ&Aのポイント
  • ExcelでSQL実行関数のエラーが発生し、パラメーターが少なすぎるというエラーメッセージが表示されています。
  • 作成している関数はDBLookup()とCnnExecute()で、どちらも一度は正常に動作しましたが、再度実行するとエラーが発生しました。
  • 質問者はエラーの原因を特定できず、他の人のアドバイスを求めています。
回答を見る
  • ベストアンサー

Excel:SQL実行関数のエラー原因を知るには?

 年甲斐もなく昨日からSQLでExcelデータを参照、更新、削除する二つの関数の作成に挑戦しています。が、 >[Microsoft][ODBC Excel Driver] パラメーターが少なすぎます。 >1を指定してください。 とのエラーで立ち往生中。  作成しているのは、SELECT文を実行するDBLookup()とUPDATE文、INSERT文、DELETE文を実行するCnnExecute()の二つ。どちらも、添付図のようにTESTに成功。で、一旦、Excel を閉じて、もう再テスト。すると、前述のエラーに遭遇。一度だけDBLookup()が正常に動いたのでCnnExecute()も再テスト。すると、前述のエラーが発生。同時に、DBLookup()も動かなくなりました。で、その後、5時間の試行錯誤中。だが、手詰まり感強く質問することに。このようなバグ取りで他者に質問と言う形で助けを求めるのは実に情けないことです。そこは、大目に見て下さい。 【質問】どういうアプローチをすべきと思いますか? 【DBLookup()のコード】 Public Function DBLookup(ByVal strQuerySQL As String, _              Optional xlFileName As String = "", _              Optional returnValue As String = "") As Variant On Error GoTo Err_DBLookup   '   ' 【要参照設定】   '   ' Micrsoft ActiveX Data Objects 2.8 Library   '   Dim DataValue   Dim cnn As ADODB.Connection   Dim rst As ADODB.Recordset   Set cnn = New ADODB.Connection   Set rst = New ADODB.Recordset   '   ' ThisWorkbook.FullName の指定   '   If Not Len(xlFileName) Then      xlFileName = ThisWorkbook.FullName   End If   '   ' 接続設定   '   With cnn     .Provider = "MSDASQL"     '     ' 32bit     '     'cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _     '           "DBQ=" & xlFileName & ";" & _     '           "ReadOnly=False;"     '     ' 64bit     '     .ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _               "DBQ=" & xlFileName & "; ReadOnly=False;"     .Open     '     ' 列の読み込み     '     With rst       .Open strQuerySQL, cnn, adOpenStatic       If Not .BOF Then         .MoveFirst         DataValue = .Fields(0) & ""       End If     End With   End With Exit_DBLookup: On Error Resume Next   rst.Close   cnn.Close   Set rst = Nothing   Set cnn = Nothing   DBLookup = IIf(Len(DataValue), DataValue, returnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function 【CnnExecute()のコード】 Public Function CnnExecute(ByVal strSQL As String, _               Optional xlFileName As String = "") As Boolean On Error GoTo Err_CnnExecute   '   ' 【要参照設定】   '   ' Micrsoft ActiveX Data Objects 2.8 Library   '   Dim isOK As Boolean   Dim DataValue   Dim cnn As ADODB.Connection   isOK = True    Set cnn = New ADODB.Connection   '   ' ThisWorkbook.FullName の指定   '   If Not Len(xlFileName) Then      xlFileName = ThisWorkbook.FullName   End If   '   ' 接続設定   '   With cnn     .Provider = "MSDASQL"     '     ' 32bit     '     'cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _     '           "DBQ=" & xlFileName & ";" & _     '           "ReadOnly=False;"     '     ' 64bit     '     cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _               "DBQ=" & xlFileName & ";" & _               "ReadOnly=False;"     .Open     .Execute strSQL   End With Exit_CnnExecute: On Error Resume Next   cnn.Close   Set cnn = Nothing   CnnExecute = isOK   Exit Function Err_CnnExecute:   isOK = False   MsgBox "SQL 文の実行時にエラーが発生しました。(CnnExecute)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_CnnExecute End Function  「あっ、これは、多分、こういうことだな!」という思われた方は、気軽にご回答ください。

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

  • ベストアンサー
  • mabyos
  • ベストアンサー率52% (61/117)
回答No.1
f_a_007
質問者

お礼

 回答ありがとうございます。昨晩の23時頃に、私も紹介のサイトを発見。で、全く、同じエクセルを再現してテスト。すると、OK。だが、再テスト用のエクセルではエラー発生。つまり、同記事の言う通りでした。 対策1、接続拡張プロパティも指示する。 対策2、SQL文からミスを追放する。 ・ヘッダーの有無の指示・・・・・・・・・・・DBLookup()に1行追加 ・テーブル構造のデータの位置と範囲の指定・・SQL文を適正化  ここ過程で、 DBLookup() cnn.Provider = "MSDASQL" ‥‥ BLookup() cnn.Provider = "Microsoft.ACE.OLEDB.12.0" ‥‥ と、DLookup()も作成。で、どちらともに、同じ現象であることも確認。もって、接続設定ではなくて紹介サイトの指摘通りとの確信を深めつつあります。  なお、質問は、午後20時に削除を試みたのですが、いわゆる《設定》ボタンを見つけられずに放置した次第です。ご迷惑をおかけしました。

その他の回答 (1)

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.2

MsgBox (DBLookup("select 読み from [Sheet1$B2:Z123] where 顧客名='鈴木 一郎'")) とするか、 Sheet1のA列と1行目を削除することで改善しませんでしょうか?

f_a_007
質問者

お礼

回答ありがとうございます。先のお礼に書いた通りです。 HohoPapaさんの指摘の通り。原因は、2つでした。拡張プロパティでヘッダの有無をちゃんと宣言し、かつ、 [Sheet1$B2:Z123]とデータ領域も指定することで解決するようです。 しかし、20年振りのVBA関数への挑戦。70歳なのに、ちょっと胸が躍っています。なお、ベストアンサーは、トップの方にしますが悪しからず・・・。

関連するQ&A

  • ACCESSを活用して商品変動を捉えたい(5再再)

    http://okwave.jp/qa/q8782706.html 上記について標準モジュールも作成して、先のクエリーを実行しましたが、 その際に !コンパイル エラー: ユーザー定義型は定義されていません。 と出ます。 5行目の rst As ADODB.Recordset 箇所が反転されています。 一回でできるのは魅力なのですが、本当に実装できるのでしょうか。 (クエリーはたしかに保存できました) Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function

  • Excelを更新するADOの書き方を教えて下さい。

      .Provider = "MSDASQL"   cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _               "DBQ=" & xlFileName & ";" & _               "ReadOnly=False;"   If isHeader Then     .Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1"   Else     .Properties("Extended Properties") = "Excel 12.0;HDR=NO;IMEX=1"   End If   .Open   .Execute strSQL という書き方では、動作します。また、"Microsoft.ACE.OLEDB.12.0;"バージョンでも   cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strDB & ";"   With cnn      .Errors.Clear      .BeginTrans      .Execute strSQL      .CommitTrans   End With という書き方で、Access の mdb は更新できます。エクセルのシートを Recordset としてオープンすれば、下記の接続設定でも読むことは出来ます。非同期を指定すれば、エラーは回避できますがシートは更新されていません。当方、VBAを書くのは1996年以来。なんとか、この問題を解決して一区切りを付けたいと思っています。宜しく、ご協力の程お願いしておきます。 Public Function SQLExecute(ByVal strSQL As String, _               Optional xlFileName As String = "", _               Optional isHeader As Boolean = True) As Boolean On Error GoTo Err_SQLExecute   Dim isOK As Boolean   Dim DataValue   Dim cnn As ADODB.Connection     isOK = True   Set cnn = New ADODB.Connection   '   ' ThisWorkbook.FullName の指定   '   If Not Len(xlFileName) Then      xlFileName = ThisWorkbook.FullName   End If   '   ' 接続設定   '   With cnn     .Provider = "Microsoft.ACE.OLEDB.12.0;"     If isHeader Then       .Properties("Extended Properties") = "Excel 12.0;HDR=YES;IMEX=1"     Else       .Properties("Extended Properties") = "Excel 12.0;HDR=NO;IMEX=1"     End If     .Open xlFileName     .Errors.Clear     .BeginTrans     .Execute strSQL     .CommitTrans   End With Exit_SQLExecute: On Error Resume Next   cnn.Close   Set cnn = Nothing   SQLExecute = isOK   Exit Function Err_SQLExecute:   isOK = False   If cnn.Errors.Count > 0 Then     ErrMessage cnn.Errors(0), strSQL     cnn.RollbackTrans   Else     MsgBox "プログラムエラーが発生しました。" & _         "システム管理者に報告して下さい。(SQLExecute)", _         vbExclamation, " 関数エラーメッセージ"   End If   Resume Exit_SQLExecute End Function

  • Excel実行時エラー[80004005]について

    ExcelのVBAにてSQLのSELECT文を実行し、取得したデータを一覧表示する仕組みを作っています。 同じプログラムを使用者する者7名の内、1名のみ以下のエラーが発生しています。 どのように対応すればよいか、ご教示ください。 環境 Excel2010 状況 SELECTの実行時 「実行時エラー[80004005] [Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバーが見つかりません。」 実行ソース Private Sub exeSelect(sheetNm as string ,sqlSt as String) Dim i As Integer Dim j As Integer Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim bookNm As String bookNm = ThisWorkbook.FullName Set cn = New ADODB.Connection cn.Provider = "MSDASQL" cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & bookNm & "; ReadOnly=False;" cn.Open←ここでエラー Set rs = New ADODB.Recordset rs.Open sqlSt, cn, adOpenStatic j = START_ROW Do Until rs.EOF For i = 0 To rs.Fields.Count - 1 Worksheets(sheetNm).Cells(j, i + 1).Value = rs(i).Value Next j = j + 1 rs.MoveNext Loop rs.Close cn.Close End Sub

  • ACCESSへの更新に関して

    以下のような記述をして、VBからACCESSのテーブルに書き込みを行おうとしています。 その際に、開発をしているVisual Basic2008のデバックモードでは、問題なくACCESSに 更新ができますが、コンパイルしてできあがった"EXE"から実行した場合、ACCESSへの更新ができません。 エラーが起こっているかと思い、updateのあるfor文にポップアップを出すような仕掛けを作り、試してみましが、 そこを通過するものの、エラーも何も起こらずに正常終了してしまいます。 何が原因でしょうか。。。教えて下さい。 環境  Windows7/ACCESS2000/VB2008/参照設定:Microsoft ActiveX Data Objects 2.8 Library   'データベースファイル名 Dim dname As String = "C:\test.mdb" 'データベースパラメータ Dim strDatbasePara As String Dim Cnn As New ADODB.Connection Dim Rst As New ADODB.Recordset strDatbasePara = "Provider=Microsoft.Jet.OLEDB.4.0;" + _ "Data Source=" + dname + ";" + _ "Jet OLEDB:Engine Type=5;" Try Cnn.Open(strDatbasePara) Rst.Open("table", Cnn, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic) If Rst.EOF Then For jcount = 0 To icount - 1 Rst.AddNew() Rst.Fields("項目1").Value = "AAA" Rst.Update() Next End If Rst.Close() Catch ex As Exception smsg = "失敗しました。" MessageBox.Show(smsg, "更新", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try Cnn = Nothing Rst = Nothing

  • 関数内でのSQL文実行→エラー検知されない・・・。

    いつもお世話になってます。 sasakidと申します。 現在、ASPで開発を進めています。 エラーが発生したらエラーページに飛ぶように適所に 以下の文を入れています。 '------エラー処理-------- If Err.Number <> 0 Then  Call goto_ErrPage() ←…エラーページに飛ぶ関数 End If ほとんどの個所でエラーページに飛ぶことを確認しました。 今、困っていることはSQL文を実行する関数内で SQL文にエラーがあったとしてもどうやらエラーが検知されていないようなのです。 '=====SQL文実行関数=========== Function exeSql1(sql) exeSql1 = -1 'エラーセット sql = sql & "ORDER BY test" '←…エラーが出るように追加    Set rs = db.Execute(sql) If Err.Number <> 0 Then Set rs = Nothing Exit Function End If (中略) exeSql1 = 0 End Function '======本文================== (中略)   tmp = exeSql1(sql) If tmp <> 0 Then '戻り値がエラー(0以外)だったらエラー画面へ Call goto_ErrPage() ←…エラーページに飛ぶ関数 End If (後略) ------------------------- どんなに関数:exeSql1で実行されるSQL文にエラーを含めてもエラーページに飛びません。 本文中で実行しているSQL文にエラーが含んでいるとエラーページに飛ぶのですが・・・。 こんな現象の原因などわかる方がいらっしゃいましたら教えてください!!! よろしくお願いします。     

  • ダイアログボックスを表示したい。

    下記処理コードを実行したときに、 ファイル選択のダイアログ表示をさせるのにファイル名を決まった形にしないと駄目みたいです。 (例)strLookupFileName = "abcms_E000_H*.csv;" ファイル名に関係なくダイアログを表示させるにはどうしたら良いのでしょうか? 今現在、ファイル名を適当なものに変えると「キャンセルされました。」のメッセージボックスが表示されます。 例:strLookupFileName = "abc明細.xls"←エラー(これでも可に) (処理コード) 'ファイル選択 strFileName = FileNameGet(Me.Hwnd, strHomeDirectory, strLookupFileName, "CSV ファイル", "ファイル選択") If strFileName = "" Then MsgBox "キャンセルされました。", vbInformation + vbOKOnly, " " Exit Sub End If ↓ Public Function FileNameGet(Owner As Variant, DefaultDirectory As String, DefaultFilter As String, DefaultFilterName As String, Title As String) As Variant On Error GoTo Err Dim dlg As OPENFILENAME Dim rslt As Long dlg.hwndOwner = Owner dlg.hInstance = 0 'dlg.nFilterIndex = 0 dlg.lpstrTitle = Title & Chr(0) & Chr(0) dlg.lpstrFileTitle = Space(256) & Chr(0) & Chr(0) dlg.lpstrInitialDir = DefaultDirectory & Chr(0) & Chr(0) dlg.lpstrFile = DefaultFilter & Space(256) & Chr(0) & Chr(0) dlg.lpstrFilter = DefaultFilter & Chr(0) & Chr(0) dlg.nMaxFile = Len(dlg.lpstrFile) dlg.nMaxFileTitle = Len(dlg.lpstrFileTitle) dlg.lStructSize = Len(dlg) rslt = GetOpenFileName(dlg) If rslt = 0 Then FileNameGet = "" Exit Function End If 'ファイル名チェック If IsNull(dlg.lpstrFile) Or dlg.lpstrFile = "" Then MsgBox "ファイル名が取得できませんでした。", vbInformation + vbOKOnly, " " FileNameGet = Null Exit Function End If 'FileNameGet = StrConv(MidB(StrConv(dlg.lpstrFile, vbFromUnicode), 1, (dlg.nFileExtension + 3)), vbUnicode) FileNameGet = Left$(dlg.lpstrFile, InStr(dlg.lpstrFile, vbNullChar) - 1 On Error GoTo 0 Exit Function Err: MsgBox Err.Description End Function

  • エクセルVBA アクセスにインポート

    エクセルのデータ(列数、行タイトルは都度かわる)をアクセスにインポートしテーブルを作成したいと思っています。 VBAでこの処理をおこないたく、下記のコードで実行したのですがデバッグがはしってしまいます。 (DとEでデバッグ) 原因がお分かりになる方がおりましたら、教えていただけますでしょうか? 何卒、よろしくお願い申し上げます。 Function ExcelDataImport() 'On Error GoTo エラー Dim varac As Variant Dim varxls As Variant Dim strrange As String Dim strmsg As String varac = "T_TESTTABLE" ' --- A varxls = "C:\Users\AC\Desktop\ACTEST\RAWDATA.xlsx" ' ---B strrange = "TEST_RAWDATA" ' --- C strmsg = "Excelファイル" & varxls & " を、Accessテーブル " & varac & _ "へ、データ入力を行います。" & Chr(13) & _ "Excelファイルの入力レンジは、 " & strrange & " です。" DoCmd.DeleteObject acTable, varac ' --- D If MsgBox(strmsg, vbOKCancel) = vbOK Then DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ varac, varxls, True, strrange ' -- E MsgBox "データ入力は、正常に完了しました。" End If Exit Function エラー: MsgBox "予期せぬエラーが発生しました。" & Chr(13) & _ "エラー番号:" & Err.Number & Chr(13) & _ "エラー内容:" & Err.Description, vbCritical Exit Function End Function

  • Excel:自作のセル関数でエラーが発生

    Win2K、Excel97-2000-2002を使用しております。 以下のような関数を作成しました。 Public Function sss() As Boolean  On Error GoTo aaa   Range("A1").Value = "TEST"  sss = True Exit Function aaa:  MsgBox Err.Description  sss = False End Function これをSheet1のB1セルで呼びましたところ、 Rangeへのセットのところで以下のようなエラーが発生します。 「アプリケーション定義またはオブジェクト定義のエラーです。」 同関数をイミディエイトウインドウで実行しましたところ、正常に動きます。 セルの内容を変更するようなメソッドをセル関数として呼ぶことはしてはいけないのでしょうか。 御教授、御鞭撻の程、よろしくお願いいたします。

  • On ErrorでエラーNoが0

    On ErrorでエラーをトラップしてエラーNOとエラー内容をダイアログに表示させています。 Private Sub pv_sample() Dim errno as Long On Error GoTo ERR_END ' 処理内容略 Exit Sub ERR_END: errno = Err.Number MsgBox "システムエラー エラーNO(" & errno & ") 内容(" & Err.Description & ")" End Sub エラーが発生した場合はErr.Numberには0以外がセットされるはずですが 「システムエラー エラーNO(0) 内容()」 というメッセージが表示されることがあります。 On Eroorで飛んできたときにエラーNoが0になってしまうことはありえるのでしょうか。

  • これらはどういう意味ですか?

    On Error GoTo ErrorHandler Me!開始日 Dim cnn As ADODB.Connection Dim rst As New ADODB.Recordset よろしくお願いします♪

専門家に質問してみよう