最速怪談選手権

前回 http://oshiete.goo.ne.jp/qa/6556269.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

A 回答 (5件)

前回のを少し変更したものを掲載しておきます。



Private Sub コマンド6_Click()
Dim ctl As Control
Dim msg As String

For Each ctl In Me.Controls
If TypeOf ctl Is TextBox Then
If ctl.Value = 3 Then
ctl.BackColor = vbYellow
End If
End If
Next ctl



For Each ctl In Me.Controls
If TypeOf ctl Is TextBox Then
If ctl.BackColor = vbYellow Then
msg = msg & ctl.Name & vbCrLf
'これはコメントアウトしていますMsgBox ctl.Name
End If
End If
Next ctl

If Not IsNull(msg) Then
MsgBox msg
Else
MsgBox ("該当するテキストボックスはありません")
End If

End Sub
    • good
    • 0

テキストボックスを初期化するのも載せておきます。



Private Sub コマンド7_Click()
Dim ctl As Control
For Each ctl In Me.Controls
If TypeOf ctl Is TextBox Then
'テキストボックスをクリア
ctl.Value = ""
  'テキストボックスの背景色を白に
ctl.BackColor = vbWhite
End If
Next ctl
End Sub
    • good
    • 0
この回答へのお礼

お教え頂いたVBAで上手く動かす事ができました><
すごく助かりました!!
何度も何度も質問させて頂いてその度にお優しい回答下さり
ほんとうにありがとうございました;;

お礼日時:2011/02/28 17:44

ついでに少しお待ちを。

    • good
    • 0

勘違いがあったので、


合わせて以下に変更してください。


If msg <> "" Then
MsgBox msg
Else
DoCmd.Close acForm, Me.Name
End If
    • good
    • 0

No1です。



If Not IsNull(msg) Then
MsgBox msg
Else
MsgBox ("該当するテキストボックスはありません")
End If

の部分は、Elseのところが必要なければ
以下のようにしてもいいのでは、と思います。

If Not IsNull(msg) Then
MsgBox msg
End If

この回答への補足

ご回答ありがとうございます!
上記Elseを抜いたVBAの方で早速試させて頂きました!
すると、両方エラーの場合メッセージボックスに両方の
テキストボックスの名前を表示することができました!

ですが、両方ともエラーでない場合は何も記載されていない
メッセージボックスが表示されてしまうのですが
両方ともエラーでない場合はフォームを閉じる動作を
したいのですが、どうすれば宜しいでしょうか><
何度もすみません;;

補足日時:2011/02/28 16:50
    • good
    • 0

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