回答編集履歴
2
補足追記
answer
CHANGED
@@ -26,6 +26,26 @@
|
|
26
26
|
End Sub
|
27
27
|
```
|
28
28
|
|
29
|
+
イベントの共通化について
|
29
30
|
---
|
30
31
|
クラスを利用してイベントを共通化する方法は有効です。
|
31
|
-
「VBA クラスモジュール イベントの共通化」あたりをキーワードに検索する多数の解説ページが見つかりますので、そこから分かり安そうなサイトで学習するといいでしょう。
|
32
|
+
「VBA クラスモジュール イベントの共通化」あたりをキーワードに検索する多数の解説ページが見つかりますので、そこから分かり安そうなサイトを選らんで学習するといいでしょう。
|
33
|
+
|
34
|
+
|
35
|
+
補足
|
36
|
+
---
|
37
|
+
|
38
|
+
前の質問の[Excel VBA テキストボックスに入力された値を日付型に変更する](https://teratail.com/questions/368438)で補足しようと思っていたのですが、ここでしときます。
|
39
|
+
|
40
|
+
ユーザーフォームのテキストボックスの値はString型です。CDateで日付型に変換して設定してもString型になります。
|
41
|
+
確認用コード
|
42
|
+
```vba
|
43
|
+
Me.TextBox1.Value = CDate("2021/11/10")
|
44
|
+
MsgBox TypeName(Me.TextBox1.Value)
|
45
|
+
```
|
46
|
+
|
47
|
+
日付型をString型に自動で変換してくれるわけですが、そのとき、OSのコントロールパネルの日付書式設定に従いますので端末によっては異なる結果になる可能性があります。常に同じ結果にしたいなら、Format関数で書式設定するのがいいでしょう。
|
48
|
+
|
49
|
+
```vba
|
50
|
+
Me.TextBox1.Value = Format("令和3年11月10日","yyyy/mm/dd")
|
51
|
+
```
|
1
コード追記
answer
CHANGED
@@ -4,4 +4,28 @@
|
|
4
4
|
Private Sub textboxA_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
|
5
5
|
Cancel = checkdate(Me.ActiveControl)
|
6
6
|
End Sub
|
7
|
-
```
|
7
|
+
```
|
8
|
+
---
|
9
|
+
BeforeUpdateイベントから呼び出すことに限定するなら下記のように記述してもいいでしょう。
|
10
|
+
|
11
|
+
```vba
|
12
|
+
Private Sub textboxA_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
|
13
|
+
checkdate Cancel
|
14
|
+
End Sub
|
15
|
+
|
16
|
+
Private Sub checkdate(ByRef Cancel As MSForms.ReturnBoolean)
|
17
|
+
Dim s As String
|
18
|
+
s = Me.ActiveControl.Value
|
19
|
+
If s Like "########" Then s = Format(s, "@@@@/@@/@@")
|
20
|
+
If Not (IsDate(s)) Then
|
21
|
+
MsgBox "日付を入力してください。"
|
22
|
+
Cancel = True
|
23
|
+
Exit Sub
|
24
|
+
End If
|
25
|
+
Me.ActiveControl.Value = Format(s, "yyyy/mm/dd")
|
26
|
+
End Sub
|
27
|
+
```
|
28
|
+
|
29
|
+
---
|
30
|
+
クラスを利用してイベントを共通化する方法は有効です。
|
31
|
+
「VBA クラスモジュール イベントの共通化」あたりをキーワードに検索する多数の解説ページが見つかりますので、そこから分かり安そうなサイトで学習するといいでしょう。
|