当方、はじめてVBAを書き始めている者です。変な質問になていたらすみませんが、よろしくお願いします。
<やりたいこと>
・ユーザーフォームにテキストボックス、検索ボタン、リストボックスを設置して、検索フォームを作る。
・その際、Accessのデータベースを参照する(別のモジュールに書いているのをCallしています)
<エラー内容>
実行すると、「オブジェクト変数またはWithブロック変数が設定されていません」というエラーが出てしまいます。
おそらく、下記の部分がおかしいのではないかと思うのですが・・・
If strSQL Like "*" & TextBox1.Value & "*" Or strSQL Like "*" & TextBox2.Value & "*" Then '検索が一致すれば(結果をリストボックスに表示) Do Until adoRs.EOF '抽出したレコードが終了するまで繰り返す With SurchList '該当したレコードをリストボックスに表示する .AddItem adoRs.Fields(0).Value End With adoRs.MoveNext Loop ・ ・ ・
全文は以下の通りです。
Option Explicit '---ACCESS接続用 Private adoCn As Object Private adoRs As Object Private strSQL As String Private Sub SurchButton_Click() '検索 On Error GoTo Err_Handler 'エラーが起きたら"Err_Handler"へ Call ConnectDB(True) 'データベースに接続 strSQL = "SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2 FROM 顧客マスター" '特定のフィールドを抽出 adoRs.Open strSQL, adoCn If adoRs.BOF = True And adoRs.EOF = True Then 'データがない場合、データベースを切断して終了 Call CutDB(True) MsgBox "対象データがありません。" Exit Sub End If If strSQL Like "*" & TextBox1.Value & "*" Or strSQL Like "*" & TextBox2.Value & "*" Then '検索が一致すれば(結果をリストボックスに表示) Do Until adoRs.EOF '抽出したレコードが終了するまで繰り返す With SurchList '該当したレコードをリストボックスに表示する .AddItem adoRs.Fields(0).Value End With adoRs.MoveNext Loop Else '検索に一致するものがなければ、データベースを切断して終了 Call CutDB(True) MsgBox "対象データがありません。" End If Call CutDB(True) '検索がすんだら、データベースを切断して終了 Exit Sub Err_Handler: 'エラーが起きたときの飛び先 Call CutDB(False) MsgBox Error$ Debug.Print Error$ Debug.Print strSQL End Sub
(追記)
Dim SurchList As Object を追加してみましたが、やはり同じ症状でした。。
さきほど気づいたのですが、イミディエイトウィンドウに以下のテキストが表示されていました。
「オブジェクト変数またはWithブロック変数が設定されていません。
SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2 FROM 顧客マスター」
該当箇所は書籍やネットを参照した感じだと、これで合ってそうなので、どう間違っているのか分かりません。
(追記2)
なるほど。オブジェクトについてよく理解していませんでした。
Set adoRs = ○○
Set SurchList = ○○
という記述が必要だということでよろしいでしょうか?
(追記2-2)
set SurchList = ○○ ←インスタンス(実体)への参照を作る
○○ には CreatObject("△△")を使うということで合っていますでしょうか?
取り急ぎコメントしております。自分でもここら辺のことを調べてみます。
(追記3)
おそらくadoRsはConnectDB関数の中で操作しているはずです。
おっしゃる通りで、確認できました。
SurchListは画面上に貼り付けたリストボックスのはずです。
これもその通りです(上記質問では説明不足ですみません)。ユーザーフォームに貼り付けています。
プロパティのオブジェクト名は一致しているのですが、うまく行きません……
スペルミスのご指摘ありがとうございます。恥をかかずにすみました。
ただ、まだ解決には至っておりません……
追記4(2018/03/15)
まず、デバッグするときは、エラー処理はコメントにしましょう。
ご指摘のとおりしましたところ、次の行にエラーが出ておりました。
vba
1adoRs.Open strSQL, adoCn
strSQL = "SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2 FROM 顧客マスター"
のすぐ下の行です。
エラーメッセージは次のとおりです。
実行エラー'91':
オブジェクト変数またはWithブロック変数が設定されていません。
どのような「検索」がしたいのですか。言葉で説明してみてください。
特に検索対象フィールドは何か、どのような条件で検索するのかを説明してください。
検索対象フィールドは
「姓」「セイ」「電話番号1」「電話番号2」
というのを想定しています。
リストボックスに表示させたいフィールドが
「顧客コード」「姓」「名」「住所1」「住所2」「電話番号1」「電話番号2」
でした。
検索条件についてですが、
1つめのテキストボックスに「姓」または「セイ」を入力する
2つめのテキストボックスに「電話番号」を入力する
ということを想定しています。
このうちのいずれかがデータと一致していたら、検索結果が表示されるようにしたいです。
テキストボックスは2つ用意してますが、使用するのは基本的にどちらか1つで、より絞り込んで検索したい場合は2つとも使用する、というふうに考えております。
Me.SurchList
というように記述しましょう。
修正させていただきます。ご指摘ありがとうございます。とても助かります。
追記5
今回の問題に関係があるかもしれませんので、別のモジュールに書かれてあるコードを併載させていただきます。
どうぞよろしくお願いします。
vba
1Option Explicit 2 3'---ACCESS接続用 4Private adoCn As Object 5Private adoRs As Object 6Private strSQL As String 7 8'データベースに接続 9Sub ConnectDB(flg As Boolean) 10 Dim DBpath As String 11 12 'DBpath = ThisWorkbook.Path 13 DBpath = "\○○○\○○○\○○○" 14 If flg = True Then Set adoRs = CreateObject("ADODB.Recordset") 15 16 Set adoCn = CreateObject("ADODB.Connection") 17 adoCn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source = " & DBpath & "\○○○.mdb;" 18End Sub 19 20'データベースを切断 21Sub CutDB(flg As Boolean) 22 23 If flg = True Then adoRs.Close 24 adoCn.Close 25 Set adoRs = Nothing 26 Set adoCn = Nothing 27End Sub
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/15 02:34