質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.45%

  • VBA

    2397questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1974questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Access

    621questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Excel vba のエラー「オブジェクト変数またはWithブロック変数が設定されていません」を解決できない

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,725

miniryu

score 9

当方、はじめて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)

まず、デバッグするときは、エラー処理はコメントにしましょう。

ご指摘のとおりしましたところ、次の行にエラーが出ておりました。

adoRs.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

今回の問題に関係があるかもしれませんので、別のモジュールに書かれてあるコードを併載させていただきます。
どうぞよろしくお願いします。

Option Explicit

'---ACCESS接続用
Private adoCn As Object
Private adoRs As Object
Private strSQL As String

'データベースに接続
Sub ConnectDB(flg As Boolean)   
    Dim DBpath As String

    'DBpath = ThisWorkbook.Path
    DBpath = "\\○○○\○○○\○○○"
    If flg = True Then Set adoRs = CreateObject("ADODB.Recordset")

    Set adoCn = CreateObject("ADODB.Connection")
    adoCn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source = " & DBpath & "\○○○.mdb;"
End Sub

'データベースを切断
Sub CutDB(flg As Boolean) 

    If flg = True Then adoRs.Close
    adoCn.Close
    Set adoRs = Nothing
    Set adoCn = Nothing
End Sub
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

0

まず、デバッグするときは、エラー処理はコメントにしましょう。

'    On Error GoTo Err_Handler   'エラーが起きたら"Err_Handler"


これでエラーが発生したら、エラー箇所が黄色反転表示されるので、
原因を特定しやすくなります。

そして、実行してください。エラーが出たときにどの行が反転表示されるか、
提示してください。
あと、正確なエラーメッセージも提示してください。

話は、それからです。

追記

指摘1
今回のエラーと関係ないですが、下記はあきらかに間違いです。

If strSQL Like "*" & TextBox1.Value & "*" Or strSQL Like "*" & TextBox2.Value & "*" Then  '検索が一致すれば(結果をリストボックスに表示)

strSQL はただの文字列です。これを Likeで比較しても検索などできません。

どのような「検索」がしたいのですか。言葉で説明してみてください。
特に検索対象フィールドは何か、どのような条件で検索するのかを説明してください。

指摘2
SurchList というのはフォーム上のリストボックスですか。だとしたら、
Me.SurchList というように記述しましょう。そうすれば、フォーム上のコントロールだと他人にも分かります。フォーム上のコントロールなら、Dim SurchList As Object Set SurchList = ○○ というコードは必要ないです。すでにフォーム上に実体が存在しているので。

同様に、TextBox1.Value も Me.TextBox1.Value と記述したほうが読みやすい紛れのないコードになります。

追記2

adoRs.Open strSQL, adoCn でエラーがでるとのことなので、adoRs か adoCn が正しく生成されていないということだと思われます。

質問者さんの追記で「おそらくadoRsはConnectDB関数の中で操作しているはずです。」との指摘にたいして、「確認できました。」と回答してますので、そのConnectDB関数内のコードに問題があるはずです。ADOのコネクション、レコードセットに生成、開き方については、いろいろな方法がありますが、ネット検索すれば、サンプルコードが多く見つかるので、それと現状のConnectDB関数内のコードを比較して、間違いを探してください。
例えば、下記は「ADO レコードセット 開く」でググって最初に出てくるものです。

アクセスVBA講座\_ADO\_Recordsetオブジェクトの作成

上記のリンク先はAccess VBAなので、Excelなら、下記のほうがいいかな。

テーブルへの接続とレコードの取得 \- 覚え書き ExcelVBAでデータベース操作

