アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。前々回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

A 回答 (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個ある全てのテキストボックスに別々の値(上限)の指定をし、
入力チェックを行いたい意向です。

そうだとしても、確かに全てのコントロールを確認しなくても
良いような気がしました…(汗
余裕ができたら少し記述の見直しを実施したいと思います。
無駄な処理は書かない方が他の人がみてもわかりやすいと思いますし。笑

補足日時:2011/05/19 15:12
    • good
    • 0
この回答へのお礼

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

どうもありがとうございました。すごく助かりました><

お礼日時:2011/05/19 15:14

ざっとしかみていないのですが、ずっと下のほうの、



'ctrl.BackColor = vbWhite

↑これがコメントアウトになっているからでは?

この回答への補足

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

補足日時:2011/05/18 17:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!