• ベストアンサー

ACCESS サブフォームについて

□ACCESS 2003 ACCESS VBA初心者です。 処理方法が判らず、行き詰ってしまったので質問させて下さい。 サブフォームの中にテーブルのレコードを表示させ、 レコードの内容によって対象のレコード行の列の制御をしたいのですが Bookmarkで対象行の取得までは何とか辿りついたのですが、 対象行の制御が上手く行きません。どのようにすれば良いでしょうか? ご教授お願いします。 サブフォームはレコードソースにてテーブルを参照しています。 テーブルの項目は[従業員コード],[従業員名],[就業区分],[支給区分]の4列です。 就業区分はテキスト型、支給区分はYes/No型で、 就業区分内には「正社員」「準社員」「その他」があり、 「その他」の場合、支給区分のEnableを無効にしたいです。 '---対象行を取得した際に飛ぶメソッド Private Sub SetFieldPropaties(bkm As Variant) Me.Bookmark = bkm If Me.就業区分 = "未確定" Then Me.就業区分.ForeColor = RGB(255, 0, 0) Me.支給区分.Enabled = False Else Me.就業区分.ForeColor = RGB(0, 0, 0) Me.支給区分.Enabled = True End If End Sub Me.就業区分とMe.支給区分の2項目の変更が上手い事行かないです… 情報が少なければご指摘ください。よろしくお願いします。

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

  • ベストアンサー
noname#110201
noname#110201
回答No.2

こんな風に考えてみました。 (1)赤字:赤字を上から重ねてしまう まず、サブフォームのレコードソースに(クエリーになります)、 就業区分赤字:IIf([就業区分]="その他",[就業区分],"") というフィールドを作っておきます。 サブフォームに新しく、[就業区分赤字]のテキストボックスを、[就業区分]のテキストボックスと同じサイズ、同じ書式、同じ位置、ただし背景色-透明、前景色-赤、使用可能-いいえ、で[就業区分]のテキストボックスの上に重ねます。 すると、条件に合ったレコードの[就業区分]のみ赤に表示されているように見えます。 (2)使用不可:変更しても元の値に戻してしまう サブフォームに非連結、非表示のテキストボックス[支給区分元の値]を作っておきます。 "その他"の場合、更新前イベントでDLookup関数を使うなどして、当該レコードの[支給区分]の値をテーブルから直接読み出し、[支給区分元の値]に貼り付けます。 更新後イベントで、[支給区分元の値]を[支給区分]に書き込みます。 「更新できません」などのエラーメッセージも表示できるというおまけつきです(いらないか)。 場合によっては、予想もしない動作をしそうな不安もあるのですが、どうでしょう。 なお、当方ACCESS 2000でこのアイデアを試してみました。

et-setora
質問者

お礼

ご回答ありがとうございます。 この回答により「何とか」形にする事が出来ました。 就業区分に対しては就業区分(黒字用)と就業区分(赤字用)を被せ、 SQLにて就業区分の内容に沿ってそれぞれの区分値を出し、その区分の 内容によって赤字用の項目へ出力するか否かをする事と、 赤字用に条件付き書式をVBA内で設定する事で、実現出来ました。 問題は支給区分だったのですが、こちらには可視可能なテキストボックスに背景色と同一の「■」をSQLにて出力させるようにし、支給区分に項目を被せてチェックボックスを見た目で押せないよう錯覚させる。 という対応を取りました。多少動作が不安定な部分がありましたが、 見た目良ければ…という事なので、この形にしようと思っています。 貴重なお時間を割いてご意見を頂き、ありがとうございました。

その他の回答 (5)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.6

>何やらメンテナンス性を意識した取り決めだそうです。 mdbを入れ替えずに、VBAだけ入れ替えたいのかな だったらVBAで条件付き書式を設定するようにすればいいんじゃないの 有効なのは最初の1回だけで、後は同じものを上書きする無駄な操作にはなりますが 別に害は生じません 条件付き書式設定の構文は以下です 各オプションについてはヘルプで確認してください FormatConditions.Add(Type, Operator, Expression1, Expression2)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.5

帳票フォームでコントロールのプロパティーを変える方法では >実際にサブフォームの制御を変更しようとすると全行を対象にしてしまいます。 これは避けられません >コーディング規約に基づき、条件付き書式を予め設定する事は不可になっています。 何のためにこんな取り決めがあるのかわかりませんが >VBA内で条件付き書式を変更させ、フォームを閉じるタイミングで条件付き書式をクリアする。 >この方法だと上手く行くのでしょうか… これで逃げれるのならそうすれば 固定しておけばすむものを毎回設定したり外したり全く無意味な操作だとは思いますけど

et-setora
質問者

お礼

