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

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

ただいまの
回答率

88.36%

Access ODBC ADO接続 実行時エラー「オブジェクト名'hoge'が無効です。」

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 11K+

nekomura

score 132

よろしくお願いいたします。

Accessのフォーム上のボタンイベントで、SQLserverよりテーブルデータを取得するイベントプロシージャを書いています。

取得しようとしているテーブルデータ「Q_m_kokyaku_shohin」は、実際にはクエリです。
ODBCでSQLserverより接続したリンクテーブルを、二つ使用して作っています。

しかし、実行時エラーが起きてしまい、下記コードの

Rs.Open strSQL, Cn, adOpenForwardOnly, adLockReadOnly


に黄色のカーソルがフォーカスされます。

エラー内容は、
「実行時エラー'2147217865(80040e37);
オブジェクト名'Q_m_kokyaku_shohin'が無効です。」

でした。

デバック→ステップインでコードを追っていった所、接続文字列は問題無く変数に代入されています。
その上で、原因及び修正方法を調べても解決にいたりません。
有職者の皆様にお知恵をいただきたく存じます。

Private Sub クエリ取得_Click()

    Dim Cn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Dim strSQL As String
    Dim strConnectionString As String  'SQLServer接続文字列


    strConnectionString = CStr(DLookup("connectionString", "接続文字列テーブル", "ID= 2"))
 //Access自身のテーブルに、接続文字列を入れて、その値を変数に代入しています

    strSQL = "SELECT * FROM Q_m_kokyaku_shohin"
    strSQL = strSQL & "  WHERE Q_m_kokyaku_shohin.顧客番号 like '*%'"

    Cn.ConnectionString = strConnectionString
    Cn.Open
    Rs.Open strSQL, Cn, adOpenForwardOnly, adLockReadOnly //エラーのデバッグポイントはここ

    Set Me.Recordset = Rs


    Rs.Close
    Cn.Close

    Set Rs = Nothing
    Set Cn = Nothing



End Sub

また、このクエリをの全データの中から、任意の一文字の前方一致検索に対応するデータを
取得したい
です。

初めの一文字はユーザーが入力する任意の値を想定している為、「*」を使用しています。
*から始まる任意の値です。

この記述の仕方は合っているのでしょうか…。
ネットで調べると、「初めがAの前方一致検索」など、特定のを使う方法しか出てこないもので…。
細かい部分の記述の仕方がわからず困っています。
併せてお答え頂ければ幸甚です。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • nekomura

    2016/05/10 13:37

    Suenaga様
    お世話になっております。
    Q_m_kokyaku_shohin のクエリをデザインビューで見た時の、下部にある表の部分に何か条件式があるかという意味でしょうか。
    もしそうであれば、特に条件式は指定しておりません。
    どうぞよろしくお願いいたします。

    キャンセル

  • kaz.Suenaga

    2016/05/10 13:42

    クエリの構成がわからないので見当違いかもしれませんが、そのクエリで利用しているデータは更に別のクエリを利用していたりしませんか(つまりクエリを使ったクエリになっていませんか)。

    そのクエリ[Q_m_kokyaku_shohin]からデータテーブルにたどり着くまでに経由する全てのクエリでワイルドカードが使われていないかが気になります。

    キャンセル

  • nekomura

    2016/05/10 13:53

    suemaga様
    当該クエリは、リンクテーブルを二つ合わせたもので、クエリを使ったクエリではありません。
    初心者の為、
    >データテーブルにたどり着くまでに経由する全てのクエリでワイルドカードが使われていないかが気になります。
    の辺りがいまいち理解できないのですが、クエリを作った際に何か条件式をつけていないか?ということですよね。
    ご回答併せて、少し落ち着いて調べてきます。
    まだ自分では方向性を広げて考えることが出来ていないので、たくさんのご指摘・アドバイスは本当に助かります。ありがとうございます。

    キャンセル

回答 4

checkベストアンサー

+1

WHERE句をコメントアウトしても同様のエラーという事は、クエリ[Q_m_kokyaku_shohin]を開く時点でエラーが発生していると考えられます。

まずはクエリ[Q_m_kokyaku_shohin]が適切に開けるようにしてみましょう。

随分前の記憶なので曖昧な書き方になります。
ADOを利用している場合、Accessのクエリで利用しているワイルドカード「*」「?」と、一般のSQL(ANSI規格)でのワイルドカード「%」「_」が異なっているため、適切にクエリが実行できないことがあります。
クエリ側にワイルドカードが含まれている場合はそれをなくせないか、VBA内でWHERE句を作ることで回避できないかをご検討ください。

ひとまず概要までですが。


書いてから気づきましたが、違いますね。

[Q_m_kokyaku_shohin]はAccessのクエリですよね。
コネクションCnはSQLServerに対するものですよね。

