フォーム上のフィルタで抽出されたデータをテーブルに格納する方法

このQ&Aのポイント
  • フォーム上で3つのキーワードを使って抽出したデータをテーブルに格納する方法について教えてください。
  • 以下のコードを実行した際にエラーが起こり、データの格納ができません。
  • 解決策やアドバイスをいただけると幸いです。
回答を見る
  • ベストアンサー

フォーム上のフィルタで抽出されたデータをテーブルに格納したい

フォーム上のフィルタで抽出されたデータをテーブルに格納したい 度々お世話になります。 フォーム上で3つのキーワードを使って抽出したデータを テーブルに格納したいと思っています。 以下のコードを書いたところ、矢印の部分でエラーが起こります。 お知恵を拝借できませんでしょうか? よろしくお願いいたします。 Private Sub cmd04_Click() Dim db As DAO.Database Set db = CurrentDb() Dim mySQL As String mySQL = "INSERT INTO 04_パソコン機器管理台帳 select * FROM T05_使用者一覧抽出結果 WHERE " & Me.Filter & ";" If MsgBox("該当レコードを追加します。", vbYesNo) = vbYes Then ' SQLを実行します。 db.Execute mySQL   ←エラーが発生します。 MsgBox "該当レコードを追加しました。" End If End Sub

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

  • ベストアンサー
  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

クエリデザインでSQL実行しましたか。 SQL文自身が悪いか、FILTERの値与え方がおかしいか、見極めが必要です。 前者はセミコロンが怪しいし、後者は例のLIKE文の状態で記載するのが、原因はっきりすると思います。 それよりもデバッグというか1行ずつ処理させて変数の中身を確認する方法を学習して下さい。ブレイクポイントを決めて随時F8押していきます。デバッグわかれば質問減ります。

その他の回答 (1)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

このコードではMe.Filterは設定されていないので 当然ながら構文エラーが出ます。 その設定の仕方がわかりたい、ということですか。 (1) ということであれば、三つのキーワードに なっているフォームでのテキストボックス の名前と対象となるテーブルでのそれぞれの データ型を教えてもらえますか。たとえば、 キーワード1  tx管理番号  数値型 キーワード2  tx部品名   テキスト型 キーワード3  tx部門名   テキスト型 のような感じです。 (2) それと、T05_使用者一覧抽出結果と 04_パソコン機器管理台帳の二つのテーブルで 送り出すデータ型と受け取るデータ型は同じに 設定されていますか。 これらがあればコードを提示します。

raika_r_000
質問者

お礼

