回答編集履歴

2

補足追記

2021/11/10 00:58

投稿

hatena19
hatena19

スコア34075

test CHANGED
@@ -54,8 +54,48 @@
54
54
 
55
55
 
56
56
 
57
+ イベントの共通化について
58
+
57
59
  ---
58
60
 
59
61
  クラスを利用してイベントを共通化する方法は有効です。
60
62
 
61
- 「VBA クラスモジュール イベントの共通化」あたりをキーワードに検索する多数の解説ページが見つかりますので、そこから分かり安そうなサイトで学習するといいでしょう。
63
+ 「VBA クラスモジュール イベントの共通化」あたりをキーワードに検索する多数の解説ページが見つかりますので、そこから分かり安そうなサイトを選らんで学習するといいでしょう。
64
+
65
+
66
+
67
+
68
+
69
+ 補足
70
+
71
+ ---
72
+
73
+
74
+
75
+ 前の質問の[Excel VBA テキストボックスに入力された値を日付型に変更する](https://teratail.com/questions/368438)で補足しようと思っていたのですが、ここでしときます。
76
+
77
+
78
+
79
+ ユーザーフォームのテキストボックスの値はString型です。CDateで日付型に変換して設定してもString型になります。
80
+
81
+ 確認用コード
82
+
83
+ ```vba
84
+
85
+ Me.TextBox1.Value = CDate("2021/11/10")
86
+
87
+ MsgBox TypeName(Me.TextBox1.Value)
88
+
89
+ ```
90
+
91
+
92
+
93
+ 日付型をString型に自動で変換してくれるわけですが、そのとき、OSのコントロールパネルの日付書式設定に従いますので端末によっては異なる結果になる可能性があります。常に同じ結果にしたいなら、Format関数で書式設定するのがいいでしょう。
94
+
95
+
96
+
97
+ ```vba
98
+
99
+ Me.TextBox1.Value = Format("令和3年11月10日","yyyy/mm/dd")
100
+
101
+ ```

1

コード追記

2021/11/10 00:58

投稿

hatena19
hatena19

スコア34075

test CHANGED
@@ -11,3 +11,51 @@
11
11
  End Sub
12
12
 
13
13
  ```
14
+
15
+ ---
16
+
17
+ BeforeUpdateイベントから呼び出すことに限定するなら下記のように記述してもいいでしょう。
18
+
19
+
20
+
21
+ ```vba
22
+
23
+ Private Sub textboxA_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
24
+
25
+ checkdate Cancel
26
+
27
+ End Sub
28
+
29
+
30
+
31
+ Private Sub checkdate(ByRef Cancel As MSForms.ReturnBoolean)
32
+
33
+ Dim s As String
34
+
35
+ s = Me.ActiveControl.Value
36
+
37
+ If s Like "########" Then s = Format(s, "@@@@/@@/@@")
38
+
39
+ If Not (IsDate(s)) Then
40
+
41
+ MsgBox "日付を入力してください。"
42
+
43
+ Cancel = True
44
+
45
+ Exit Sub
46
+
47
+ End If
48
+
49
+ Me.ActiveControl.Value = Format(s, "yyyy/mm/dd")
50
+
51
+ End Sub
52
+
53
+ ```
54
+
55
+
56
+
57
+ ---
58
+
59
+ クラスを利用してイベントを共通化する方法は有効です。
60
+
61
+ 「VBA クラスモジュール イベントの共通化」あたりをキーワードに検索する多数の解説ページが見つかりますので、そこから分かり安そうなサイトで学習するといいでしょう。