ご回答ありがとうございます。 やはり、帳票形式でのプロパティ変更を個々に行う事は不可能なのですね。 >コーディング規約に基づき、条件付き書式を予め設定する事は不可になっています。 この規約、私も理解不能なのですが、何やらメンテナンス性を意識した取り決めだそうです。 この質問内容のフォームは様々な画面で呼び出される為に一括置換をする為、個々のフォームに設定する事を嫌った為では無いかと推測しています。 色々と苦戦をしましたが、やはり支給区分の部分でどうしても無理がある為 仕様変更をお願いしようかと検討しています。 途中投げで私としても非常に悔しいのですが、どうしようにも…と言った心境です。 ありがとうございました。

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

もし、[支給区分]をコンボボックスにできるのなら、条件付き書式を設定することができます。 確認手順 ・新規mdbを作ります。 ・[従業員コード],[従業員名],[就業区分],[支給区分]のテーブルをインポートします。 ・Yes/No のコンボボックス化(もどき) テーブルXX作成  支給ID : 整数型  内容 : テキスト型  テーブルXX例   支給ID  内容    -1   支給     0   なし 従来のテーブルの[支給区分]を変更   Yes/No型 → 整数型   既定値 → 0  ルックアップを設定   表示コントロール → コンボボックス   値集合タイプ → テーブル/クエリ   値集合ソース → テーブルXX   連結列 → 1   列数 → 2   列幅 → 0cm,1cm ※ テーブルXXの内容のみ表示するため   入力チェック → はい この後、帳票フォーム作成 で、レコード移動時イベントに以下を記述します。 Private Sub Form_Current()   Dim TargetString As String   If (Me.就業区分 = "その他") Then     TargetString = "[従業員コード]=" & Me.従業員コード     With Me.就業区分.FormatConditions.Add(acExpression, , TargetString)       .ForeColor = RGB(255, 0, 0)     End With     With Me.支給区分.FormatConditions.Add(acExpression, , TargetString)       .Enabled = False     End With   Else     Me.就業区分.FormatConditions.Delete     Me.支給区分.FormatConditions.Delete   End If End Sub レコードを移動して動きを見てください。 [従業員コード]が重複しないことが条件です。 [従業員コード]がテキスト型の場合には、 TargetString = "[従業員コード]='" & Me.従業員コード & "'" としてみてください。

et-setora
質問者

お礼

ご参考意見ありがとうございます。 仕様の変更をお願いしてみましたが、やはり現在の路線を貫く形となりました。 今後このご助言が役に立つ日が来ると思います。 ありがとうございました。

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

Private Sub SetFieldPropaties(bkm As Variant)   Dim TargetString As String   Me.Bookmark = bkm   If (Me.就業区分 = "その他") Then     TargetString = "[従業員コード]=" & Me.従業員コード     With Me.就業区分.FormatConditions.Add(acExpression, , TargetString)       .ForeColor = RGB(255, 0, 0)     End With     Me.支給区分.Enabled = False   Else     Me.就業区分.FormatConditions.Delete     Me.支給区分.Enabled = True   End If End Sub [就業区分]はテキストボックスなので、条件付き書式が設定できます。 [支給区分]はチェックボックスになるので、条件付き書式は使えません。 [支給区分]は、全体の制御になります。 [就業区分]に条件付き書式を設定します。 [従業員コード]が重複しないのであれば、上記記述で赤文字に変更できます。 [従業員コード]がテキスト型の場合には、 TargetString = "[従業員コード]='" & Me.従業員コード & "'" としてみてください。

et-setora
質問者

お礼

ご回答ありがとうございます。 別の質問者の方にその後について記載致しました。 もしお暇なお時間がございましたら見てみてください

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

サブフォームは単票形式なの? 帳票形式だと1レコードだけの制御はこのやり方ではできないですよ 難しく考えないで条件付き書式で有効・無効を切り替えるのではだめなの?

et-setora
質問者

補足

ご回答ありがとうございます。 サブフォームは帳票形式になります。 コーディング規約に基づき、条件付き書式を予め設定する事は不可になっています。 VBA側でレコード行ごとの内容を取得する所までは上記のコードで可能なのですが、 実際にサブフォームの制御を変更しようとすると全行を対象にしてしまいます。 フィールドにIndexがあると思ったのですが…書き方に不正があるのかも知れません… 下記のように指定をしてみたところ、怒られてしまいます。 Me(index値).支給区分.Enable = False VBA内で条件付き書式を変更させ、フォームを閉じるタイミングで条件付き書式をクリアする。 この方法だと上手く行くのでしょうか… ※質問での内容に不備がありました。 誤:If Me.就業区分 = "未確定" Then 正:If Me.就業区分 = "その他" Then また、コーディングはサブフォームのForm_Lordで行っています。

関連するQ&A