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

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

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

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

Q&A

解決済

1回答

2398閲覧

Excel VBA 複数のコントロール(テキストボックス)で同じ処理をする(同じ関数を呼び出す)

mnbwqz

総合スコア74

VBA

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

0グッド

0クリップ

投稿2021/11/10 00:07

Excel VBAで複数のコントロール(テキストボックス)で同じ処理(入力された値が日付かどうか判定し、違う場合は再入力を促す)をしています。
2点質問があります。
1.checkdate(textboxA)の「textboxA」の部分を「Me」などのように
どのテキストボックスでも同じ表記に変更することはできますでしょうか。
2.クラスという考え方があるそうですが、今回の場合、利用できますでしょうか。

VBA

1Private Sub textboxA_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) 2 Cancel = checkdate(textboxA) 3End Sub 4 5Private Function checkdate(ByVal ctrl As MSForms.Control) As Boolean 6 checkdate = False 7 If ctrl Like "########" Then ctrl = Format(ctrl, "@@@@/@@/@@") 8 If Not (IsDate(ctrl)) Then 9 MsgBox "日付を入力してください。" 10 checkdate = True 11 Exit Function 12 End If 13 ctrl = CDate(ctrl) 14End Function

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

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

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

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

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

guest

回答1

0

ベストアンサー

BeforeUpdateイベントが発生するコントロールは必ずアクティブなはずですから、Me.ActiveControl でいいでしょう。

vba

1Private Sub textboxA_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) 2 Cancel = checkdate(Me.ActiveControl) 3End Sub

BeforeUpdateイベントから呼び出すことに限定するなら下記のように記述してもいいでしょう。

vba

1Private Sub textboxA_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) 2 checkdate Cancel 3End Sub 4 5Private Sub checkdate(ByRef Cancel As MSForms.ReturnBoolean) 6 Dim s As String 7 s = Me.ActiveControl.Value 8 If s Like "########" Then s = Format(s, "@@@@/@@/@@") 9 If Not (IsDate(s)) Then 10 MsgBox "日付を入力してください。" 11 Cancel = True 12 Exit Sub 13 End If 14 Me.ActiveControl.Value = Format(s, "yyyy/mm/dd") 15End Sub

イベントの共通化について

クラスを利用してイベントを共通化する方法は有効です。
「VBA クラスモジュール イベントの共通化」あたりをキーワードに検索する多数の解説ページが見つかりますので、そこから分かり安そうなサイトを選らんで学習するといいでしょう。

補足

前の質問のExcel VBA テキストボックスに入力された値を日付型に変更するで補足しようと思っていたのですが、ここでしときます。

ユーザーフォームのテキストボックスの値はString型です。CDateで日付型に変換して設定してもString型になります。
確認用コード

vba

1 Me.TextBox1.Value = CDate("2021/11/10") 2 MsgBox TypeName(Me.TextBox1.Value)

日付型をString型に自動で変換してくれるわけですが、そのとき、OSのコントロールパネルの日付書式設定に従いますので端末によっては異なる結果になる可能性があります。常に同じ結果にしたいなら、Format関数で書式設定するのがいいでしょう。

vba

1 Me.TextBox1.Value = Format("令和3年11月10日","yyyy/mm/dd")

投稿2021/11/10 00:36

編集2021/11/10 00:58
hatena19

総合スコア33795

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

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

mnbwqz

2021/11/12 09:34

ご回答ありがとうございます。 教えていただきました通り、Me.ActiveControlに変更しました。 補足ありがとうございます。 現在うまく表示されているので、気づかない点でした。 >OSのコントロールパネルの日付書式設定に従いますので端末によっては異なる結果になる可能性があります。常に同じ結果にしたいなら、Format関数で書式設定するのがいいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問