アクセス2007 フォームでフィルタ抽出した全フィールドの書き換え

このQ&Aのポイント
  • アクセス2007でフォームを使用してフィルタ抽出したデータの全フィールドを一括で書き換える方法について教えてください。
  • 現在、アクセスメニューの「フィルタの実行」を使用して抽出されたデータを表示しているフォームがありますが、フィールドの値を一括で変更する方法を知りたいです。
  • 現在、アクセスメニューの「フィルタの実行」を使用して抽出されたデータを表示しているフォームで、フィールドの値を一括で変更するためにVBAを使用していますが、もっと効率的な方法があれば教えてください。
回答を見る
  • ベストアンサー

アクセス2007 フォームでフィルタ抽出した全フィールドの書き換え

アクセス2007 フォームでフィルタ抽出した全フィールドの書き換え アクセスメニュー(リボン?)にある「フィルタの実行」で抽出されたデータがあるフォームです。 フィールドの値を一気に変更するスベを知らなく現在下記のようにしています。 For d = 1 To Me.Recordset.RecordCount    DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, d    Me![目的のフィールド] = ”テスト” Next これでもできるのですが、いまいち納得しません。 もっと、スマートな方法はないですか? 抽出にはアクセスメニュー(リボン?)を使っています。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

動くのならそのままでも良いような気がしますが。 メニュー等をいじって抽出条件を設定した場合、 条件文は Me.Filter に設定されるようです。(使って見た感じでは) UPDATE する際の WHERE 部分は、フォームに設定したレコードソース内の条件と Me.Filter の条件を加味した作りにする必要があると思います。 例えば、レコードソース内の条件に 品番 = '0001'  があり、 メニュー操作等で [工場ID] が 3と5だけ、の条件を設定すると Me.Filter の中身は "[フォーム名].[工場ID] In (3,5)" とか [フォーム名] のところは、レコードソースに テーブル「TblA」と記述していれば [TblA] に クエリ「Q_XXX」と記述して入れば [Q_XXX] に SELECT ・・・・ と記述していれば [フォーム名] とかに置き換わるようです(?)が。 詳細はわかりません。嘘かも知れません。資料を探してみてください。 条件設定後、For のところで止めて、Me.Filter を覗いてみてください。 で、UPDATE で条件指定する時には、 品番 = '0001' AND [工場ID] In (3,5) などに加工しないといけないような気がします。 条件の参照先にフォームのコントロールを指定していたら、ますます複雑になるのでしょうか。 表示している中での変更と思うので、表示しているレコード分回る処理の方が楽なような気がします。 (件数にもよるとは思いますが、後は処理時間との兼ね合いになると思います) DoCmd を使わない方法は以下の様になるのでしょうか。 If (Me.Dirty = False) Then   If (Me.Recordset.RecordCount > 0) Then     Me.Painting = False     With Me.Recordset       .MoveFirst       While (Not .EOF)         .Edit         .Fields("目的のフィールド") = "テスト"         .Update         .MoveNext       Wend     End With     Me.Requery     Me.Painting = True   End If End If レコードが編集中ならやらない。 くるくる回って処理している時は画面表示を抑止する。 おかしなところはドンドン修正してください。 後は、メニュー側のフィルタを操作させないようにして、フォームにフィルタ指定/設定用のコントロールを配置すると、条件作成は若干楽になるのでしょうか。

situmonnsya
質問者

お礼

>条件文は Me.Filter に設定されるようです はい、なのです。 FilterOnがTrueでもFlaseでもFilter文は残ったままですし、「フィルタの実行」を連続クリックすると、1回目がTrue2回目もTrue3回目からFalseと交互にでした。 メニュー側のフィルタを使用するので、使用者によりどんな条件文が入るのか予想できず、そこからWHERE文に直すのに苦労してました。 >フォームにフィルタ指定/設定用のコントロールを配置すると・・・ なるべく楽しようしていますので、現在予定はありません。 >動くのならそのままでも良いような気がしますが はい、このままにします。 でも、ご回答にあった「コード」。とてもいいです。 回転時間がない分かなり速くなりました。 そっくりそのまま使わせて頂きます。 >Me.Painting = False こんなのあるとは、知りませんでした。 ご指導ありがとうございました。

その他の回答 (3)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#3です > >動くのならそのままでも良いような気がしますが > はい、このままにします。 動くという意味の中には、苦もなく応答が待てる、ということも含まれます。 > でも、ご回答にあった「コード」。とてもいいです。 > 回転時間がない分かなり速くなりました。 While 部分でレコード数分1つ1つ処理しています。 .MoveFirst で先頭に移動し、レコードを更新したら、.MoveNext で次のレコードに。 最後を処理するまで繰り返します。

