質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

680閲覧

ExcelVBAのFunctionを利用して、コマンドボタンを有効にしたい

ikedaikegami

総合スコア3

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/02/28 01:13

Excel VBAについて

ユーザーフォームで
名前⇒txtTextBox1
年齢⇒txtTextBox2
電話番号⇒txtTextBox3

上記のTextBoxに、全て値が入ったら、コマンドボタンを押せるようにしたいです。

入力漏れを判定

Public Function 入力漏れ無() As Boolean Dim myCtrl As Control For Each myCtrl In Me.Controls If myCtrl.Name Like "txt*" Then If Len(myCtrl.Value) = 0 Then 入力漏れ無 = True End If End If Next 入力漏れ無 = False End Function

3つのテキストボックスの値が変わったときの判定

Sub textbox_change() Dim myCtrl As Control For Each myCtrl In UserForm1.Controls If myCtrl.Name Like "txt*" Then EnableCB1Button myCtrl.Name End If Next End Sub

コマンドボタンを押す判定

Private Sub EnableCB1Button(ByVal txtData As String) Dim myCtrl As Control For Each myCtrl In Me.Controls If Len(txtData) = 0 Then CB1 = False ElseIf 入力漏れ無 = False Then CB1.Enabled = True End If Next End Sub

どうしてもコマンドボタンが有効になりません。

どこを修正するのが、お手数ですが、ご教示をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Private Sub txtTextBox1_Change()
CB1.Enabled = 入力漏れ無
End Sub
この部分ですが、TextBoxの数だけ、書かなければならないのでしょうか?

既に、解決済みですが
この部分を1か所にまとめる方法です。
ただし、ほかの記述が増えるので、TextBoxが3個では、割に合わないかもしれません。
(100個ほどあるならありがたみがあるかと)

1.クラスジュール(Class1とします)へ以下を記述

VBA

1Option Explicit 2'複数イベントを1つにまとめる 3Private WithEvents TextEv As MSForms.TextBox 4 5Public Sub NewClass(ByVal Tbox As MSForms.TextBox) 6 'コンストラクタ処理 7 Set TextEv = Tbox 8End Sub 9Private Sub TextEv_Change() 10 Call CB1Enable 11End Sub

2.標準モジュールへ以下を記述

VBA

1Option Explicit 2 3Public Sub CB1Enable() 4 UserForm1.CB1.Enabled = 入力漏れ無 5End Sub 6 7Public Function 入力漏れ無() As Boolean 8 Dim myCtrl As Control 9 入力漏れ無 = True 10 For Each myCtrl In UserForm1.Controls 11 If myCtrl.Name Like "txt*" Then 12 If Len(myCtrl.Value) = 0 Then 13 入力漏れ無 = False 14 Exit Function 15 End If 16 End If 17 Next 18End Function

3.フォームモジュールへ以下を記述します。フォーム名は UserForm1とします。

VBA

1Option Explicit 2 3 4Private NumText(1 To 3) As New Class1 5 6Private Sub UserForm_Initialize() 7 'インスタンスの生成 8 Dim i As Long 9 For i = 1 To 3 10 NumText(i).NewClass Controls("txtTextBox" & i) 11 Next 12End Sub

以上で、期待した結果になるかと思います。

投稿2022/02/28 08:21

tatsu99

総合スコア5462

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedaikegami

2022/02/28 08:39

思い通りの結果になりました。 本当にありがとうございました。
guest

0

ユーザーフォームのモジュールに下記でどうでしょう。

vba

1Option Explicit 2 3Private Sub UserForm_Initialize() 4 CB1.Enabled = False 'コマンドボタンを使用不可に(プロパティで設定してあるなら不要) 5End Sub 6 7Private Sub txtTextBox1_change() 8 EnableCB1Button 9End Sub 10 11Private Sub txtTextBox2_change() 12 EnableCB1Button 13End Sub 14 15Private Sub txtTextBox3_change() 16 EnableCB1Button 17End Sub 18 19Private Sub EnableCB1Button() 20 Dim Ctl As Control 21 CB1.Enabled = True 22 For Each Ctl In Me.Controls 23 If Ctl.Name Like "txt*" Then 24 If Ctl.Value = "" Then 25 CB1.Enabled = False 26 Exit For 27 End If 28 End If 29 Next 30End Sub

投稿2022/02/28 02:14

hatena19

総合スコア33782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

セルが変更された場合に実行したいということであれば、シートモジュールに以下のように記載していただければ動いてくれます。
Worksheet_Changeで変更されたことを検知して、Target.Name.Nameでセル名を取得、比較して対象であれば処理が動くという書き方になります。

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 '変数の宣言 3 If Target.Name.Name Like "txt*" Then 4 '実行したい処理 5 End If 6End Sub

投稿2022/02/28 02:14

tenshonkawaru

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedaikegami

2022/02/28 03:12

回答ありがとうございました。
ikedaikegami

2022/02/28 03:12

回答ありがとうございました。
guest

0

ベストアンサー

VBA

1Option Explicit 2Public Function 入力漏れ無() As Boolean 3Dim myCtrl As Control 4入力漏れ無 = True 5For Each myCtrl In Me.Controls 6If myCtrl.Name Like "txt*" Then 7If Len(myCtrl.Value) = 0 Then 8入力漏れ無 = False 9Exit Function 10End If 11End If 12Next 13End Function 14 15Private Sub txtTextBox1_Change() 16CB1.Enabled = 入力漏れ無 17End Sub 18 19Private Sub txtTextBox2_Change() 20CB1.Enabled = 入力漏れ無 21End Sub 22 23Private Sub txtTextBox3_Change() 24CB1.Enabled = 入力漏れ無 25End Sub

投稿2022/02/28 01:31

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedaikegami

2022/02/28 01:46

回答ありがとうございます。 Private Sub txtTextBox1_Change() CB1.Enabled = 入力漏れ無 End Sub Private Sub txtTextBox2_Change() CB1.Enabled = 入力漏れ無 End Sub Private Sub txtTextBox3_Change() CB1.Enabled = 入力漏れ無 End Sub この部分ですが、TextBoxの数だけ、書かなければならないのでしょうか? お手すきの時に回答いただけたら幸いです。
iruyas

2022/02/28 01:47

基本的にはそうなります。
ikedaikegami

2022/02/28 03:11

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問