こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAでの テキストボックス内の値検索について

お世話になります。
早速質問致します。エクセルVBAでユーザーフォームへ配置された
各テキストボックスへ入力を忘れた箇所がある場合それを見つけ出し
メッセージボックスで入力忘れを表示させ、さらに、その入力を忘れ
てしまった空欄のテキストボックスにフォーカスを移動させたいので
すが、どのように指令したら良いのでしょうか?
ちなみにテキストボックスは15個設けています。それらを一度に
検索する方法がありましたら、アドバイスお願い致します。

投稿日時 - 2006-01-14 21:55:15

QNo.1896374

すぐに回答ほしいです

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

コレクションを利用した方法を紹介します。
下記は机上コーディングのみなので、そのままペーストで確実に動作する保証はできないですが。

'チェックする対象のテキストボックスを格納するコレクション
Dim colValueCheckTextBoxesAs Collection

'コレクションを初期化する処理
Private Sub InitValueCheck()
  'コレクションを作成する
  Set colValueCheckTextBoxes = New Collection
  
  'チェックする対象のテキストボックスへの参照を追加する
  With colValueCheckTextBoxes
    .Add テキストボックス1
    .Add テキストボックス2
    .Add テキストボックス3
    ・・・・・
    .Add テキストボックスN
  End With
End Sub

'空白のチェックを行う
'返り値True/False 空白項目がない/空白項目がある
Private Function DoValueChecks() As Boolean
  Dim i As Long

  '成功すると仮定して返り値を初期化
  DoValueChecks = True

  'コレクションに追加されたテキストボックスの値を確認する
  For i = 1 To colValueCheckTextBoxes.Count
    With colValueCheckTextBoxes(i)
      '最初に発見された空白のテキストボックスコントロールにフォーカスを設定して終了
      If .Value = vbNullString Then
        MsgBox .Name & "が未入力です"
        .SetFocus
        '返り値を異常終了に設定してループを抜ける
        DoValueChecks = False
        Exit For
      End If
    End With
  Next
End Function

最初に一度だけ(例えばFormLoad時など)InitValueCheckを呼び出す必要があります。
また、チェック実行時にDoValueChecksを実行して、Trueが返った場合はすべての項目が入力された状態だと判定できます。
入力するテキストボックスが増えた場合、InitValueCheck内に、そのテキストボックスへ参照を追加する必要がある、と自動メンテナンスではないという欠点はありますが。
入力必須ではない項目がある場合、InitValueCheckで追加しないことでその項目はチェック対象にならない、と制御できるという利点があります。

投稿日時 - 2006-01-15 02:14:32

補足

ご回答ありがとうございます。
お手数ですが、内容の詳しい説明をお願い致します。
何しろ超初心者なので・・・。
お願い致します。

投稿日時 - 2006-01-15 15:53:14

お礼

親切丁寧な指導ありがとうございました。
初心者なので本当に助かりました。構文の内容を
よく読んでチャレンジしてみたいと思います。
また機会がありましたら、ご指導お願い致します。

投稿日時 - 2006-01-16 20:56:12

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

No1です。
>すいませんが、内容の説明をお願いできないでしょうか?

お易い御用なり。
とは言ってもそれぞれのヘルプを見れば分かることですので改めて説明するようなところはないのですが(^^;;

--------------------------------------------

'コマンドボタンのクリックイベント

Private Sub CommandButton1_Click()

'Nは、TextBox1,2,3...の番号取得用変数

 Dim N As Integer

'TextBoxが15個あるのでそれをFor文でまわす

 For N = 1 To 15

'MeはUserFormのこと。別になくてよい
'Controls("TextBox1") でTextBox1を表すので
'それを15も書くと煩わしいので変数Nと組合せて15個分を1個で済むようにする

'Textboxの内容が空白かどうかきく

  If Me.Controls("TextBox" & N).Value = "" Then

'空白(未入力)だったらTextBox欄の項目表示に使っているLabelのCaptionプロパティを表示する

    MsgBox Me.Controls("Label" & N).Caption & " は未入力です"

'メッセージを確認したら未入力TextBoxへ飛ぶ

    Me.Controls("TextBox" & N).SetFocus

'イベント処理を抜ける

    Exit Sub

  End If

 Next N

End Sub
 

以上。
 

投稿日時 - 2006-01-16 12:56:50

お礼

丁寧な解説で本当に助かりました。早速試してみたところ
見事に成功致しました。無事解決です。
経験者の方は簡単なことかも知れませんが、自分で作った
ものが機能すると感動です。
本当にありがとうございました。

投稿日時 - 2006-01-16 20:51:00

ANo.1

こんばんは。

UserFormには、CommandButton(例えば書込み用)があって、それをクリックした時、TextBoxの未入力チェックでいいんですよね。

UserFormにCommandButtonがひとつと、
LabelとTextBoxのペアが15個配置してあるとする
(LabelはTextBoxの見出し用)


------------------------------------------
Private Sub CommandButton1_Click()
 Dim N As Integer
 For N = 1 To 15
  If Me.Controls("TextBox" & N).Value = "" Then
    MsgBox Me.Controls("Label" & N).Caption & " は未入力です"
    Me.Controls("TextBox" & N).SetFocus
    Exit Sub
  End If
 Next N
End Sub
----------------------------------------

たとえ上記が勘違いであるとしても、
少なくとも、Controlsを使うことでFor文でまわすことができます。

以上。

投稿日時 - 2006-01-15 00:14:27

補足

ご回答ありがとうございます。説明不足ですいませんでした。
はい、コマンドボタンでの処理です。
ところで、すいませんが、内容の説明をお願いできないでしょうか?
超初心者なもので、構文の理解をしておきたいのですが・・・。

投稿日時 - 2006-01-15 15:49:23

あなたにオススメの質問