プロが教えるわが家の防犯対策術!

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

アクセスメニュー(リボン?)にある「フィルタの実行」で抽出されたデータがあるフォームです。
フィールドの値を一気に変更するスベを知らなく現在下記のようにしています。

For d = 1 To Me.Recordset.RecordCount
   DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, d
   Me![目的のフィールド] = ”テスト”
Next

これでもできるのですが、いまいち納得しません。
もっと、スマートな方法はないですか?

抽出にはアクセスメニュー(リボン?)を使っています。

A 回答 (4件)

アクセス2007を触ってたことが無いので、リボンのどこかがわからないけど。



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

この回答への補足

申しわけありません。
良く理解できません。
SQL等の知識はほとんど無くて。

>リボンのどこかがわからないけど
アクセス本体のメニューの「フィルタの実行」(データの抽出)です。

「UPDATE」みたいなもので一括更新したいのですが・・・

補足日時:2010/02/18 00:17
    • good
    • 0

データーベースを多少なりとも扱うのであれば、クエリ(SQL)の知識は必須と考えます。



既に回答がありますが、お望みのことは更新クエリでできます。
テーブル:data
条件:「条件」フィールドが"かくかくしかじか"
書き換え:[目的のフィールド ]= "テスト"

を実行する更新クエリは

UPDATE [date] SET [date].目的のフィールド = "テスト" WHERE (((date.条件)="かくかくしかじか"));

要するに UPDATE ですね。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2010/02/18 19:37

動くのならそのままでも良いような気がしますが。



メニュー等をいじって抽出条件を設定した場合、
条件文は 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

レコードが編集中ならやらない。
くるくる回って処理している時は画面表示を抑止する。

おかしなところはドンドン修正してください。


後は、メニュー側のフィルタを操作させないようにして、フォームにフィルタ指定/設定用のコントロールを配置すると、条件作成は若干楽になるのでしょうか。
    • good
    • 0
この回答へのお礼

>条件文は Me.Filter に設定されるようです
はい、なのです。
FilterOnがTrueでもFlaseでもFilter文は残ったままですし、「フィルタの実行」を連続クリックすると、1回目がTrue2回目もTrue3回目からFalseと交互にでした。
メニュー側のフィルタを使用するので、使用者によりどんな条件文が入るのか予想できず、そこからWHERE文に直すのに苦労してました。

>フォームにフィルタ指定/設定用のコントロールを配置すると・・・
なるべく楽しようしていますので、現在予定はありません。

>動くのならそのままでも良いような気がしますが
はい、このままにします。

でも、ご回答にあった「コード」。とてもいいです。
回転時間がない分かなり速くなりました。
そっくりそのまま使わせて頂きます。
>Me.Painting = False
こんなのあるとは、知りませんでした。


ご指導ありがとうございました。

お礼日時:2010/02/18 19:29

#3です



> >動くのならそのままでも良いような気がしますが
> はい、このままにします。

動くという意味の中には、苦もなく応答が待てる、ということも含まれます。


> でも、ご回答にあった「コード」。とてもいいです。
> 回転時間がない分かなり速くなりました。

While 部分でレコード数分1つ1つ処理しています。

.MoveFirst で先頭に移動し、レコードを更新したら、.MoveNext で次のレコードに。
最後を処理するまで繰り返します。
    • good
    • 0
この回答へのお礼

はい、ありがとうございます。
このテーブルのレコード数は多くて2000件位なので待ってられます。

今後もよろしくお願い致します。

お礼日時:2010/02/18 22:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す