
こんにちは。前々回http://oshiete.goo.ne.jp/qa/6556906.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
No.2ベストアンサー
- 回答日時:
shut0325です。
過去の質問も見たのですが、今回の処理の流れがイマイチ把握できません。
下記の様な感じでしょうか? 補足お願いします。
1.サブフォームを持つフォームである。
2.メインフォームにはいくつかテキストボックスがある。
3.サブフォームにはA B という名前の二つのテキストボックスがある。
という設定で、
a.メインフォームで「閉じる」ボタンを押すと、
サブフォームのA及びBの値に応じて、A Bの背景色を黄色/マゼンタにする。
b.サブフォームのテキストボックス全ての背景色を確認し、黄色であればそのテキストボックスの名前を、メッセージ格納用の変数に格納する。
c.メッセージ格納変数が空白でないならば、メッセージを表示し、空白ならばフォームを閉じ、F_フォーム1を開く。
これだと、a.の処理の際、全てのコントロールを確認しなくとも、AとBだけ参照して処理すればいいのかなと思ったので。
さて、こちらでも簡単なコードを書いてテストしてみましたが、閉じれば背景色は元の設定に戻るため、ご質問の様な現象は再現しませんでした。
原因はわからないですが、フォーム/サブフォーム共に、読み込み時(Loadイベント)に全てのテキストボックスの背景を白にするコードを追加することで解消できないでしょうか?
この回答への補足
ご回答ありがとうございます!
shut0325様が書いて頂いた流れであってます。
ただひとつ補足のようなものがありまして…
サブフォームにあるテキストボックスはA,Bの2つだけではなく
C,D,E,F…と19個程あります。
現段階では動作確認のためA,Bの2つしかVBAでチェックをかけていませんが、
最終的には19個ある全てのテキストボックスに別々の値(上限)の指定をし、
入力チェックを行いたい意向です。
そうだとしても、確かに全てのコントロールを確認しなくても
良いような気がしました…(汗
余裕ができたら少し記述の見直しを実施したいと思います。
無駄な処理は書かない方が他の人がみてもわかりやすいと思いますし。笑
尚、背景色の不具合についてはshut0325様が教えてくださった通り
フォームの読み込み時の処理に背景色を白にするという記述をしたところ
解決しました!!
こんな簡単な方法を、質問する前にどうしてこれが思い浮かばなかったのかと、
少々恥ずかしいです。トホホ
どうもありがとうございました。すごく助かりました><
No.1
- 回答日時:
ざっとしかみていないのですが、ずっと下のほうの、
'ctrl.BackColor = vbWhite
↑これがコメントアウトになっているからでは?
この回答への補足
ご回答ありがとうございます。
説明不足ですみません。
ご指摘頂いた記述[ctrl.BackColor = vbWhite]に関しては
別のAccessで動作確認した際はもともとなかったものです。
今回問題のAccessにて正常動作しなかったので上記記述を追加しましたが
こちらも以下エラーが表示され、正常動作しませんでした。
実行時エラー'91':
オブジェクト変数または With ブロック変数が設定されていません。
以上の流れからコメントアウトにしました。
説明が不足していまして申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Googleフォーム・複数人の申し...
-
VBA リストボックスをダブルク...
-
PDFフォームに本日の日付を自動...
-
タブコントロールを含んだフォ...
-
リストボックスの選択解除
-
Access 無操作の場合、自動で閉...
-
Accessでフォームから別フォー...
-
メインフォームからサブフォー...
-
VB.net(VB)で、フォームにExcel...
-
C# 別なフォームへ値を渡す (...
-
Access サブフォームでの複数行...
-
1つのクエリを複数のフォーム...
-
EXCELのデータフォームのサイズ...
-
ExcelVBAでフォーム内でブック...
-
Formにキーイベントを認識させ...
-
アクセスVBA フォームのス...
-
dbOpenTableとdbOpenDynaset
-
サブフォームの新規レコードに...
-
ACCESS フォーム、クエリの最前...
-
ユーザーフォーム上にアイコン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Googleフォーム・複数人の申し...
-
VBA リストボックスをダブルク...
-
Accessでフォームから別フォー...
-
アクセスVBA フォームのス...
-
サブフォームのイベント取得
-
VBAにてメッセージボックスを最...
-
サブフォームの行ごとにコンボ...
-
ExcelVBAでユーザーフォーム内...
-
サブフォームの新規レコードに...
-
フォーム上の全てのコントロー...
-
accessで2つ以上のフォームを起...
-
Accessのトグルボタンでサブフ...
-
ユーザーフォーム上にアイコン...
-
ExcelVBAでフォーム内でブック...
-
PDFフォームに本日の日付を自動...
-
リストボックスの選択解除
-
VBAでフォームのスクロールバー...
-
dbOpenTableとdbOpenDynaset
-
Access サブフォームでの複数行...
-
フォームで複数のチェックボッ...
おすすめ情報