- ベストアンサー
アクセス2007 フォームでフィルタ抽出した全フィールドの書き換え
- アクセス2007でフォームを使用してフィルタ抽出したデータの全フィールドを一括で書き換える方法について教えてください。
- 現在、アクセスメニューの「フィルタの実行」を使用して抽出されたデータを表示しているフォームがありますが、フィールドの値を一括で変更する方法を知りたいです。
- 現在、アクセスメニューの「フィルタの実行」を使用して抽出されたデータを表示しているフォームで、フィールドの値を一括で変更するためにVBAを使用していますが、もっと効率的な方法があれば教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
動くのならそのままでも良いような気がしますが。 メニュー等をいじって抽出条件を設定した場合、 条件文は 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 レコードが編集中ならやらない。 くるくる回って処理している時は画面表示を抑止する。 おかしなところはドンドン修正してください。 後は、メニュー側のフィルタを操作させないようにして、フォームにフィルタ指定/設定用のコントロールを配置すると、条件作成は若干楽になるのでしょうか。
その他の回答 (3)
- 30246kiku
- ベストアンサー率73% (370/504)
#3です > >動くのならそのままでも良いような気がしますが > はい、このままにします。 動くという意味の中には、苦もなく応答が待てる、ということも含まれます。 > でも、ご回答にあった「コード」。とてもいいです。 > 回転時間がない分かなり速くなりました。 While 部分でレコード数分1つ1つ処理しています。 .MoveFirst で先頭に移動し、レコードを更新したら、.MoveNext で次のレコードに。 最後を処理するまで繰り返します。
お礼
はい、ありがとうございます。 このテーブルのレコード数は多くて2000件位なので待ってられます。 今後もよろしくお願い致します。
データーベースを多少なりとも扱うのであれば、クエリ(SQL)の知識は必須と考えます。 既に回答がありますが、お望みのことは更新クエリでできます。 テーブル:data 条件:「条件」フィールドが"かくかくしかじか" 書き換え:[目的のフィールド ]= "テスト" を実行する更新クエリは UPDATE [date] SET [date].目的のフィールド = "テスト" WHERE (((date.条件)="かくかくしかじか")); 要するに UPDATE ですね。
お礼
ありがとうございます
- bin-chan
- ベストアンサー率33% (1403/4213)
アクセス2007を触ってたことが無いので、リボンのどこかがわからないけど。 オブジェクト[クエリ]で、更新クエリを作成するのはどうでしょう? フィルタ条件を指定して、「レコードの更新」にテストを書く。 フィルタ条件が都度異なるなら、画面からの入力も可能。
補足
申しわけありません。 良く理解できません。 SQL等の知識はほとんど無くて。 >リボンのどこかがわからないけど アクセス本体のメニューの「フィルタの実行」(データの抽出)です。 「UPDATE」みたいなもので一括更新したいのですが・・・
お礼
>条件文は Me.Filter に設定されるようです はい、なのです。 FilterOnがTrueでもFlaseでもFilter文は残ったままですし、「フィルタの実行」を連続クリックすると、1回目がTrue2回目もTrue3回目からFalseと交互にでした。 メニュー側のフィルタを使用するので、使用者によりどんな条件文が入るのか予想できず、そこからWHERE文に直すのに苦労してました。 >フォームにフィルタ指定/設定用のコントロールを配置すると・・・ なるべく楽しようしていますので、現在予定はありません。 >動くのならそのままでも良いような気がしますが はい、このままにします。 でも、ご回答にあった「コード」。とてもいいです。 回転時間がない分かなり速くなりました。 そっくりそのまま使わせて頂きます。 >Me.Painting = False こんなのあるとは、知りませんでした。 ご指導ありがとうございました。