データ型が一致しない?

このQ&Aのポイント
  • エクセルのVBAを使用して、アクセスのデータを取得して表示させたいが、データ型が一致しないエラーが発生している。
  • アクセス側の顧客IDはテキスト型であり、TextBoxもテキスト型であるため、データ型が一致しているはずだが、エラーが発生している。
  • 参考書やネットで見つけたコードを試しているが、うまくいかないため、解決策を求めている。
回答を見る
  • ベストアンサー

データ型が一致しない?

エクセルのVBAでユーザーフォームから、アクセスのデータを取得して ユーザーフォームのテキストボックス、コンボボックスに取得させたデータ を表示させようとしています。 TextBox1に顧客IDを0001234のように7桁の数字を入力すると、アクセスの 「T_メイン」テーブルからIDが一致するレコードを取得して、フィールド「クライアント名」、 フィールド「営業所」、フィールド「担当者」のデータをテキストボックスや コンボボックスに表示させたいのです。 それで、以下のようなコードを記入しました。 Private Sub TextBox1_Change() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim SelCmd As String If Len(TextBox1.Value) = 7 Then Set cn = New ADODB.Connection cn.ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;" _ & "Data Source=D:\管理表.mdb" cn.Open SelCmd = "SELECT * FROM T_メイン " _ & "WHERE 顧客ID = " & TextBox1.text Set rs = New ADODB.Recordset rs.Open SelCmd, cn, adOpenKeyset, adLockOptimistic TextBox2.Value = rs!クライアント名 ComboBox2.Value = rs!営業所 ComboBox3.Value = rs!担当者 rs.Close Set rs = Nothing cn.Close Set cn = Nothing End If End Sub しかし、これを実行させると、 rs.Open SelCmd, cn, adOpenKeyset, adLockOptimistic の部分でエラーがでてしまいます。 「抽出条件でデータ型が一致しません」のエラーメッセージです。 アクセス側の顧客IDの部分はテキスト型ですし、TextBoxもテキスト ですから、一致しているのでないでしょうか? なぜなんでしょう? 参考書とかネットとか見様見真似でやってるので、ものすごく変な部分が あるのかもしれませんが、どうかご教授願います。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

私の書き方ですが... Dim Sql As String Sql = "" Sql = Sql & "SELECT *" Sql = Sql & " FROM T_メイン" Sql = Sql & " WHERE (顧客ID = '" & TextBox1.Text & "') AND (契約 = '契約中')" Sql = Sql & ";" Debug.Print Sql この SQL を渡せば良いと思います。Access 等で確かめてないのですけど。 余談ですが、1件も該当データが無い場合の例外処理が必要だと思います。

yk3291
質問者

お礼

ありがとうございます。出来ました。 " とか ' とかいろいろ厄介ですね。 ちょっと違っただけで正常に機能しないし…。 本当に勉強になりました。 1件も該当が無い場合の例外処理は何とかなりそうです。 ありがとうございました。

その他の回答 (1)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。KenKen_SP です。 よく見てないけど、WHERE 句にテキストを渡すときは、シングルクウォートが必要だと思います。 これでどうでしょう? > SelCmd = "SELECT * FROM T_メイン " _ > & "WHERE 顧客ID = " & TextBox1.text    ↓ SelCmd = "SELECT * FROM T_メイン " _ & "WHERE 顧客ID = '" & TextBox1.Text & "';"

yk3291
質問者

補足

早速の回答ありがとうございます。 ご指摘の通りで出来ました。ありがとうございます。 追加で以下の事もご教授いただけますでしょうか? 抽出条件を2つにしたしたいのです。 SelCmd = "SELECT * FROM T_メイン " _     & "WHERE 顧客ID = " & TextBox1.text の部分を「顧客ID」のフィールドがTextBox1と一致して、なおかつ 「契約」のフィールドが"契約中"になっているもののデータを 取得できるようにしたいのです。 どのように書けばいいのでしょうか? ANDで繋げてみたけど駄目でしたし・・・。 どうかご教授願います。