situmonnsya
質問者

お礼

はい、ありがとうございます。 このテーブルのレコード数は多くて2000件位なので待ってられます。 今後もよろしくお願い致します。

noname#182251
noname#182251
回答No.2

データーベースを多少なりとも扱うのであれば、クエリ(SQL)の知識は必須と考えます。 既に回答がありますが、お望みのことは更新クエリでできます。 テーブル:data 条件:「条件」フィールドが"かくかくしかじか" 書き換え:[目的のフィールド ]= "テスト" を実行する更新クエリは UPDATE [date] SET [date].目的のフィールド = "テスト" WHERE (((date.条件)="かくかくしかじか")); 要するに UPDATE ですね。

situmonnsya
質問者

お礼

ありがとうございます

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

アクセス2007を触ってたことが無いので、リボンのどこかがわからないけど。 オブジェクト[クエリ]で、更新クエリを作成するのはどうでしょう? フィルタ条件を指定して、「レコードの更新」にテストを書く。 フィルタ条件が都度異なるなら、画面からの入力も可能。

situmonnsya
質問者

補足

申しわけありません。 良く理解できません。 SQL等の知識はほとんど無くて。 >リボンのどこかがわからないけど アクセス本体のメニューの「フィルタの実行」(データの抽出)です。 「UPDATE」みたいなもので一括更新したいのですが・・・

