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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Access

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

Q&A

解決済

4回答

20757閲覧

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

nekomura

総合スコア132

VBA

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Access

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

0グッド

0クリップ

投稿2016/05/10 02:53

編集2016/05/10 04:08

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

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の前方一致検索」など、特定のを使う方法しか出てこないもので…。
細かい部分の記述の仕方がわからず困っています。
併せてお答え頂ければ幸甚です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaz.Suenaga

2016/05/10 04:01

WHERE Q_m_kokyaku_shohin.顧客番号 like '*%' の部分の意図は、*ので始まるもの、%で終わるもの、どちらのつもりですか。
nekomura

2016/05/10 04:07

suenaga様 いつもお世話になっております。 「*ので始まるもの」という意図です。 よろしくお願いいたします。
kaz.Suenaga

2016/05/10 04:15

もう1点、「顧客番号」というフィールドの型は文字列で間違いないですか。
nekomura

2016/05/10 04:23

suenaga様 ご指摘ありがとうございます。 「顧客番号」は、SQLserver上でint方、Accessのクエリでは数値型でした…orz ちなみに、 ---strSQL = "SELECT * FROM Q_m_kokyaku_shohin" strSQL = strSQL & " WHERE Q_m_kokyaku_shohin.顧客番号 like '*%'" --- の、二行目をコメントアウトしても当該エラーは出ますが、この場合も文字列でないことに何か関係はありますか。 お教えいただけると幸いです。 いつもありがとうございます。
kaz.Suenaga

2016/05/10 04:28

この後回答も書いてしまいますが、Q_m_kokyaku_shohin で書かれている中身にワイルドカード( * )が含まれている条件式がありませんか。
nekomura

2016/05/10 04:37

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

2016/05/10 04:42

クエリの構成がわからないので見当違いかもしれませんが、そのクエリで利用しているデータは更に別のクエリを利用していたりしませんか(つまりクエリを使ったクエリになっていませんか)。 そのクエリ[Q_m_kokyaku_shohin]からデータテーブルにたどり着くまでに経由する全てのクエリでワイルドカードが使われていないかが気になります。
nekomura

2016/05/10 04:53

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

回答4

0

ベストアンサー

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 04:39

編集2016/05/10 04:50
kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/05/10 04:56

Suenaga様 >[Q_m_kokyaku_shohin]はAccessのクエリですよね。 >コネクションCnはSQLServerに対するものですよね。 はい、そうです。 >まず、SQLServerで正常に実行できるSQL文を作ってみましょう。 なるほど…いわれて落ち着いて考えてみれば確かに。 早速作ってきます! 真摯なアドバイスに感謝いたします。
nekomura

2016/05/10 06:38

suenaga様 SELECT * FROM Q_m_kokyaku_shohin → SELECT * FROM リンクテーブル名 と書き直したのですが、エラー内容はオブジェクト名が変わるのみで同じでした…orz 何か、前後の記述が良くないのでしょうか。(ADO接続文など) 一旦、自身で整理して再度質問してみたいと思います。 たくさんのヒントや方向性を頂き大変ためになったので、ベストアンサーとさせていただきます。
guest

0

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

VBA

1Private Sub クエリ取得_Click() 2On Error GoTo myError '★追加 3 Dim Cn As New ADODB.Connection 4 Dim Rs As New ADODB.Recordset 5 Dim strSQL As String 6 Dim strConnectionString As String 'SQLServer接続文字列 7 8 9 strConnectionString = CStr(DLookup("connectionString", "接続文字列テーブル", "ID= 2")) 10 //Access自身のテーブルに、接続文字列を入れて、その値を変数に代入しています 11 12 strSQL = "SELECT * FROM Q_m_kokyaku_shohin" 13 strSQL = strSQL & " WHERE Q_m_kokyaku_shohin.顧客番号 like '*%'" 14 15 Cn.ConnectionString = strConnectionString 16 Cn.Open 17 Rs.Open strSQL, Cn, adOpenForwardOnly, adLockReadOnly //エラーのデバッグポイントはここ 18 19 Set Me.Recordset = Rs 20 21 22 Rs.Close 23 Cn.Close 24 25 Set Rs = Nothing 26 Set Cn = Nothing 27 28 29 Exit Sub '★追加 30myError: '★追加 31 MsgBox "エラー番号:" & Err.Number & vbCrLf & "エラーの種類:" & Err.Description, vbExclamation '★追加 32End Sub

投稿2016/05/10 04:27

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/05/10 04:41

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

0

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

投稿2016/05/10 04:02

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/05/10 04:18

ttyp03様 ご回答ありがとうございます。 >環境がなく確認できませんが、Cn.Openでエラーにはなっていませんか? Cn.Openの部分ですが、デバックモードで確認したところ「Cn」には接続文字列の値が代入されているのでエラーでは無いのかと…(すみません、初心者なもので絶対にエラーでないかはわからないのですが)。 >またIDとパスワードの指定がなさそうですが、接続文字列に含まれているということでしょうか? はい、Access自身のテーブルに、接続文字列を入れて、その値を変数に代入しています(strConnectionString)。 windows認証の接続文字列なため、IDとパス表記はありません。 また接続文字列には、誤りはありません。 以上踏まえてまたおわかりな事がございましたらご教示いただきたく存じます。 どうぞよろしくお願いいたします。
guest

0

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

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

VBA

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

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

VBA

1strSQL = "SELECT * FROM Q_m_kokyaku_shohin"

投稿2016/05/10 03:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/05/10 04:05

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問