それでわからなければ、ConnectDB関数のコードを提示してください。ただ、やり取りが長くなったので、新規に質問しなおしたほうがいいかも知れませんね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/15 10:44

    ご回答ありがとうございます。ご指摘いただいた点について、質問欄に追記させていただきました。どうぞよろしくお願いいたします。

    キャンセル

  • 2018/03/15 11:18

    回答に追記しましたので、確認してください。

    キャンセル

  • 2018/03/15 11:22

    ありがとうございます。やり方を調べてみて、分からなかったら新規でまた質問させていただきたいと思います。とても勉強になりました。

    キャンセル

  • 2018/03/15 11:27

    あと、検索条件の設定についても修正する必要がありますが、まずは、ConnectDB関数で、コネクション、レコードセットの生成ができるようになってからですね。これも一つの質問にまとめてしまうと、今回のように煩雑で長いやり取りになる可能性があるので、まずは、次の質問で「ConnectDB関数」を完成させてから、次に新規で、検索条件について質問するというように分けたほうがいいでしょう。

    キャンセル

0

SurchList が宣言されていないからでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/14 15:43

    早速ありがとうございます。
    Dim SurchList As Object を追加してみましたが、やはり同じ症状でした。。

    さきほど気づいたのですが、イミディエイトウィンドウにエラーメッセージと一緒に
    「SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2 FROM 顧客マスター」
    が表示されていました。

    ここがおかしいのかもしれませんが、書籍やネットで参照した感じだと、これで合ってそうなので、どう間違っているのか分かりません。

    何かお分かりになりませんか?

    キャンセル

  • 2018/03/14 15:45

    どんなエラーが出ているのか意訳せず正確に書いてください。
    ここではなく質問に追記する形でお願いします。

    キャンセル

  • 2018/03/14 15:57

    adoRs がただの Object ではないですか?
    何か入れていますか?
    SurchList もそうです。

    キャンセル

  • 2018/03/14 21:18

    >「SELECT 顧客コード,姓,名,住所1,住所2,電話番号1,電話番号2 FROM 顧客マスター」
    > が表示されていました。

    エラーハンドラー内で、
    Debug.Print strSQL
    としているので、strSQL の内容が表示されているだけです。
    とりあえず、On Error GoTo Err_Handler の行をコメントアウトしましょう。

    キャンセル

0

おそらくSurchList の実体がない。もしくは参照されていないのでしょう。
その状態で

with SurchList 

としても何を用いて今後の処理を行えばよいか、vbaさんは理解してくれないのです。

dim SurchList as ○○ ←型を宣言
set SurchList = ○○ ←インスタンス(実体)への参照を作る
そのあとでwithを使いましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

すみません、本回答ではありません。
(追記2)について。

Set adoRs = ○○
Set SurchList = ○○
という記述が必要だということでよろしいでしょうか?

違います。

おそらくadoRsはConnectDB関数の中で操作しているはずです。
ご確認ください。
何もしてなかったらそれはひとつの原因です。

SurchListは画面上に貼り付けたリストボックスのはずです。
プロパティを確認し、同じ名前であるか確認してください。

余談ですが、Surchのスペルが間違っているのが気になります(Searchですね)


改めてまじめに見てみました。
エラーメッセージから推察すると、Withブロックかオブジェクトがおかしいということになります。
コード中唯一のWithブロックは確認いただいたように、SurchListリストボックスを指しているということで問題ないでしょう。
となると他のオブジェクト(Object)が想定しているオブジェクトで構成されていないものと思われます。
提示されているコード中で明示的にオブジェクトを生成している箇所はありません。
最初に回答したように、またご確認いただいたように、ConnectDB関数内でadoCn,adoRsのオブジェクトを生成しているはずなので、そこに問題があると思われます。
つまりデータベースに接続できていないなどの問題があるのではと思います。
ConnectDB関数を呼び出し後、adoRs.Openをしている場所にブレークポイントを置いて、adoRsの状態を確認してみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

adoRsにADODB.RecordsetをNewしてないんじゃないですか?

'adoRs.Open strSQL, adoCn
set adoRs = adoCn.Execute(strSQL)


それかこれでいいのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/15 11:34

    ご回答ありがとうございます。レコードセットの開き方を勉強してみます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • VBA

    2397questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1974questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Access

    621questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

  • トップ
  • VBAに関する質問
  • Excel vba のエラー「オブジェクト変数またはWithブロック変数が設定されていません」を解決できない