関連するQ&A

  • Accessでの検索結果表示

    Accessでの検索画面を作っているのですが *検索項目* ・顧客ID ・電話番号 ・氏名(前方一致で検索したい) *顧客テーブル* ・顧客ID ・電話番号 ・氏名 ・氏名カナ ・住所 3つを複合的な検索項目として、検索ボタンを押下した際に フォーム上のテキストボックスに顧客テーブルから 検索した住所を表示させたいと思っています。 現在、顧客コードだけを 検索項目として以下のようなコードを記述しているのですが これでさえもうまくいきません。 *************************** Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strRet As String Set cn = CurrentProject.Connection rs.Open "顧客テーブル", cn, adOpenKeyset, adLockOptimistic strRet = "顧客ID='" & Me!CustmID & "' " rs.Find strRet If Not rs.EOF Then Me.Address = rs!住所 Else: MsgBox "該当なし" End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub **************************** 現状、何が悪いのかそしてどのようにこのプログラムを 改良すれば本来やりたいことができるのか 教えていただけますでしょうか。よろしくお願いいたします。

  • access ふたつのテーブル間でのデータ移動VB

    win10 office365 accessのテーブルの table1のフィールド IDの数値を table2のフィールド ID (いずれも長整数型 数値型 重複あり 空白の許容なし) にコピーする操作ですが 幾度か お尋ねしてきていますが 今回 このやり方で やってみました http://www.mahoutsukaino.com/ac/ac2002/vba/vba16/v16.htm 以下のコードにおいて rs2.Update ここの部分が黄色くなって とまってしまいます しかし なぜか 数値の移行は 出来ていました ただ止まってしまうと 次に続けられなく困っています Public Function table2table1() Dim cn As adodb.Connection Dim rs1 As adodb.Recordset Dim rs2 As adodb.Recordset Set cn = Application.CurrentProject.Connection Set rs1 = New adodb.Recordset Set rs2 = New adodb.Recordset rs1.Open "table1", cn, adOpenStatic, adLockReadOnly rs2.Open "table2", cn, adOpenKeyset, adLockOptimistic rs1.MoveFirst Do Until rs1.EOF rs2.Find "ID='" & rs1!ID & "'" If rs2.EOF Then rs2.AddNew rs2![ID] = rs1![ID] rs2.Update End If rs1.movenext Loop rs1.Close rs2.Close cn.Close End Function 以上 すみません 宜しくお願い致します

  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • 【ACCESS2000】 VBAの更新処理に条件を加えたい。

    下記のような更新処理のVBAを組みました。 これにIDが5のものを更新するというのを加えるには どうすればよいでしょうか。 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "tbl_D_売上", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect rs("入金方法") = 2 rs("入金方法名称") = "分割" rs.Update rs.Close Set rs = Nothing cn.Close Set cn = Nothing

  • テーブルのデータをフォームに表示したい。

    テーブルのデータをフォームに表示したい。 Access2003で顧客管理のシステムを作成しています、 下記コードで検索フォームより顧客フォームを開き顧客テーブルのデータを渡していますが、 現在では顧客データを渡したいフォームが増えた為、各フォームにtxt顧客コードを設けて 標準モジュールで行った方が良いかと思うのですが、どの様にしたら良いか解りません。 良い方法がありましたらご教授よろしくお願いいたします。 Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T顧客", cn, adOpenKeyset, adLockOptimistic rs.Find "顧客コード=" & Forms!F顧客検索!S顧客.Form.顧客コード Forms!F顧客!txt顧客コード = rs!顧客コード Forms!F顧客!cmb顧客区分 = rs!顧客区分 Forms!F顧客!txt顧客名 = rs!顧客名 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing

  • MSアクセスで抽出した結果が何もなかった場合

    こんにちは。コンボボックスに入力した言葉でフィルターをかけるため下記のように記載しました。 ヒットした場合は問題ないのですが、ヒットしなかった場合、エラーが出ます。ヒットしなくてもエラーとせず、”ありません”のようにメッセージを出すにはどのようにすればよいのでしょうか? 宜しくお願いします。 Dim rs As New ADODB.Recordset Dim cn As ADODB.Connection Dim DETA1(1 To 10) i = 1 Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset DBnm = Me.CYUSYUTSU.Value KI = Me.KeyWord2.Value rs.Open DBnm, cn, adOpenKeyset, adLockOptimistic '********************************************** rs.Filter = "Tget='" & KI & "'" TI = rs!管理番号 NM = rs!名前 Do Until rs.EOF DETA1(i) = rs!地域 i = i + 1 rs.MoveNext Loop

  • 「2月」でフィルタをかけたい。

    オフィス2003です。 テーブル1の 日付フィールドには「yyyy/mm/dd hh:nn」形式でいくつかの日付の入力されたレコードがあります。 エクセルのADOを使って テーブル1から「2月」のレコードをフィルタをかけて抽出したいのですがうまく行きません。 Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\db1.mdb" Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = ("日付 = " & "'" & Month(Date) & "'") rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub を実行すると「種類が一致しません」というエラーになります。 どうすれば2月のデータを取得できるのでしょうか? ご教授よろしくお願いします。

  • 【ADO】「Filter」を使うか「WHERE」を使うか

    こんばんは。 アクセス2003です。 「Filter」を使うか「WHERE」を使うかべきかわからないので教えてください。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Sub test1() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル WHERE 'フィールド1'='りんご", cn, adOpenKeyset, adLockOptimistic rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub Sub test2() cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & アクセスファイル名 rs.Open "SELECT * FROM Tテーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "フィールド1 = " & "'" & "りんご" & "'" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 以上のふたつのステートメントは Tテーブルのフィールド1にりんごの文字が入力されているレコート゛を抽出します。 いくつかこのような動作をするプログラムを書くのですが どちらのほうがコート゛として適していますか? WHEREを使うtest1の方がコート゛が短くなるからいいのでしょうか? というのもいつかこのファイルを引き継ぐので他人が見てもわかりやすくしたいです。 よろしくお願い致します。

  • access 初心者です。

    Private Sub 患者番号_AfterUpdate() Dim Cn As ADODB.Connection Dim Rs As ADODB.Recordset Set Cn = CurrentProject.Connection Set Rs = New ADODB.Recordset Rs.Open "[tbl個人情報]", Cn, adOpenKeyset, adLockOptimistic Rs.Find "[患者番号] = " & Me![患者番号] If Rs.EOF Then MsgBox "レコードが見つかりません。ID=" & Me![患者番号] Else Me![性] = Rs![性] End If Rs.Close: Set Rs = Nothing Cn.Close: Set Cn = Nothing End Sub 上記の式を見よう見まねで作成したのですが、エラーが出てしまします。          Me![性] = Rs![性]  が見つかりません どのように解釈すれば良いのでしょうか? ちなみに、サブフォームに入れているテキストボックスの「[性]を 同じサブフォーム内の[患者番号]から検索がしたいです。 初歩的なことで申し訳ございません。よろしくお願いします。

  • Accessで、メモリを開放するタイミング

    すみませんが、教えてください。 次のコードように、SQL命令を2回以上行う場合、メモリの開放は、最後だけでよいのでしょうか? これでも、一応動くのですが、メモリを余計に消費していないのかどうか、よく分かりません。 SUB SAMPLE() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String '接続 Set CN = CurrentProject.Connection 'レコードセットを取得(1) Set RS = New ADODB.Recordset SQL = "SELECT COUNT(*) AS CNT FROM 生徒名簿 WHERE クラス = 'TS'" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic Msgbox(CNT) 'レコードセットを取得(2) Set RS = New ADODB.Recordset SQL = "SELECT COUNT(*) AS CNT FROM 生徒名簿 WHERE クラス = 'WS'" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic Msgbox(CNT) '終了 RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub

専門家に質問してみよう