• ベストアンサー

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

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

  • ベストアンサー
回答No.2

> この場合は、参照設定を最初に疑って下さい。 これは、リスクというよりも心構えの問題。で、本当のリスクはADOがサポートされなくなること。し、しかし、それはありえない話と思いますよ。そんなことをしたら、世の中大混乱。心配は無用と言えます。ADO機能を活用するのは、Accessソフトの開発者としては当たり前のことですから・・・。

その他の回答 (1)

回答No.1

http://www.accessclub.jp/actips/tips_32.htm http://accessvba.pc-users.net/ado/ ADO機能を利用する場合は、参照設定を!

mcdone
質問者

お礼

おおおーーすごい。できました! 参考までにW7以上、ACCESS2007以降であれば、以下リスクは問題ないのでしょうか。 (それとも随時いずれかが変わった際には、検証必要でしょうか) > 同じAccess、OSのバージョンであれば問題は発生しませんが、これらバージョンが異なればAccessが動作しないという現象が現れます。 この場合は、参照設定を最初に疑って下さい。

関連するQ&A

  • 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  「あっ、これは、多分、こういうことだな!」という思われた方は、気軽にご回答ください。

  • Access2003でスタック領域不足エラー

    帳票形式フォームの参照整合性設定された表形式サブフォームから全レコードを削除する為、下記のモジュールを作成しました。しかし、実行すると「28:スタック領域が不足しています。」のエラー表示でフリーズ状態となってしまいます。エラーとなるのは毎回ではありません。原因と回避方法をご教示下さい。 連鎖削除設定して主レコードを削除する方法しかないのでしょうか? On Error GoTo Err_削除_Click Dim MyAnswer As Variant, MyRs As DAO.Recordset Set MyRs = Me.SubForm.Form.Recordset MyRs.MoveFirst Do Until MyRs.EOF MyRs.Delete MyRs.MoveNext 'ここでエラーとなります。 Loop Recovery_削除_Click: Set MyRs = Nothing Exit_削除_Click: Exit Sub Err_削除_Click: If Err.Number = 3021 Then Resume Recovery_削除_Click Else MsgBox Err.Number & ":" & Err.Description Resume Exit_削除_Click End If

  • accessについて<BOFとEOFのいずれかがTUREになっているか・・・現在のレコードが必要です>

    Private Sub kensaku_Click() On Error GoTo Err_kensaku_Click Screen.PreviousControl.SetFocus Dim ss As String Dim rs As String Dim strSQL As String Dim rstType As ADODB.Recordset Set rstType = New ADODB.Recordset ss = text.text strSQL = "Select 見積日 From 見積 where 提出見積No ='" & ss & "'" rstType.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText If ss = "" Then MsgBox ("提出見積Noを入力してください") ElseIf rstType.EOF = False Then While rstType.EOF = False rs = rstType.GetString MsgBox (rs) rstType.MoveNext Wend kikaiNo.Value = "222" Else MsgBox ("提出見積Noが存在しません") End If Exit_kensaku_Click: Exit Sub Err_kensaku_Click: MsgBox Err.Description Resume Exit_kensaku_Click End Sub 以上は書いた検索のコードですが、<BOFとEOFのいずれかがTUREになっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です>というエラーが出てきます。問題がどうかよくわかりませんので、教えていただけませんか。

  • ExcelからAccess2013DBを更新する時

    Excel2013 vba-> Access2013 mdbファイル 問題点:以下のソースを実行すると、エラーが発生します。このエラーをなくしてアクセスデータベースのテーブルの情報の更新、新規追加、削除を行いたいです。 エラー内容:実行時エラー'3251' 現在のRecordsetは更新をサポートしていません。プロバイダーか、選択されたロックタイプの限界の可能性があります。 ソース: Sub 登録処理()   Dim Rst As adodb.Recordset   Dim SQL As String   Dim Rg As Range   Dim RgData As Range   Dim lngLastRow As Long   Dim RgDel As Range      On Error GoTo errH      Set RgData = mySh.Range("B2")   lngLastRow = RgData.End(xlDown).Row   Set RgData = mySh.Range(RgData, mySh.Range("AB" & lngLastRow))      SQL = "Select * from [会社管理テーブル]"   Call DBconection2   Set Rst = New adodb.Recordset   With Rst     .ActiveConnection = Cn     'SQL文でテーブル名と抽出条件を指定する     .Source = SQL     .CursorLocation = 3 ' クライアントサイドカーソルに変更     .Open        End With      Dim y As Long      Sheets("会社管理").Select      If Rst.EOF = False And Rst.BOF = False Then          For i = 1 To RgData.Rows.Count              If Cells(i + 1, 1).Value = "変更" Then         Rst.MoveFirst         Rst.Find "[施工会社ID]=" & RgData(i, 1).Value         If Rst.EOF Then                    Else           Rst.Fields("会社ID").Value = RgData(i, 2).Value           Rst.Fields("会社名").Value = RgData(i, 3).Value           Rst.Fields("フリガナ").Value = RgData(i, 4).Value              Rst.Update         End If         Cells(i + 1, 1).Value = ""       ElseIf Range(i, 1).Value = "削除" Then         Rst.MoveFirst                  Rst.Find "[会社ID]=" & RgData.Cells(i, 1).Value         If Rst.EOF Then                    Else           Rst.Delete         End If         Set RgDel = Rows(i + 1 & ":" & i + 1)         RgDel.Select         RgDel.Delete                ElseIf Range(i, 1).Value = "新規" Then         Rst.AddNew         Rst.Fields("会社ID").Value = RgData(i, 2).Value         Rst.Fields("会社名").Value = RgData(i, 3).Value         Rst.Fields("フリガナ").Value = RgData(i, 4).Value         Rst.Update         Cells(i + 1, 1).Value = ""       End If            Next i        End If exitH:      Rst.Close: Set Rst = Nothing   Call DBclose2   Exit Sub         errH:   MsgBox Err.Number & "(" & Err.Description & ")"   GoTo exitH    End Sub Sub DBconection2()   Set Cn = New adodb.Connection   Cn.Provider = "Microsoft.Jet.OLEDB.4.0"   Cn.Open modPublic.DBPATH    End Sub Function MakeDBconection() As adodb.Connection   Set Cn = New adodb.Connection   Cn.Provider = "Microsoft.Jet.OLEDB.4.0"   Cn.Open modPublic.DBPATH      Set MakeDBconection = Cn    End Function Sub DBclose2()   Cn.Close   Set Cn = Nothing End Sub Sub EraseContents(s_Rg As Range)   s_Rg.ClearContents    End Sub 誰か、解決方法がおわかりの方がいましたら、アドバイスをよろしくお願いします。

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

  • Access2010で入力した住所地をGoogle Mapsで表示させ

    Access2010で入力した住所地をGoogle Mapsで表示させる方法 下記の回答を参考にさせて頂いています。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1124264086 うまくいくのですが、もしPCがネットに接続されていない時のエラー処理を教えてください On Error GoTo エラー ~ ~上記回答のコード ~ Exit Function エラー: MsgBox "ネット接続を確認して下さい。" & Chr(13) & _ "エラーナンバー:" & Err.Number & Chr(13) & _ "エラー内容:" & Err.Description, vbOKOnly End としたのですが、エラー処理から戻ってくると、グローバルな変数がクリアされてしまいます。

  • レポート印刷時のエラー

    いつもお世話になっております。 下記のコードで、レポート印刷時にプリンタダイアログを表示させて、保存するファイル名を「仕分け作業登録リスト_AWB」にしたいと思いますが、下記のエラーがでてしまいます。 ※AWBはR-Sorting NoteのAWBの値を持ってきたいです。 エラー内容 予期せぬエラーが発生しました。 エラーナンバー:3265 エラー内容:要求された名前、または序数に対応する項目がコレクションで見つかりません。 エラー3265についてネットで調べてみましたが、自分ではわからないので、 対処方法を教えていただければと思います。 ※コードも独学なのできれいでなくてすみません。 Private Sub Cmd_Report_Click() On Error GoTo Err_Cmd_Report_Click Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset '指定したレポートを印刷プレビューで開く Dim strReportName1 As String strReportName1 = "R_Sorting Note" pdfName = "仕分け作業登録リスト_" & rs!AWB DoCmd.OpenReport strReportName1, acViewPreview DoCmd.OutputTo acOutputReport, strReportName1, acFromatPDF, pdfName, True DoCmd.RunCommand acCmdPrint 'ダイアログの表示 'プレビューを閉じる DoCmd.Close acReport, strReportName1 Exit_Cmd_Report_Click: 'プレビューを閉じる DoCmd.Close acReport, strReportName1 Exit Sub Err_Cmd_Report_Click: If Err.Number = 2501 Then 'エラーを無視する Resume Exit_Cmd_Report_Click Else MsgBox "予期せぬエラーが発生しました" & Chr(13) & _ "エラーナンバー:" & Err.Number & Chr(13) & _ "エラー内容:" & Err.Description, vbOKOnly End If Resume Exit_Cmd_Report_Click End Sub

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

    下記処理コードを実行したときに、 ファイル選択のダイアログ表示をさせるのにファイル名を決まった形にしないと駄目みたいです。 (例)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

  • access2000で作成のプログラムソースが2003で書き換わってしまう

    初めて質問させていただくバイク好きのおじさんです。 環境はOS:Windows7(Ultimate) ソフトウエア:Office2003(pro) ソフトウエア:Office2007(Ultimate) access2000で作成されたプログラムをaccess2003で今まで問題なく利用していたのですが、パソコンを変えてWindows7で利用するようになってから どのコマンドボタンをクリックしても 「イベント プロパティに指定した式 クリック時でエラーが発生しました:名前が適切ではありません:コマン_Click」というエラーで動かなくなってしまいました。 ビューモードでコマンド割り当てのソースをみてみると access2007(エラーが出ない方)抜粋では Private Sub コマンド5_Click() On Error GoTo Err_コマンド5_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "F_選手練習(メイン)" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_コマンド5_Click: Exit Sub Err_コマンド5_Click: MsgBox Err.Description Resume Exit_コマンド5_Click End Sub access2003 (エラーの起きる)抜粋では Private Sub コマン_Click() On Error GoTo Err_コマン_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "F_会員管理(参照用)" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_コマン_Click: Exit Sub Err_コマン_Click: MsgBox Err.Description Resume Exit_コマン_Click End Sub のようにソースのコマンドの割り当ての「 ド5 」が抜けてしまい、正しい方からコピーペースとしても内容が正しく書き換わりません。(全てのコマンドボタンの ド○ ) 対処法がさっぱりわからず困っております。 どなたか解決方法を知って見える方、アドバイスをいただけたらうれしいです。よろしくお願いいたします。

  • vbaで、postgresqlアクセス問題

    vbaで、postgresqlアクセス問題:      データベースに、データは ***0000, でも、vbaで、取得したのは ****.四つの0が自動に、削除されました。      例: postgresqlに、 40000 ⇒ vbaで、取得した: 4   vbaソース:  Option Explicit Sub subPgGetData() Dim adoCn As New ADODB.Connection On Error GoTo ErrLogin: With adoCn .Provider = "PostgreSQL OLE DB Provider" .Properties("Data Source") = Range("B1").Value .Properties("Location") = Range("B2").Value .Properties("User ID") = Range("B3").Value .Properties("Password") = Range("B4").Value .Open End With On Error GoTo 0 Dim adoRs As New ADODB.Recordset On Error GoTo ErrSql: adoRs.Open Range("B6").Value, adoCn, adOpenForwardOnly, adLockReadOnly On Error GoTo 0 Workbooks.Add Cells.CopyFromRecordset adoRs Cells.Columns.AutoFit adoRs.Close: Set adoRs = Nothing adoCn.Close: Set adoCn = Nothing Exit Sub ErrLogin: MsgBox "" & vbCrLf & Err.Number & vbCrLf & Err.Description Set adoCn = Nothing Exit Sub ErrSql: MsgBox "" & vbCrLf & Err.Number & vbCrLf & Err.Description Set adoRs = Nothing adoCn.Close: Set adoCn = Nothing Exit Sub End Sub わかる方はご指示ください。 よろしくお願いします。

専門家に質問してみよう