ここから本文です

エクセル VBA AND条件が多すぎるとき、効率よくまとめる方法ございませんか?

kak********さん

2011/4/600:04:42

エクセル VBA AND条件が多すぎるとき、効率よくまとめる方法ございませんか?

繰り返し構文等を使ってスマートにまとめるにはどうすればよいか教えてください。
TextBox**に何書かれていない時、"何も入ってないよ!"と警告を発したいのです。
ひとつでも書いてあればその必要はありません。
For~nextではうまくいきません。
これよりも実際はTextBoxは数が多く、条件次第ではその数を変えたりしたいので、下記のように書くのは発展できなそうでして・・・。

If Me.TextBox1.Value = "" And Me.TextBox2.Value = "" And _
Me.TextBox3.Value = "" And Me.TextBox4.Value = "" And _
Me.TextBox5.Value = "" And Me.TextBox6.Value = "" And _
Me.TextBox7.Value = "" And Me.TextBox8.Value = "" And _
Me.TextBox9.Value = "" And Me.TextBox10.Value = "" And _
Me.TextBox11.Value = "" And Me.TextBox12.Value = "" And _
Me.TextBox13.Value = "" And Me.TextBox14.Value = "" Then
MsgBox "○△□"
End If

どうぞよろしくお願いいたします。

閲覧数:
3,019
回答数:
5
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

lin********さん

編集あり2011/4/610:21:11

以下のように判定用の関数を書くとすっきりします。

Function TextBoxNull(ary As Variant) As Boolean
Dim box As Variant
TextBoxNull = True
For Each box In ary
If box.Value <> "" Then
TextBoxNull = False
Exit For
End If
Next box
End Function

呼び出し側は以下のような感じ
dim ary as Variant
ary = Array(TextBox1, TextBox2, TextBox3, TextBox4, .... TextBox14)
If TextBoxNull(ary) Then
MsgBox "○△□"
End If

追記
なぜコントロールの配列を引数とする判定関数を書くかというと・・・
最初に書いた判定関数は空白判定したいコントロールにValueプロパティがあればテキストボックスに限らず使えるため効率的であることと、判定したいコントロールを呼び出し側のaryの宣言部分で自由に変更できる点があります。

質問した人からのコメント

2011/4/6 22:58:31

驚く 発展性まで考慮して頂いたのでこれに決めました
他の方もシンプルにまとめて頂いてありがとうございました。
どれも使って試しました。
あと、mahoo_nieeさんの
A="" AND B="" AND C="" の判断は A & B & C = "" と見ても同意かどうか
A<>"" OR B<>"" OR C<>"" の判断は A & B & C は1バイト以上 と見ても同意
は気にいりました。違った場面で活躍させたいと思います。
どうもありがとうございました。

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

mah********さん

2011/4/610:19:22

>ひとつでも書いてあればその必要はありません。

すべてのテキストボックスの値を連結すれば、
「ひとつでも書いてあれば」は判定できるのでは?。
ALLORNOTHINGの考え方です。
コントロール1つ1つ判定しなくてもできる方法があればその方が楽ですね。

A="" AND B="" AND C="" の判断は A & B & C = "" と見ても同意かどうか
A<>"" OR B<>"" OR C<>"" の判断は A & B & C は1バイト以上 と見ても同意かどうか
ANDやORの工夫も考えてみたら、と思います。
もちろん、同じ類のコントロールをLOOPで、というのも工夫です。

ads********さん

2011/4/607:15:29

Dim i As Integer
Dim ch As Boolean

ch = True

For i = 1 To 14

If Me.Controls("TextBox" & i).Value <> "" Then
ch = False
Exit For
End If

Next

If ch Then MsgBox "○△□"

とか?

tri********さん

2011/4/600:39:55

Controlを使ってFor each Nextで回せばテキストボックスが増えてもこのまま使えますが、こういうことでしょうか。
TypeNameでそのコントロールがテキストボックスかどうか判断し、そのテキストボックスのvalueがあればこの処理を終わり、すべて回してもどのテキストボックスのvalueもなければ最後まで(メッセージ表示まで)進むというコードです。

Sub test()
Dim ctr As MSForms.Control
For Each ctr In Me.Controls
If TypeName(ctr) = "TextBox" And ctr.Value <> "" Then
Exit Sub
End If
Next
MsgBox "どのテキストボックスにも入力がありません"
End Sub

yas********さん

2011/4/600:36:53

ExcelのVBAか…
.NETならば「Controls」を使用できますが…
s="TextBox"&i
Me.Controls(s).Value=""

って感じで…

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる