- ベストアンサー
Accessフォーム条件付書式
どなたか教えて下さい。 Access2002を使っています。 フォームの条件付書式を使い売上が100000円以上なら赤に背景色を変えようと思っています。 VBAの勉強の為に、ツールバーの条件付き書式を使わずにvbaで挑戦してみました。 Private Sub Form_Open(Cancel As Integer) If Me.売上.Value >=100000 Then Me.売上.BackColor = RGB(255, 0, 0) End If End Sub 単票形式ならば上手くいくのですが、フォームのデータシートタイプで表示すると反応しません。 但し、ツールバーの条件付き書式からの設定ではデータシートでも反応します。 上記のIF文では条件付書式にはなっていないのでしょうか? helpでDatasheetBackColor プロパティというのを探せましたが、全体の背景色の変更になってしまいます。 ツールバーにあるからには、VBAで出来るだろうと考えるのは間違えでしょうか? もしもデーターシートの条件にあったセルのみ背景色をvbaで変えられることを知っている方、よろしくお願いします。 haru
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
例えば、こんな感じで出来ます。 フォームの「読み込み時」イベントに次のように記述します。 Access VBA のヘルプで FormatConditions オブジェクトを ご覧ください。 Private Sub Form_Load() With Me.Controls("売上").FormatConditions _ .Add(acFieldValue, acGreaterThanOrEqual, "10000") .BackColor = RGB(255, 200, 200) .ForeColor = RGB(0, 0, 0) End With End Sub データシートの場合、FormatConditionsを使う以外無いでしょう。
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
私も素人ですが、考えることを述べさせていただきます。 参考になりますように。 >単票形式ならば上手くいくのですが >フォームのデータシートタイプで表示すると反応しません。 ホンとに、上手く行きますか。 私は下記でテストしました。 Private Sub Form_Current() Me.フィールド3.BackColor = RGB(255, 255, 255) If Me.フィールド3.Value >= 100 Then Me.フィールド3.BackColor = RGB(255, 0, 0) End If End Sub(手持ちデータの関係で質問とフィールド名、条件値を変えています) ---- プログラムが実行されるのは、キッカケを貰わないと動きません。VB・VBAではイベントです。今の場合Form_Open なんです。それはイベントを使っていると言う点で良いでしょう。 そしてFormがOpenされたとして、このルーチンに飛んできます。Me.売上.Value はレコード(各行)の値に関するものです。列(フィールド)全体では意味をなしません。列全体では、行により、10万より大きいのや小さいのがあって、真偽をいえないからです。Me.売上.BackColorも列は指定していて、判るのですが、行が判るものがありません。(私のプログラムでは、「現に読みこんだレコード1つについて」なので、真偽が言えるのです。) もし、フォームをOpenしたら各行を1つずつ、読んであるフィールドの値で判断してくれて、全行を1つずつ処理してくれる機能を持たせてくれていれば、このプログラムで良いでしょう。しかし実際はそうでありません。Formでする(すべき)ことは、フォーム全体について、大きさを変えるとか、色を指定するとかに関することだけのはずです。 >ツールバーの条件付き書式からの設定ではデータシートでも反応します。 ---- このように、ソフトで「操作で何かを行う」時は、レコードの考えを、システムは見えないようにしてしまいます。そして裏で、(前述した)「各行を1つずつ、読んであるフィールドの値で判断してくれて、全行を1つずつ処理してくれる」ことを繰り返しを行います。それは見せず、結果だけ見せます。そのような深いところでのプログラムのし方を勿論MSの技術者は知っていて、多分C++で組んだプログラムが走ります。 エクセルなどでは、マクロという形で提供しているものが あります(例Sortなど)。 >ツールバーにあるからには、VBAで出来るだろうと考えるのは間違えでしょうか? まず間違いではないにしても、今自分がやっているForm_Openで出来るかどうか、知っている範囲のやり方で出来るかとの議論とは違います。 アクセスVBAには何千と言うメソッド・プロパティ・イベントがあります。適切なものを探し出すのが勉強であり、大変です。充分知っている人なら多分VBAでも出きるでしょう。 >IF文では条件付書式にはなっていないのでしょうか? 条件付書式というメソッド(マクロ)がもしあればそれ指すのでしょうが、ない、またはあっても知らないからIF文で処理しようとしたわけです。「なっていない」は「条件付書式と同じ処理にならないのでしょうか?」と聞くべきで、結論からして、ならないのは、質問の事実が証明しています。しかしIF文が間違いと言うわけではないと思います。マクロ様のものがなければ、IF文を使わねばならない でしょう。 >結局データシートタイプの場合の各セルの捉え方を勉強しなければならないと言うことだと思います。エクセルではCells(i,j)のようなものです。あるかないかから調べる必要があります。またそのセルがBackColor プロパティを持っていることが必要です。 私も知らないので勉強します。
お礼
早々のアドバイスありがとうございます。 最初は何が書いてあるのか理解するのに時間がかかってしまいました。 なるほど私のフォームの1件目の売上が100000円以上なのでそのデータに対し反応し、以降1件目のせいで色が出ているのがわかりました。ちなみに100000以下にしたら反応しなくなりました。大きな発見です。ありがとうございます。do loop と組み合わせて考えて見ます。 丁寧なご回答ありがとうございます。 haru
お礼
間違えて、お礼を補足に書いてしまいました。 ごめんなさい。 ありがとうございました。
補足
ありがとうございます。 FormatConditionsが条件付書式と言うことを始めて知りました。 また、ご丁寧にコードまで書いていただき感謝します。 HELPでも見つけられましたので、よく研究します。 ありがとうございました。 haru