失礼しました! またまた文字抜けをしてしまっていました(汗 修正した結果無事抽出できました、ありがとうございました。

raika_r_000
質問者

補足

ご回答ありがとうございます。 体調を崩しておりまして、補足が遅くなりもうしわけありませんでした。 さらに、SQLの部分ですが、大幅に間違ってまして、まず受け手と送り手を間違えてました(汗 そして04 → Q04 の文字抜けもありましたので、修正してみましたが、 同じところでエラーが発生してしまいます。 mySQL = "INSERT INTO T05_使用者一覧抽出結果 select * FROM Q04_パソコン機器管理台 WHERE 帳 " & Me.Filter & ";" 受け手と送り手のフィールドはすべてテキスト型です。 キーワードもすべてテキスト型になります。 キーワード1 txtPC番号  テキスト型 キーワード2 com所属部所  テキスト型 キーワード3 txt使用者   テキスト型 キーワード4 txtPC名   テキスト型 どうぞよろしくお願いいたします。

関連するQ&A

  • 検索用フォームで数値型データを抽出する方法

    いつも大変お世話になっております。アクセス初心者ですが宜しくお願いします。 テーブル1を元にクエリ1を作成し,それを元にフォーム表示用を作成しました。フォーム表示用のデータを検索するために非連結のフォーム検索用を作成しました。 検索用フォームでは,氏名,住所,契約締結日等複数の非連結フィールドがあり,入力された値を抽出するために,検索実行というコマンドボタンを一つ配置しています。 検索実行コマンドボタンは,以下のようになっています。 Private Sub 検索実行_Click() On Error GoTo エラー処理 Dim StrWhr As String 'Where条件式 Dim StrMsg As String '表示メッセージ Dim StrSrc As String 'レコードソース Dim stDocName As String '表示用フォームの名前 If Nz(Me!名前, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "名前 Like '*" & Me!名前 & "*'" End If If Nz(Me!契約締結日, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "Format(契約締結日,'yyyy/mm/dd') Like '*" & Me!契約締結日 & "*'" End If If MsgBox(StrMsg, vbOKCancel, "確認") = vbOK Then DoCmd.OpenForm "frm_顧問先CARD", , , StrWhr End If 終了処理: Exit Sub エラー処理: MsgBox Err & Error$, , Me.Name & " 検索実行" Resume 終了処理 End Sub 表示用フォームに契約年数という項目があり,数値型のデータが入力されています。そのデータを検索用フォームで算術演算子を使用して抽出するには,どのようにしたら良いでしょうか。 過去に質問したことと似ているので,色々と参考書を見ながら考えてみたのですが,上手くいきません。 できれば,一つのテキストボックスに >12 とか 4<8 とか入力してデータを抽出したいですが,不可能なら検索用フォームに二つのテキストボックスを配置して,そのテキストボックスで範囲を指定し,範囲内のレコードを抽出するという方法でも構いません。 どなたか,ご教示下さい。宜しくお願いいたします。

  • アクセス フォームが存在するかを一発で取得したい

    フォームが50個くらいあるのですが 該当のフォームが存在するかvbaで取得したいのですが If CurrentProject.AllForms("フォーム1").IsLoaded Then のように、一発で取得する方法はありますか? 今は Sub Sample1() Dim DB As DAO.Database Dim f As DAO.Document Set DB = CurrentDb Dim strForm As String Dim flg As Boolean strForm = "Fメインメニュー" For Each f In DB.Containers!Forms.Documents If strForm = f.Name Then flg = True Exit For End If Next If flg = False Then MsgBox strForm & "は存在しません" End If End Sub のような感じで、すべてのフォームをループしているのですが 無駄が多い気がします。 改善策があればお願いします。

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

  • テーブル1から抽出したものをテーブル2に入れたい

    ACCESSのVBA初心者です。 基本的な質問で申し訳ないのですが、どうかご教授をお願いします。 まず、まったく同じフィールドを持つテーブル1とテーブル2があります。 抽出したい項目は、テーブル1の中にある[性別]と[登録月]が一致するデータの全てです。 性別と登録月は別のフォームのコンボボックスで選択したもので抽出しようと思っています。 該当するデータが含まれているレコードを全てテーブル2に移したいです。 説明が下手で申し訳ないのですが、どうかご教授をお願い致します。 Dim rs As DAO.Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("テーブル1", dbOpenDynaset) DoCmd.RunSQL "DELETE FROM テーブル2" rs.Filter = " テーブル1.性別 = テーブル2.性別 & テーブル1.登録月 = テーブル2.登録月" テーブル2 = テーブル1.RecordsetClone 最初にdeleteがあるのは、前回の抽出条件を消したいからです。 よろしくお願い致します。

  • ACCESS クエリ→フォーム フィルターをかけたデータのみエクスポートしたい

    よろしくお願いします。 クエリのデータをフォームで表示し、その時にコンボボックスで表示するデータを指定し抽出・表示しています。([授業名]フィールドのコンボボックスで、指定した授業のみ抽出します) 最終的に抽出したデータを、コマンドボタンでエクスポートできるようにしたいのですが、私の記述方法では「全てのクエリのデータ」がエクスポートされてしまいます。 どのような方法でもいいのですが、指定したデータ([授業名])のみエクスポートする方法はないでしょうか・・・? *データエクスポートのVBA記述内容* Private Sub cmdデータ出力_Click() '名簿データのエクスポート Dim msg As String msg = MsgBox("名簿データを出力します。", vbYesNo, "出力確認") If msg = vbYes Then 'どの場所にデータをエクスポートするか指定 DoCmd.TransferSpreadsheet acExport, , "Q_受講者名簿用", _ "Y:\○○課\住所録データエクスポート場所\" & "受講者名簿【ACCESSより】.xls", True answer = MsgBox("受講者名簿データを出力しました", vbOKOnly, "データの出力の確認") cancel = True End If End Sub *ちなみに、フォーム上でフィルターをかけたVBAは* Private Sub cmd名簿_Click() Dim stList As String Dim stFil As String If combo1 <> "" Then stFil = "[授業名]='" & combo1 & "'" End If Me.Filter = stFil Me.FilterOn = True End Sub

  • アクセスの表形式のフォームにマスターよりデータを取得したい

    よろしくお願いいたします。 SYAINCD|NAME|TEL|JOB| というテーブルがあるとします。(全て非連結にしました) このテーブルのフォームをウイザードを使い、表形式にて 作成しました。そこで何をしたいかといいますと SYAINCD|NAME| 001 |A | という社員マスターがありますので、そこから、先ほどの フォームのNAMEへデータ(A) を入れたいのです。そこで 教えていただきたいのは。 (1) フォームはできたのですが、SYAINCD にコードを入力すると   即、2行目ができてしまいます。これで正常なのでしょうか? (2) フォームでSYAINCD(3桁)を入力し終わったら起動する、以下の  ようなVBA を記述してみました。これでAをフォームに取得するつもりで。 Private Sub SYAINCD_LostFocus() Dim cn As ADODB.Connection Dim inrs1 As ADODB.Recordset Dim MYSQL As String Set cn = CurrentProject.Connection MYSQL = "SELECT NAME FROM SYAINMST WHERE SYAINCD = '" &         Me!SYAINCD & "';" Set inrs1 = New ADODB.Recordset inrs1.Open MYSQL, cn, adOpenKeyset, adLockReadOnly If inrs1.RecordCount <> 0 Then Me!NAME = inrs1!NAME Else Me!NAME = "該当者なし!!" End If inrs1.Close: Set inrs1 = Nothing cn.Close: Set cn = Nothing End Sub  結果、1行目のNAMEにはAが格納されましたが、2行目のNAMAにもAが 格納されてしまいました。  この場合1行目のNAMEのみAを格納することはできないのでしょう  か?  VBAの記述がおかしいのはなんとなく分かるのですが、対処法がわか らなくてこまっております。  それとも表形式のフォームでは不可能なことなのでしょうか?  例が分かりずらくて申し訳ありませんが、ご教授をお願いいたしま  す。

  • エクセルテーブルをアクセステーブル取込む

    エクセルで作成したテーブルデータを取り込むときに余分に空白のレコードが取り込まれてしまうんですが原因が分かりません。 下記コードで処理してます。 Dim strac As String Dim strxls As String Dim strrange As String Dim strMsg As String strac = "T_障害票マスタ" 'Accessテーブルを指定します。 strxls = テキスト0 'エクセルファイルを指定します。 strrange = "T_障害票!" 'データ入力のシート名とセル範囲を指定します。 strMsg = "エクセルファイル" & strxls & " を、Accessファイル " & strac & _ "として、データ入力を行います。" & _ "よろしければ、OKをクリックして下さい。" 'MsgBoxのメッセージ If strxls = "" Then MsgBox "ファイルを選択して下さい。" 'テキストボックスの確認 Exit Sub End If 'DoCmd.DeleteObject acTable, strac 'テーブルを削除します。 If MsgBox(strMsg, vbOKCancel, "import") = vbOK Then '最初のデータをフィールド名として使います。 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, _ strac, strxls, True, strrange MsgBox "インポートは、正常に完了しました。" End If Exit Sub なお取り込むテーブルデータはフィールド行を抜かして常に1レコードだけです。 アクセスでは既存のテーブルに保存してます。 詳しい方お願いします。

  • フォームを閉じないようにする VB6 SP6

    VB6 でプログラムを作成中です。 プログラムを実行して、フォームが立ち上がった所で右上の×を押し、画面を閉じようとします。 そこで以下のコードで、もし×が押されたらvbYesNoメッセージボックスを表示させ、もし「いいえ」が押されたらフォームを閉じないようにし、実行画面を維持したいのです。 しかし、Exit Sub ですとプログラムが終了してしまい、困っています。宜しくお願い致します。 Private Sub Form_Unload(Cancel As Integer) 'フォームを閉じる Dim last As String last = MsgBox(" プログラムを終了させますか?", vbYesNo, "終了確認1") If (last = vbYes) Then Dim last2 As String last2 = MsgBox(" 本当にプログラムを終了させますか?", vbYesNo, "終了確認2") If (last2 = vbNo) Then Exit Sub End If End If If (last = vbNo) Then Exit Sub End If End Sub

  • ACCESSの SELECT SUM

    SELECT SUMを 計算させると ゼロしか 出てきません。 どこが悪いのでしょうか?  日付         出金       氏名 2012/12/10      540      安田 2012/12/10      1020      斉藤 2012/12/10       970      TOM 2012/12/11      650      池田  2012/12/11     2010      南 2012/12/12      350      林田 2012/12/12     1200      加藤 のようなテーブルがあり Private Sub コマンド_click() Dim Db As Database Dim SQL As String Dim rs As Recordset Dim gokei As Long Set Db = CurrentDb SQL = "SELECT Sum(出金) as gokei FROM テーブル  WHERE 日付= #" & [Forms]![フォームアルファ]![テキスト] & "# " Set rs = Db.OpenRecordset(SQL) MsgBox gokei End Sub を フォームアルファに 新しく作ったコマンドボタンのクリック時に 書きました。 これを テキストの日付を変えておいて いろいろ試しても ゼロのメッセージしか出ません。 WHERE以下が 間違っていないか 試しに Private Sub コマンド_click() Dim Db As Database Dim SQL As String Dim rs As Recordset Dim Count As Long Set Db = CurrentDb SQL = "SELECT (出金)  FROM テーブル  WHERE 日付= #" & [Forms]![フォームアルファ]![テキスト] & "# " Set rs = Db.OpenRecordset(SQL) If rs.EOF Then Count = 0 Else rs.MoveLast Count = rs.RecordCount End If MsgBox Count End Sub を 実行すると ちゃんと 正しいレコード数が 表示されます。 「出金」のデータ型は 長整数になっています。 どこが 悪いのでしょうか? 目的は 指定した日付の 出金の合計を取り出したいのです。 . . .

  • VBAで変数に格納する情報を条件分岐したい

    VBAで変数に格納する情報を条件分岐したい ACCESS VBAを組んでいるのですが、 フォーム上で4つの条件のうちどれかで絞込みをかけたデータを エクスポートする際、 日付、条件をファイル名につけたいと思っています。 日付はつけられるのですが、 変数に条件を格納するIF分を書いたところ 取得できていないようです。 お知恵を拝借できますでしょうか。 いかがコードになります。 Private Sub cmd04_Click() Dim epData As String Dim epObj As String Dim myFile As String Dim mySQL As String Dim db As DAO.Database Dim myFol As String Dim myKey As String If txtPC番号 = Not Null Then myKey = txtPC番号 ElseIf com所属部所 = Not Null Then myKey = com所属部所 ElseIf txt使用者 = Not Null Then myKey = txt使用者 ElseIf txtPC名 = Not Null Then myKey = txtPC名 End If epData = CurrentProject.Path epObj = "T05_使用者一覧抽出結果" myFile = Screen.ActiveForm.Name Set db = CurrentDb() DoCmd.SetWarnings False DoCmd.OpenQuery "Q10_使用者一覧抽出結果" DoCmd.SetWarnings True mySQL = "INSERT INTO T05_使用者一覧抽出結果 select * FROM Q04_パソコン機器管理台帳 WHERE " & Me.Filter & ";" ' SQLを実行します。 db.Execute mySQL 'CSVファイルをエクスポート DoCmd.TransferText acExportDelim, , epObj, epData & "\" & Format(InDate, "yyyymmdd") & "_" & myKey & "_使用者一覧.csv", True MsgBox "エクスポートが完了しました" 'エクスポートしたフォルダを開く MsgBox "エクスポートが終了したのでフォルダを開きます" myFol = epData Shell "C:\Windows\Explorer.exe " & myFol, vbNormalFocus End Sub

専門家に質問してみよう