関連するQ&A

  • サブフォームでフィルタしたデータのCSV出力

    ACCESS2007 で テーブル  T_リスト name      cate aaa       123 sss       543 rtyy      45t4 フォーム 顧客があり リスト作成ボタンがあります フォーム顧客の中に フォーム電話帳サブフォームがあり データソースはT_リストです その都度手動でフィルタをかける作業をします リスト作成ボタンを押すとフィルタで抽出したデータだけを CSVに書き出したいと思っています。 下記実行しましたが、 T_リストの一行目のデータしか書き出しません DoCmd.OpenForm ("電話帳サブフォーム")でフォームを出さずに実行したいです どなたかよいアドバイスをお願いします。 Private Sub コマンド1_Click() Dim F As Variant Dim Field1 As String Dim Field2 As String Dim M As Double Dim i As Double Field1 = "name" Field2 = "cat1" M = Me![電話帳サブフォーム].Form.Recordset.RecordCount Open "C:\ListMaker\out.csv" For Output As #1 Write #1, Field1, Field2 DoCmd.OpenForm ("電話帳サブフォーム") Me.[電話帳サブフォーム].SetFocus For i = 1 To M DoCmd.GoToRecord acDataForm, "Me.電話帳サブフォーム", acGoTo, i Write #1, Me![電話帳サブフォーム]![name] i = i + 1 Next DoCmd.GoToRecord , , acFirst Close #1 End Sub

  • VBAに「maqBox」を追加したい

    検索結果フォーム「未来」を開くフォーム「マスター」に配した、コマンドボタンのイベントに下記の記述「OKWaveで過去にアドバイス頂いた」をしています。この記述に「("指定したレコードはありません")」を表示させたいと思います。WEBを参照したりしてやってみましたが上手く出来ませんでした。 ツール:Access2007 フォーム名:未来 Private Sub コマンド27_Click() If Me.CurrentRecord < Me.Recordset.RecordCount Then DoCmd.GoToRecord acDataForm, Me.Name, acNext End If End Sub [やってみたこと「VBA知識なし」] Private Sub コマンド27_Click() If Me.CurrentRecord < Me.Recordset.RecordCount Then DoCmd.GoToRecord acDataForm, Me.Name, acNext End If   MsgBox ("指定したレコードはありません") End Sub 上記の書込だと検索結果のレコードの数だけ移動時にメッセージが出る。 以上ですが、宜しくお願いします。

  • MCアクセスで フォームフィルタで抽出

    MCアクセスです。 フォーム画面でフォームフィルタで抽出しようとするとき 1.条件を指定したいフィールドをクリックする。 2.「▽」をクリックする 3.一覧から条件とする項目を選択する。 この時、項目がコンボックス(?)のように出るフィールドと、項目が出ないフィールド(IsNull,Is Not Nullと出る)があります。 どのように設定したら、全てのフィールドで項目が出てくるのでしょうか? __

  • Access2003 フォームを開くときの抽出設定について

    WindowsXP SP3+Access2003 環境です。 メニューフォームからデータのあるフォームを開こうと考えています。 ボタンウィザードでボタンを用意しようと思い、ウィザードの抽出条件としてメニューフォーム上のテキストボックス[txt_出庫用商品名]を設定しました。 データフォームの[商品名称]というフィールドと全てマッチすると抽出されるのですが、抽出したい文字列を【含む】場合の書式がうまく書けません。 (=ワイルドカードの配置がわかりません) ウィザードから自動的に記述されている以下について、"Me![txt_出庫用商品名]"を【含む】データを抽出する場合の記述を教えてください。 stLinkCriteria = "[商品名称]=" & "'" & Me![txt_出庫用商品名] & "'" DoCmd.OpenForm stDocName, , , stLinkCriteria よろしくお願い致します。

  • フォーム上にある1つのテキストボックスで複数フィールドの値を抽出する

    フォーム上に配置している非連結のテキストボックスに任意の値を入力して,同じフォーム上に抽出結果を表示させる方法について,1つのフィールドのみを抽出対象にする場合, Private Sub 抽出_Click() 'フィルタを設定 Me.Filter = "担当 ='" & Me!所員抽出 & "'" 'フィルタを実行 Me.FilterOn = True End Sub で可能ですが,抽出したいフィールドが担当フィールドだけでなく,担当2…担当8まである場合,どのように条件をつなげていったら良いでしょうか。 担当…担当8の各フィールドにはデータが入っていたり,いなかったりします。

  • accessのフォームフィルタで 土日だけを抽出したい

    ACCESS2000 初心者です。よろしくお願いします。 フォームのフォームフィルタで日付欄から土日だけをを抽出する式を教えてください。 よろしくお願いいたします。

  • GoToRecord の使い方

    単票フォームにテーブル1のフィールド1が紐付いてテキストボックス(フィールド1)があり、 もう一つテキストボックス(txt移動用)を作り、 その値のレコードに移動するようにしたいのですが、 Private Sub txt移動用_AfterUpdate() DoCmd.GoToRecord acDataForm, Me, acGoTo, Me.txt移動用.Value End Sub とすると、 "実行時エラー2498 指定した式は、 いずれか の引数とデータ型が対応していません。” となってしまいます。 DoCmd.GoToRecord acDataForm, Me, acGoTo, CLng(Me.txt移動用.Value) にしても同じでした。 フィールド1には数値が入っていて、データ型も数値です。 どこを修正すればいいか教えてください。 (添付画像は、現在1レコード目で、2レコード目に移動しようとしているとこです)

  • ACCESSフォームフィルタで抽出したデータのみをレポートで表示する方法

    フォームフィルターでデータを抽出した後,抽出されたデータのみをレポート上に表示させるコマンドボタンをフォーム上に作っています。 下記のコードを作成しましたが,これだと抽出前の全部のデータが表示されてしまいます。 どうしたら良いでしょうか。 Private Sub ラベルプレビュー_Click() Dim stDocName As String DoCmd.Echo False, stDocName = "rpt宛名ラベル" DoCmd.OpenReport stDocName, acViewDesign DoCmd.SelectObject acReport, stDocName, False ' Reports(stDocName).RecordSource = Me.RecordSource DoCmd.OpenReport stDocName, acViewPreview End Sub

  • GoToRecordでサブフォームを指定したい

    Fフォームの中にSF詳細という名前のサブフォームを埋め込んでいます。 このサブフォームに対して、 指定したレコードに移動したいのですが DoCmd.GoToRecord acDataForm, Form_SF詳細, acGoTo, 3 DoCmd.GoToRecord acDataForm, Forms("Fフォーム").Controls("SF詳細").Form, acGoTo, 3 DoCmd.GoToRecord acDataForm, "SF詳細", acGoTo, 3 全部エラーになり、うまくいきません。 正しい記述の仕方を教えてください。

  • フィルタの情報を保存したい

    Me.Form.Filter = "" Me.Form.FilterOn = を保存したいのですがどうすればいいでしょうか? フォームにテキストのフィールドと 抽出とクリアのコマンドボタンを設置して、フィルタをかけたり解除したりしています。 途中でフォームを閉じても最後にフィルタをかけたなら、 再度フォームを開いたときに最後に検索したワードでフィルタが開く用にしたいし フォームを閉じる前にフィルタを解除したのなら、 再度フォームを開いたときはフィルタが解除された状態にしたいです。 Private Sub cmd_クリア_Click() Me.Form.Filter = "" Me.Form.FilterOn = False DoCmd.Save acForm, Me.Name End Sub Private Sub cmd_抽出_Click() Me.Form.Filter = "フィールド2 like '*" & Me.txt_フィールド2テキスト.Value & "*" & "'" Me.Form.FilterOn = True DoCmd.Save acForm, Me.Name End Sub としてるのに、フィルタの情報が保存されてません。 再度開きなおしたときは、 必ず全レコードが表示されてしまいます。 フィルタの状態を保存する方法を教えてください。ご回答よろしくお願いします。