• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アクセス2007 フォームでフィルタ抽出した全フィールドの書き換え)

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

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

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

  • ベストアンサー
  • 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」みたいなもので一括更新したいのですが・・・