• ベストアンサー

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

  • ACCESSのサブフォームについて

    ACCESSにおいて、サブフォームにデータを表示させた状態で、あるレコードをダブルクリックで選択させ、 そのデータ(対象レコード)をメインフォームに戻って使用させるにはどのようにしたらよろしいのでしょうか? サブフォームの該当箇所に、ダブルクリック時イベントを貼り付けて、 制御をメインフォームへ移すのでしょうか。 よろしくお願いします。

  • Accessサブフォームの表示について

    はじめまして、yossy136kgと申します。 Microsoft Access2003のメインフォーム、サブフォームに関して下記の件、ご教授願います。 メインフォーム、サブフォームを作成しリンクして、あるテーブルのレコードをサブフォームに表示されることが確認できている状況です。 サブフォームのRecordSourceに設定しているテーブルに【複数件レコードがある】状態に対して、検索条件に満たない場合空の状態でサブフォームは表示出来ています。 確認したいことは、サブフォームのRecordSourceに設定しているテーブルが【0件(レコードがない)】の状態に対して、サブフォームを空の状態で表示することは出来ますでしょうか? 現状、サブフォームは非表示となっています。 ※ダミーデータを入れてそれを表示対象とするしかないのでしょうか? 何かご不明な点がありましたご指摘ください。 以上、宜しくお願い致します。

  • サブフォームに対する表示制御について

    Access97でサブフォームを使用したフォームを作成しています。 サブフォームの明細行の最後に新規レコード行がありますよね。 サブフォームの初期表示時に、この新規レコード行にカーソルを位置付けたいのですが、 Docmd.GoTORecord,,acNewREc とやると、新規レコード行がサブフォームの 最上部にいってしまい、その前にある既存レコードが見えなくなってしまいます。 理想は、サブフォームの1ページが10明細分の大きさで獲ってあるとすると、 新規レコード行を10行目に表示されるようにもっていきたいのですが、 サブフォームに対してこのような制御は可能なのでしょうか。 RecordCountを操作したりしてやってみたのですが、既存レコードの件数によって、 うまくいったりいかなかったりです。 よろしくお願いします。

  • Access2003 サブフォームについて

    サブフォームを持つ画面で 親子テーブルを共に更新しようとしていて挫折しかかっています。 そこで皆様の知恵を借りれれば幸いです。 <<画面表示>> メインフォーム…受注  ┗サブフォーム…受注明細 <<更新条件>> ・メインフォームは変更可能 ・サブフォームは追加、変更、削除可能 ・サブフォームのデータ変更時  →受注明細テーブルを更新しない ・メインフォームのデータ更新時  →受注テーブルを更新しない ・メインフォームの更新ボタン押下時  →受注テーブル、受注明細テーブルを更新 <<質問>> 1.サブフォームの値をテーブルへ  自動更新(項目変更時に付随更新)せずに  任意更新(ボタン押下時など)出来ますか?  [サブフォームに主キー項目を設置せず行追加すると Not Null制約で怒られます。] 2.VBで言うところのFlexGridの様にサブフォームを  制御出来ますか?  RecordSourceを使うのではなく、  VBA内で持っている値を各セルに設定する 3.そもそも同一画面内で親子テーブル共に更新することは  有り得ないことなんでしょうか?

  • サブフォームをリクエリするには?

    アクセスのフォームにはサブフォームがあり、 親フォームの上にあるコマンドボタンで、テーブルに対してアクションクエリでレコードの削除やレコードの更新を行います。 サブフォームにはそのテーブルをソースとしたデータを表示させているのですが、 親フォームの上にあるコマンドボタンのイベントの最後に、 Me.Controls("サブフォーム").Requery を入れても、フォームのデータが#Deletedになります。 Me.Requery でも、サブフォームのデータは#Deletedになってしまいます。 フォームを開きなおしたり、並べ替えをすればデータが表示されますが コマンドボタン押下後にイベントを実行し終わったら、サブフォームのデータも更新されたデータを表示するさせるには どうすればいいでしょうか?

  • 【Access】サブフォームの項目選択時、対応するコントロールの有効無効を制御する方法

    サブフォーム内にテーブル名tblのデータを帳票フォームで連結し、 サブフォーム内のチェックボックスをクリックすると、 対応するコンボボックスの有効無効を制御したい (ID=1のチェックボックスクリック時、ID=1のコンボボックスの有効無効を制御)と思いましたが、 どのチェックボックスをクリックしても、 ID=0~ID=2のすべてのコンボボックスが有効になったり、無効になったりしてしまいました。 【テーブル名:tbl】 ID, checkbox, combobox 0, false, A 1, true, B 2, false, C 【サブフォーム名のチェックボックスのクリックイベント】 Private Sub checkbox_Click() If Me.checkbox = True Then Me.combobox.Enabled = True Else Me.combobox.Enabled = False End If End Sub 何かしら添え字を渡す事ができれば、対応できるのではと思いましたが、 どのように記述すればよいか分かりませんでした。 その為、上記のような場合、個別で制御する方法をご存知の方がいらっしゃいましたら、 ご教示いただければと思います。 よろしくお願いします。

  • Access レコード移動時イベントでサブフォーム

    お世話になります。 親フォーム Aがあります。(データソースが存在します) その中にサブフォームBがあります。(データソースが存在します) 親フォームのレコード移動時のイベントで、いつもサブフォームのレコードの最後を表示したいのです。そこで・・・ 親フォームAの レコード移動時イベントに Private Sub Form_Current() Me.B.SetFocus DoCmd.GoToRecord , , acLast End Sub 上記を記述すると、一番初めはきちんとサブフォームBのレコードは最後を表示するのですが、以後、親フォームのレコードを動かすと、親フォームの最後のレコードをさしっぱなしになってしまいます。 Me.B.SetFocus DoCmd.GoToRecord , , acLast これの後にどんな記述をすれば、親フォームのレコードを動かすと同時にサブフォームBも最後の行に移るようにできますでしょうか? 何卒よろしくお願いいたします。

  • Access サブフォームでの選択行の取得

    こんにちは。 Access初心者です。 サブフォームでテーブルの項目を表示させていますが、 選択された行を取得する方法はありますか? サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。 調べているのですが、なかなか検討がつきません。 宜しくお願い致します。

  • 親フォームからサブフォームのレコードソースを設定

    親フォームからサブフォームのレコードソースを設定するには? フォーム1にテーブル1をドロップアンドドラッグして、「テーブル1のサブフォーム」を作成しました。 フォーム1にあるコマンドボタンから「テーブル1のサブフォーム」のRecordSourceを設定する方法を教えてください。 「テーブル1のサブフォーム」からなら Private Sub Form_Load() Me.RecordSource = "" End Sub とできるのですが、 やりたいことはフォーム1からのイベントなので 「テーブル1のサブフォーム」からのイベントは使えません。 だからってフォーム1の Private Sub コマンド2_Click() Me.テーブル1のサブフォーム.RecordSource = "テーブル1のサブフォーム" End Sub とするとコンパイルエラーになります。 良い方法があれば教えてください。アドバイスよろしくお願いします。

  • メインフォームからサブフォームの背景色を変えたい。

    メインフォームからサブフォームの背景色を変えたい。 いつもお世話になっています、度々よろしくお願いします。 メインフォームの開く時にレコード内容によりメインフォームの背景色を変えています、 同時にサブフォームの背景色も同色に変更したく(メインフォームの開く時イベント)に下記コードでやってみたのですが プロパティー、メッソッドがサポートされないとエラーが出ます、 Me!サブフォーム名.詳細.BackColor = RGB(192, 192, 192) 親フォームからサブフォームの背景色変更は出来ないのでしょうか? アドバイス宜しくお願いいたします。