• ベストアンサー
  • 困ってます

AccessVBAでサブフォームの値チェック

こんにちは。前々回http://okwave.jp/qa/q6556906.htmlにて 質問させて頂いたサブフォームの値チェックをする際のVBAの記述で 教えて頂きたい事ができましたので、質問させて頂きます。 Accessのバージョンは2003です。 以下のようなVBAを記述しているのですが、一度VBAでの処理を実行すると フォームを一度閉じてから再度フォームを開くと該当フィールドの色が 元に戻らず黄色又はマゼンダのままとなってしまっています… 別のAccessにて動作確認した際は、再度フォームを開いてもフィールドの 色は元のままだったのですが… どこが原因なのか教えていただければ幸いです。 長文で見辛いですが宜しくお願いします。 Dim stDocName As String Dim stLinkCriteria As String 'フォーム上のコントロールを格納する変数 Dim ctrl As Control Dim msg As String 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls '取得したコントロールがテキストボックスかどうか If ctrl.ControlType = acTextBox Then 'Aの値が15.5未満の場合 If Forms![F_親フォーム].[F_サブフォーム].Form.[A] <= 15.5 Then '背景をピンクに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbMagenta Else '背景を黄色に Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbYellow End If 'Bの値が45未満の場合 If Forms![F_親フォーム].[F_サブフォーム].Form.[B] <= 45 Then '背景をピンクに Forms![F_親フォーム].[F_サブフォーム].Form.[B].BackColor = vbMagenta Else '背景を黄色に Forms![F_親フォーム].[F_サブフォーム].Form.[B].BackColor = vbYellow End If End If Next ctrl Me.Undo 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Forms![F_親フォーム].[F_サブフォーム].Form.Controls 'テキストボックスのコントロールを取得 If TypeOf ctrl Is TextBox Then '取得したコントロールが黄色だった場合 If ctrl.BackColor = vbYellow Then 'msgにテキストボックスの名前を追加 msg = msg & ctrl.Name & vbCrLf 'メッセージボックスに名前を表示 End If End If Next ctrl 'msgが空白じゃない場合 If msg <> "" Then 'メッセージボックスを表示 MsgBox msg Else 'ctrl.BackColor = vbWhite stDocName = "F_フォーム1" DoCmd.Close acForm, Me.Name DoCmd.OpenForm stDocName End If Exit_閉じる_Click: Exit Sub Err_閉じる_Click: MsgBox Err.Description Resume Exit_閉じる_Click End Sub

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数1618
  • ありがとう数1

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

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

shut0325です。 過去の質問も見たのですが、今回の処理の流れがイマイチ把握できません。 下記の様な感じでしょうか? 補足お願いします。 1.サブフォームを持つフォームである。 2.メインフォームにはいくつかテキストボックスがある。 3.サブフォームにはA B という名前の二つのテキストボックスがある。 という設定で、 a.メインフォームで「閉じる」ボタンを押すと、 サブフォームのA及びBの値に応じて、A Bの背景色を黄色/マゼンタにする。 b.サブフォームのテキストボックス全ての背景色を確認し、黄色であればそのテキストボックスの名前を、メッセージ格納用の変数に格納する。 c.メッセージ格納変数が空白でないならば、メッセージを表示し、空白ならばフォームを閉じ、F_フォーム1を開く。 これだと、a.の処理の際、全てのコントロールを確認しなくとも、AとBだけ参照して処理すればいいのかなと思ったので。 さて、こちらでも簡単なコードを書いてテストしてみましたが、閉じれば背景色は元の設定に戻るため、ご質問の様な現象は再現しませんでした。 原因はわからないですが、フォーム/サブフォーム共に、読み込み時(Loadイベント)に全てのテキストボックスの背景を白にするコードを追加することで解消できないでしょうか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

尚、背景色の不具合についてはshut0325様が教えてくださった通り フォームの読み込み時の処理に背景色を白にするという記述をしたところ 解決しました!! こんな簡単な方法を、質問する前にどうしてこれが思い浮かばなかったのかと、 少々恥ずかしいです。トホホ どうもありがとうございました。すごく助かりました><

質問者からの補足

