![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
□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項目の変更が上手い事行かないです…
情報が少なければご指摘ください。よろしくお願いします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_11.png?5a7ff87)
No.2ベストアンサー
- 回答日時:
こんな風に考えてみました。
(1)赤字:赤字を上から重ねてしまう
まず、サブフォームのレコードソースに(クエリーになります)、
就業区分赤字:IIf([就業区分]="その他",[就業区分],"")
というフィールドを作っておきます。
サブフォームに新しく、[就業区分赤字]のテキストボックスを、[就業区分]のテキストボックスと同じサイズ、同じ書式、同じ位置、ただし背景色-透明、前景色-赤、使用可能-いいえ、で[就業区分]のテキストボックスの上に重ねます。
すると、条件に合ったレコードの[就業区分]のみ赤に表示されているように見えます。
(2)使用不可:変更しても元の値に戻してしまう
サブフォームに非連結、非表示のテキストボックス[支給区分元の値]を作っておきます。
"その他"の場合、更新前イベントでDLookup関数を使うなどして、当該レコードの[支給区分]の値をテーブルから直接読み出し、[支給区分元の値]に貼り付けます。
更新後イベントで、[支給区分元の値]を[支給区分]に書き込みます。
「更新できません」などのエラーメッセージも表示できるというおまけつきです(いらないか)。
場合によっては、予想もしない動作をしそうな不安もあるのですが、どうでしょう。
なお、当方ACCESS 2000でこのアイデアを試してみました。
ご回答ありがとうございます。
この回答により「何とか」形にする事が出来ました。
就業区分に対しては就業区分(黒字用)と就業区分(赤字用)を被せ、
SQLにて就業区分の内容に沿ってそれぞれの区分値を出し、その区分の
内容によって赤字用の項目へ出力するか否かをする事と、
赤字用に条件付き書式をVBA内で設定する事で、実現出来ました。
問題は支給区分だったのですが、こちらには可視可能なテキストボックスに背景色と同一の「■」をSQLにて出力させるようにし、支給区分に項目を被せてチェックボックスを見た目で押せないよう錯覚させる。
という対応を取りました。多少動作が不安定な部分がありましたが、
見た目良ければ…という事なので、この形にしようと思っています。
貴重なお時間を割いてご意見を頂き、ありがとうございました。
No.6
- 回答日時:
>何やらメンテナンス性を意識した取り決めだそうです。
mdbを入れ替えずに、VBAだけ入れ替えたいのかな
だったらVBAで条件付き書式を設定するようにすればいいんじゃないの
有効なのは最初の1回だけで、後は同じものを上書きする無駄な操作にはなりますが
別に害は生じません
条件付き書式設定の構文は以下です
各オプションについてはヘルプで確認してください
FormatConditions.Add(Type, Operator, Expression1, Expression2)
No.5
- 回答日時:
帳票フォームでコントロールのプロパティーを変える方法では
>実際にサブフォームの制御を変更しようとすると全行を対象にしてしまいます。
これは避けられません
>コーディング規約に基づき、条件付き書式を予め設定する事は不可になっています。
何のためにこんな取り決めがあるのかわかりませんが
>VBA内で条件付き書式を変更させ、フォームを閉じるタイミングで条件付き書式をクリアする。
>この方法だと上手く行くのでしょうか…
これで逃げれるのならそうすれば
固定しておけばすむものを毎回設定したり外したり全く無意味な操作だとは思いますけど
ご回答ありがとうございます。
やはり、帳票形式でのプロパティ変更を個々に行う事は不可能なのですね。
>コーディング規約に基づき、条件付き書式を予め設定する事は不可になっています。
この規約、私も理解不能なのですが、何やらメンテナンス性を意識した取り決めだそうです。
この質問内容のフォームは様々な画面で呼び出される為に一括置換をする為、個々のフォームに設定する事を嫌った為では無いかと推測しています。
色々と苦戦をしましたが、やはり支給区分の部分でどうしても無理がある為
仕様変更をお願いしようかと検討しています。
途中投げで私としても非常に悔しいのですが、どうしようにも…と言った心境です。
ありがとうございました。
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.従業員コード & "'"
としてみてください。
ご参考意見ありがとうございます。
仕様の変更をお願いしてみましたが、やはり現在の路線を貫く形となりました。
今後このご助言が役に立つ日が来ると思います。
ありがとうございました。
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.従業員コード & "'"
としてみてください。
No.1
- 回答日時:
サブフォームは単票形式なの?
帳票形式だと1レコードだけの制御はこのやり方ではできないですよ
難しく考えないで条件付き書式で有効・無効を切り替えるのではだめなの?
この回答への補足
ご回答ありがとうございます。
サブフォームは帳票形式になります。
コーディング規約に基づき、条件付き書式を予め設定する事は不可になっています。
VBA側でレコード行ごとの内容を取得する所までは上記のコードで可能なのですが、
実際にサブフォームの制御を変更しようとすると全行を対象にしてしまいます。
フィールドにIndexがあると思ったのですが…書き方に不正があるのかも知れません…
下記のように指定をしてみたところ、怒られてしまいます。
Me(index値).支給区分.Enable = False
VBA内で条件付き書式を変更させ、フォームを閉じるタイミングで条件付き書式をクリアする。
この方法だと上手く行くのでしょうか…
※質問での内容に不備がありました。
誤:If Me.就業区分 = "未確定" Then
正:If Me.就業区分 = "その他" Then
また、コーディングはサブフォームのForm_Lordで行っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- 労働相談 賞与カットの違法 3 2022/06/30 06:41
- その他(ビジネス・キャリア) グーグルの障害者訓練プログラム募集あるがどうだろ?6時間勤務で月収22万!! 1 2023/02/17 20:36
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- 財務・会計・経理 賞与引当金の計上について計上が必要かどうかまとめてみました(1月決算) 認識違うぞということがあれば 1 2023/07/24 17:17
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- 福祉 障害福祉サービスについて 1 2022/07/29 22:04
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
limit offset はupdate文には使...
-
抽出結果にレコードNoを付与す...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
MySQLで数字の値のもののみを取...
-
UPDATEで既存のレコードに文字...
-
【SQL】他テーブルに含まれる値...
-
ACCESS クエリーでソートの不具合
-
[materialized]マテリアライズ...
-
テーブル定義書(Oracle) 【IX】...
-
Accessで今日から5日後
-
ACCESSにおいてスキーマとは
-
固定長のデータをmysqlで取り込...
-
OracleとSQL ServerのSQL文上で...
-
オラクルのUPDATEで複数テーブル
-
右向き、左向きの速度が最大と...
-
ExcelのMatch関数のようなもの...
-
PL/SQLの初歩的な質問その2
-
csvデータ不要列の削除をbatフ...
-
CSVファイルを読み込んでテーブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
AccessVBAについて テーブルの...
-
SQLで、過去で一番大きい日付の...
-
SQLでレコード間の値の交換
-
1つのSQLで2段階の抽出を行い...
-
mysqlのindexとprimary keyにつ...
-
【SQL】項目に紐づいている情報...
-
複数の値を1レコードに表示した...
-
limit offset はupdate文には使...
-
こちらのテーブルにあってこち...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
スキーマ
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
Accessで今日から5日後
-
timestampのデータはどのように...
-
UPDATEで既存のレコードに文字...
-
pandasでsqlite3にテーブル作成...
-
テーブル名が可変の場合のクエ...
おすすめ情報