• ベストアンサー

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

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

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

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

コレクションを利用した方法を紹介します。 下記は机上コーディングのみなので、そのままペーストで確実に動作する保証はできないですが。 'チェックする対象のテキストボックスを格納するコレクション Dim colValueCheckTextBoxes As 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で追加しないことでその項目はチェック対象にならない、と制御できるという利点があります。

na714
質問者

お礼

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

na714
質問者

補足

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

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.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   以上。  

na714
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.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文でまわすことができます。 以上。

na714
質問者

補足

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

すると、全ての回答が全文表示されます。

関連するQ&A