ご回答ありがとうございます! shut0325様が書いて頂いた流れであってます。 ただひとつ補足のようなものがありまして… サブフォームにあるテキストボックスはA,Bの2つだけではなく C,D,E,F…と19個程あります。 現段階では動作確認のためA,Bの2つしかVBAでチェックをかけていませんが、 最終的には19個ある全てのテキストボックスに別々の値(上限)の指定をし、 入力チェックを行いたい意向です。 そうだとしても、確かに全てのコントロールを確認しなくても 良いような気がしました…(汗 余裕ができたら少し記述の見直しを実施したいと思います。 無駄な処理は書かない方が他の人がみてもわかりやすいと思いますし。笑

関連するQ&A

  • AccessVBAで入力有無のチェック

    こんにちは。 AccessでVBAを記述していたところわからないことがでてきてしまいましたので 質問させて頂きます。(ネットでいろいろと調べてみたのですが、それでも解決しませんでした・・・) バージョンは2003です。 サブフォームのある親フォームの[閉じる]ボタンを押すとサブフォームにある 指定したテキストボックスの値をチェックするという動作を実施したい意向です。 今回問題になってしまったのは、ある[A]というテキストボックスに値が入力されているか どうかのチェックをしようとしたのですが、記述が間違っているのか [オブジェクトはこのプロパティまたはメソッドをサポートしていません。] というエラーメッセージが表示されてしまいます。 いろいろ調べたとこ、IsNull関数を使用するということはわかったのですが 上手く動作しません。 現在使用している記述は以下に記載しますので宜しければどう記述を 修正すれば上手く動作するのかお教え頂ければと思います。 'Aが空白の場合 If IsNull(Forms![F_親フォーム].[F_サブフォーム].Form.[A].Value) Then '背景をイエローに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbYellow Else '背景をマゼンダに Forms![F_親フォーム].[F_サブフォーム].Form.[A].BackColor = vbMagenta End If

  • アクセスのサブフォームの値のチェック

    Accessのサブファームにある、コンボボックスの値をチェックしたいので、下記のようにしてみました。 Dim ctl As Control For Each ctl In Me.Controls If ctl.ControlType = acSubform Then msgbox Forms!メインフォーム名!サブフォームコントロール名.Form!コントロール名 End If Next すると、サブフォームの現在選択しているコンボボックスの値しか表示されません。 現在表示されているサブフォームのコンボボックスの値すべてを表示させるにはどうすればいいのでしょうか。よろしくお願います。

  • Accessでチェックしたらサブフォームもチェック

    T_マスタテーブル ・ID ・氏名 ・チェック T_サブテーブル ・ID ・住所 ・チェック となっていて、それぞれフォームを作成していて、 F_マスタフォームの中にF_サブフォームが入っています。 (IDでリンク) マスタテーブルに 1001  山田 太朗   というデータがあったとすると サブには 1001 東京都*** と入っているのですが、 サブは1人につき、1件とは限らず、 1001 東京都渋谷区*** 1001 東京都新宿区*** 1001 埼玉県さいたま市*** となっていることもあります。 F_マスタフォームのチェックの「更新後処理」に Private Sub チェック_AfterUpdate() If チェック = True Then [Form]![F_サブフォーム]![チェック] = True Else [Form]![F_サブフォーム]![チェック] = False End If End Sub と入っていて、F_マスタの方にチェックをすればF_サブのほうにもチェックが 入るようにしたいのですが、 1件目しかチェックがされません。 IDが同じもののチェックにはすべてチェックがされるようにするには どのようにかけばいいのでしょうか? 宜しくお願いします。 Ac2000です。

その他の回答 (1)

  • 回答No.1

ざっとしかみていないのですが、ずっと下のほうの、 'ctrl.BackColor = vbWhite ↑これがコメントアウトになっているからでは?

共感・感謝の気持ちを伝えよう!

質問者からの補足

ご回答ありがとうございます。 説明不足ですみません。 ご指摘頂いた記述[ctrl.BackColor = vbWhite]に関しては 別のAccessで動作確認した際はもともとなかったものです。 今回問題のAccessにて正常動作しなかったので上記記述を追加しましたが こちらも以下エラーが表示され、正常動作しませんでした。 実行時エラー'91': オブジェクト変数または With ブロック変数が設定されていません。 以上の流れからコメントアウトにしました。 説明が不足していまして申し訳ありません。

関連するQ&A

  • 条件に該当したテキストボックスの名前を(2)

    前回 http://okwave.jp/qa/q6556269.html で テキストボックスの名前をメッセージボックスに表示する方法(VBA)を 教えて頂いたのですが新たにわからない事がでてきてしまったので 質問させて下さい><自力で解決しようとしたのですがどうしてもできなくて… Accessのバージョンは2003です。 フォームに伝票番号と得意先コードの2つの入力フィールド (テキストボックス)があります。 やりたいことは、以下のようなことです。 伝票番号は100未満の数値でなくてはならず、 得意先コードは1以上かつ10未満でなくてはなりません。 もし、上記の条件に該当しない場合はテキストボックスの色を 黄色に変更させます。 そうしたら黄色に変更されたテキストボックスだけの名前を メッセージボックスに表示させます。 前回教えて頂いたVBAを追記して動かしたところ どちらか片方がエラーの場合はテキストボックスの名前が メッセージボックスに表示されるのですが、 2つともエラーの場合、メッセージボックスが2回表示され 1つのメッセージボックスに1つの名前しか表示されません。 記述したVBAでは正常な動作だと思うのですが、 これを1つのメッセージボックスに黄色のテキストボックスの 名前をいっぺんに表示させたいのですが、 どのようにすれば宜しいでしょうか。 良かったらご教授お願いします!>< 現在記述しているVBAは以下になります。 ---------------------------------------------------------------- Private Sub 閉じる_Click() 'フォーム上のコントロールを格納する変数 Dim ctrl As Control 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls '取得したコントロールがテキストボックスかどうか If ctrl.ControlType = acTextBox Then '伝票番号の値が100未満の場合 If Me!txtNo <= 100 Then '背景をピンクに Me!txtNo.BackColor = vbMagenta Else '背景を黄色にして値を元に戻す Me!txtNo.BackColor = vbYellow End If '得意先コードの値が1以上かつ10未満の場合 If Me!txtCode <= 10 And Me!txtCode >= 1 Then '背景をピンクに Me!txtCode.BackColor = vbMagenta Else '背景を黄色にして値を元に戻す Me!txtCode.BackColor = vbYellow End If End If Next ctrl Me.Undo 'フォーム上のすべてのコントロールに対しての繰り返し処理 For Each ctrl In Me.Controls 'テキストボックスのコントロールを取得 If TypeOf ctrl Is TextBox Then '取得したコントロールが黄色だった場合 If ctrl.BackColor = vbYellow Then 'メッセージボックスに名前を表示 MsgBox ctrl.Name End If   End If Next ctrl End Sub

  • サブフォームに変数を代入し、RecordSourceの値を取得したい

    サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。 Sub test1() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource End Sub ******************************************************************* Sub test2() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource End Sub オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) ******************************************************************* Sub test3() Dim サブフォーム As String Dim フォーム As String フォーム = "土台" サブフォーム = "フォーム1" MsgBox Forms(サブフォーム).RecordSource End Sub 実行時エラー'2450' マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。 ******************************************************************* test1~3のうち test1のみはうまくいくのですが 変数を代入したいです。 ヘルフ゜のには Forms![受注]![受注サブフォーム].Formとなってますが これじゃ変数を代入できないですよね。 どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか? よろしくお願いします。

  • 【Access】サブフォームのコンボボックス連携

    ACCESSで社員の資格情報を入力するシステムを作成したのですが 以下の問題を解決できず困っています。 どうすればいいか お力を貸して頂けないでしょうか? ■問題:メインフォームで別レコードに移動した際 サブフォーム内の連携コンボボックスを更新されない □コンボボックス2の表示項目 1.分類別No 2.資格名ID 3.資格名 3のみを表示していますが、 1つ目のコンボボックス1の数値で 全コンボボックス2の資格名が出てしまいます。 ■フォーム構成 メインフォーム内に以下を設置 1.移動ボタン 2.帳簿サブフォーム □サブフォーム構成 レコード1 コンボボックス1 コンボボックス2 レコード2 コンボボックス1 コンボボックス2 ~~ 最終レコード コンボボックス1 コンボボックス2 ■コントロールソース コンボボックス1:大分類ID コンボボックス2:資格名ID ■テーブル構成 資格名  資格名ID(主キー)  大分類ID  分類別ナンバー(大分類ごとの登録順ナンバー)  資格名   資格大分類  大分類ID(主キー  大分類名 (IT系・運転系など) ■コンボボックス2の値集合ソース(表示項目:資格名) SELECT 資格名.資格名, 資格名.分類別No, 資格名.資格名ID FROM 資格大分類 INNER JOIN 資格名 ON 資格大分類.資格大分類ID = 資格名.資格大分類ID WHERE (((資格名.資格大分類ID)=[Forms]![メインフォーム]![サブフォーム]![コンボボックス1])) ORDER BY 資格名.分類別No; ------------------------------------ サブフォームに記載し効果のなかったVBAコード ’再クエリ Private Sub Form_Current() Dim cntrl As Control If Not IsNull(Me![コンボボックス1]) Then For Each cntrl In Form.Controls If cntrl.ControlType = acComboBox Then cntrl.Requery End If Next cntrl End If End Sub ’ソース更新 Private Sub Form_Current() With Forms!メインフォーム名!サブフォーム名!コンボボックス2 .RowSource = .RowSource End With End Sub ■参考サイト 'サブフォーム内での2つのコンボボックスの連動について 'http://goo.gl/nfvxW '~ '>   コンボボックスAの更新後処理イベントに '> Me!コンボボックスB.Requery '> 'Me.コンボボックスB.RowSource = Me.コンボボックスB.RowSource '数値でコンボボックス選択 'http://goo.gl/ovZ3C 'リストボックスの行を選択するときは、「Selected(n)」を使います 'http://goo.gl/RbsWX 'サブフォームの指定 ' =Forms!フォーム名!サブフォームコントロール名.Form.テキストボックス名 'http://goo.gl/vKxtj

  • ACCESSで条件によってサブフォームを非表示に

    Accessの初心者です。よろしくお願いします。 Accessで住所録を作っています。 メインフォームは主に本人のデータを表示し、サブフォームで家族の データを表示するようにしました。 その時、家族がいない人についてはサブフォーム自体を表示しないようにしたいと思います。 そこで下記のようにしましたがうまくいきませんでした。 (1)サブフォーム内で家族の人数をカウントする。 (2)このカウント結果をメインフォームに表示する。(メインフォーム にテキストボックスを配置し、コントロールソースをサブフォームの 人数カウントにする。)     ここまではうまくいきました。 (3)ここでメインフォームのイベントの「開くとき」に以下のように記 述しました。(メインフォームのテキストボックスにカウントという  名前をつけました。) Private Sub Form_Open(Cancel As Integer) If Me!カウント = 0 Then サブフォーム.Visible = False Else サブフォーム.Visible = True End If End Sub この記述の仕方がまずいと思うのですが、どのようにすればよいか 分りません。よろしくお願いします。

  • ACCESS97 サブフォームのレコードソースプロパティーを変更したい。

    フォームの中にサブフォーム(データシート)が1つあります。 元のフォームのチェックボックスのオン・オフでサブフォームのレコードソースプロパティーを変更すると、 実行時エラー438 オブジェクトはこのプロパティまたはメソッドをサポートしていません。がでます。 サブフォームのビューは変更したくありません。 だれか助けてください。 If Me.未送信のみ = -1 Then Forms!F_処理選択!F_理選択サブ.RecordSource = "F_処理選択サブ_1" Else Forms!F_処理選択!F_処理選択サブ.RecordSource = "F_処理選択サブ_2" End If

  • ACCESS VBAサブフォーム(DATA SHEET)の値の取得方法

    いつもお世話になっております。 ACCESS VBAでメインフォームに貼りついているサブフォームの値をとりたいのですが、うまくいっていません。 現状は module1でaをPublicで宣言 サブフォーム中のFORM_CURRENT()中で me.field1.setfocus a = me.field1.value として取得しています。 (実装ではメインのほうのボタンAを押したときに サブフォーム、FORM_CURRENT()で取得しておいた値を 別の変数に入れようとしています。) サブフォームのみで実行するとうまくいくようですが、 メインフォームに貼り付けるとうまくいかないようです。 (メインフォームに貼り付けて、サブフォームのFORM_CURRENTにブレイクを 貼って止めようとするが止まらない) そこでメインフォームボタンAクリックイベントで dim a1 as integer Forms![mainform]![subform].form.[field1].setfocus a1 = Forms![mainform]![subform].form.[field1].value として値をとろうと思ったのですが メインフォームからサブフォームにフォーカスをうつせない? らしく、サポートされていませんの旨のメッセージがでてしまいます。 やりたいこととしては、メインフォームに貼りついたサブフォームの 選択レコードのフィールド値を、メインフォームのボタンを押したときに 取得する。ということなのですが、うまくいっていません。 別の方法でもいいので、実現方法をご存知の方、よろしくお願いします。 ちなみにACCESSは2000を使用、ADOはサポートされていますがDAOは 非サポートのようです。

  • 【Access】サブフォーム間のカーソル移動がわからなくて困っています。

    2つのサブフォームがあり、サブフォーム間のカーソル移動を実現したいのですが、 意図した動作にならず、困っております。 その為、下記の条件を満たす動作をご教示いただける方がいらっしゃいましたら、 ご教示の程、よろしくお願いします。 【条件】 1. Form1_SUBのfield2でEnterキー押下時、同じ行のForm2_SUBのIDに移動したいです (Form1_SUBの1行目のfield2でEnterキー押下時、 Form2_SUBの1行目のIDにカーソルを移動したいです。 下記のソースでは Form2_SUBの最後のカーソル位置があった行のIDに遷移してしまいます)。 2. Form2_SUBのfield2でEnterキー押下時、次の行のForm1_SUBのIDに移動したいです (Form2_SUBの1行目のfield2でEnterキー押下時、 Form1_SUBの2行目のIDにカーソルを移動したいです。 下記のソースでは Form1_SUBの最後のカーソル位置があった行のIDに遷移してしまいます)。 【フォーム名】 親:OYAFORM サブ:Form1_SUB(T1テーブルを連結した帳票フォームです。) サブ:Form2_SUB(T2テーブルを連結した帳票フォームです。) 【テーブル名】 T1(ID, field1, field2) T2(ID, field1, field2) 【F1_SUBのソース】 Private Sub field2_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyReturn Then Forms!OYAFORM!Form2_SUB.SetFocus Forms!OYAFORM!Form2_SUB.Form!ID.SetFocus End If End Sub 【F2_SUBのソース】 Private Sub field2_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyReturn Then Forms!OYAFORM!Form1_SUB.SetFocus Forms!OYAFORM!Form1_SUB.Form!ID.SetFocus End If End Sub 以上、よろしくお願いします。

  • VBAでサブフォームに自動的にデータを入力したい。

    VBAでサブフォームに自動的にデータを入力したい。 メインフォームに[工期自][工期至]フィールドがあります。 サブフォームに[請求予定日]フィールドがあります。 メインとサブは[管理No.]フィールドで繋がっています。 メインフォームの"請求"テキストをクリックすると、サブフォームが開きます。 そこで[工期至]フォーカス喪失時に、自動で[請求予定日]が入るようにしようと思います。 工期の期間中、毎月月末が請求予定日になります。 [工期自]の入力が無い場合は[工期至]の月の月末のみ請求になります。 下記のようなプロシージャを書いてみましたが、結果、データが全く入りません。 ADO(←まだ全く分かりません)というのを使わないとできないでしょうか? すいませんごちゃごちゃしてますが宜しくお願いします! Private Sub 工期至_Exit(Cancel As Integer) Dim SEIKYU As Date Dim TUKI As Integer Dim SYURYO As Integer DoCmd.OpenForm "サブ", acFormDS, , "管理No.='" & Me!管理No. & "'", acFormEdit If IsNull(Forms!サブ!請求書発行) Then If IsNull(Me.工期自.Value) Then SEIKYU = Me.工期至 TUKI = Month([工期至]) Else SEIKYU = Me.工期自 TUKI = Month([工期自]) End If SYURYO = Month([工期至]) + 1 Do Until TUKI = SYURYO Forms!サブ!管理No. = "[forms]![メイン]![管理No.]" Forms!サブ!請求書発行 = DateSerial(Year(SEIKYU), Month(SEIKYU) + 1, 0) SEIKYU = DateAdd("m", 1, SEIKYU) TUKI = Month(SEIKYU) Loop DoCmd.CLOSE acForm, "サブ" End If End Sub

  • フォームが見えなくなっちゃう

    フォームに、コマンドがあって、それをクリックすると終了確認が出るようにしました。 Dim MSG as integer MSG = msgbox("終了しますか?",vbYesNo,"確認") If MSG = 6 then end end if ちゃんと終了はできるのですが、Msgboxが出ている時にフォームが表示されないんです。キャンセルすると再び見えるんですが、どうすれば直るでしょうか。

  • Access+VB サブフォーム(再度)

    表形式フォームで出来上がったものがあります。 Form_Openイベントには、DoCmd.FindRecordで検索をかけてます。 次に、新しくフォームを作りそれにタブコントロールを置き、その中に出来上がってある表形式フォームを置きました。 単体ではDoCmd.FindRecord検索かかってましたが、新しいフォームのサブフォームにするとできません。 そもそも、コントロールになりさがった、サブフォームにForm_Openイベントはあるんでしょうか? Form_GotFocusイベント(サブ側)は働かなくなってるし、サブフォームのイベントプロパテイにはフォーカスの取得時と喪失時しかありません。 メインから、サブフォームがOPENした時に検索かけるにはどうしたらよいでしょう?