そうだとして。
SELECT * FROM Q_m_kokyaku_shohin では、[Q_m_kokyaku_shohin]はSQLServer側になければいけません。

まず、SQLServerで正常に実行できるSQL文を作ってみましょう。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/10 13:56

    Suenaga様
    >[Q_m_kokyaku_shohin]はAccessのクエリですよね。
    >コネクションCnはSQLServerに対するものですよね。
    はい、そうです。

    >まず、SQLServerで正常に実行できるSQL文を作ってみましょう。
    なるほど…いわれて落ち着いて考えてみれば確かに。
    早速作ってきます!
    真摯なアドバイスに感謝いたします。

    キャンセル

  • 2016/05/10 15:38

    suenaga様
    SELECT * FROM Q_m_kokyaku_shohin → SELECT * FROM リンクテーブル名
    と書き直したのですが、エラー内容はオブジェクト名が変わるのみで同じでした…orz
    何か、前後の記述が良くないのでしょうか。(ADO接続文など)
    一旦、自身で整理して再度質問してみたいと思います。

    たくさんのヒントや方向性を頂き大変ためになったので、ベストアンサーとさせていただきます。

    キャンセル

+1

クエリ名Q_m_kokyaku_shohinが間違っているということはないでしょうか?

また、問題を切り分けるために

strSQL = "SELECT * FROM Q_m_kokyaku_shohin"
strSQL = strSQL & " WHERE Q_m_kokyaku_shohin.顧客番号 like '*%'"


上記を下記のようにしてもエラーは出ますか?

strSQL = "SELECT * FROM Q_m_kokyaku_shohin"

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/10 13:05

    skuromaku様
    いつもお世話になっております。
    ご回答ありがとうございます。
    >上記を下記のようにしてもエラーは出ますか?
    >strSQL = "SELECT * FROM Q_m_kokyaku_shohin"
    はい、LIKE句のほうはコメントアウトして実行したのですが、エラー内容は同じでした…。
    また、クエリ名に誤りはありませんでした。
    以上、踏まえてさらに何かご教示がいただけるようでしたらまたよろしくお願いいたします。

    キャンセル

+1

環境がなく確認できませんが、Cn.Openでエラーにはなっていませんか?
(エラーが検知できるのかはわかりませんが・・・)
またIDとパスワードの指定がなさそうですが、接続文字列に含まれているということでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/10 13:18

    ttyp03様
    ご回答ありがとうございます。

    >環境がなく確認できませんが、Cn.Openでエラーにはなっていませんか?
    Cn.Openの部分ですが、デバックモードで確認したところ「Cn」には接続文字列の値が代入されているのでエラーでは無いのかと…(すみません、初心者なもので絶対にエラーでないかはわからないのですが)。

    >またIDとパスワードの指定がなさそうですが、接続文字列に含まれているということでしょうか?
    はい、Access自身のテーブルに、接続文字列を入れて、その値を変数に代入しています(strConnectionString)。
    windows認証の接続文字列なため、IDとパス表記はありません。
    また接続文字列には、誤りはありません。

    以上踏まえてまたおわかりな事がございましたらご教示いただきたく存じます。
    どうぞよろしくお願いいたします。

    キャンセル

+1

一度、エラートラップを入れてみて、エラー箇所を特定してみてはどうでしょうか?

Private Sub クエリ取得_Click()
On Error GoTo myError '★追加
    Dim Cn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Dim strSQL As String
    Dim strConnectionString As String  'SQLServer接続文字列


    strConnectionString = CStr(DLookup("connectionString", "接続文字列テーブル", "ID= 2"))
 //Access自身のテーブルに、接続文字列を入れて、その値を変数に代入しています

    strSQL = "SELECT * FROM Q_m_kokyaku_shohin"
    strSQL = strSQL & "  WHERE Q_m_kokyaku_shohin.顧客番号 like '*%'"

    Cn.ConnectionString = strConnectionString
    Cn.Open
    Rs.Open strSQL, Cn, adOpenForwardOnly, adLockReadOnly //エラーのデバッグポイントはここ

    Set Me.Recordset = Rs


    Rs.Close
    Cn.Close

    Set Rs = Nothing
    Set Cn = Nothing


    Exit Sub '★追加
myError: '★追加
    MsgBox "エラー番号:" & Err.Number & vbCrLf & "エラーの種類:" & Err.Description, vbExclamation '★追加
End Sub

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/10 13:41

    skuromaku様
    お世話になっております。
    >エラートラップを入れてみて、エラー箇所を特定してみてはどうでしょうか?
    このようなエラーの特定の仕方は知らなかったので、とても勉強になりました!
    また、丁寧なサンプルコードもありがとうございます!早速ためさせて頂きました。
    結果は、
    「エラー番号2147217865
    エラーの種類:オブジェクト名'Q_m_kokyaku_shohin'が無効です。」
    でした…。

    キャンセル

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

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

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