teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

補足追記

2021/11/10 00:58

投稿

hatena19
hatena19

スコア34367

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

コード追記

2021/11/10 00:58

投稿

hatena19
hatena19

スコア34367

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 クラスモジュール イベントの共通化」あたりをキーワードに検索する多数の解説ページが見つかりますので、そこから分かり安そうなサイトで学習するといいでしょう。