回答編集履歴

3

補足追記

2018/03/30 08:46

投稿

hatena19
hatena19

スコア33742

test CHANGED
@@ -187,3 +187,17 @@
187
187
  End Sub
188
188
 
189
189
  ```
190
+
191
+
192
+
193
+ 標準モジュールに、Public変数とプロシージャを記述することでコードの一元化は可能ですが、クラスにすることのメリットは、コードの一元化ができて、なおかつ、
194
+
195
+
196
+
197
+ > 一つの方法しては変数をpublicにするのも手だがグローバルにすると予想もつかない動きをする可能性がある
198
+
199
+
200
+
201
+ という危険性も回避できます。
202
+
203
+ 例えば、ユーザーフォームを同時に2つ開いて、それぞれで、MyProcクラスを生成して、対象シート、コントロールを設定しても、両者で競合することなく、正しく処理が実行されます。2つは別インスタンスになり、それぞれが独自に変数を所持できますので。

2

サンプルコードの追加2

2018/03/30 08:46

投稿

hatena19
hatena19

スコア33742

test CHANGED
@@ -109,3 +109,81 @@
109
109
  End Sub
110
110
 
111
111
  ```
112
+
113
+
114
+
115
+ 追記2
116
+
117
+ ---
118
+
119
+ 質問の、fmCustomerEntryName_Configプロシージャを見ると複数のコントロールとシートが必要のようなので、下記の方が希望に近いかな。
120
+
121
+
122
+
123
+ クラスモジュール MyProc
124
+
125
+ ```vba
126
+
127
+ Option Explicit
128
+
129
+
130
+
131
+ Private targetSh As Worksheet
132
+
133
+ Private mtxt1 As MSForms.TextBox
134
+
135
+ Private mcob1 As MSForms.ComboBox
136
+
137
+
138
+
139
+ Public Sub Init(ByRef ws As Worksheet, ByRef tb As MSForms.TextBox, ByRef cb As MSForms.ComboBox)
140
+
141
+ Set targetSh = ws
142
+
143
+ Set mtxt1 = tb
144
+
145
+ Set mcob1 = cb
146
+
147
+ End Sub
148
+
149
+
150
+
151
+ Public Sub Exec()
152
+
153
+ targetSh.Range("A1").Value = mtxt1.Value
154
+
155
+ targetSh.Range("A2").Value = mcob1.Value
156
+
157
+ End Sub
158
+
159
+ ```
160
+
161
+
162
+
163
+ ユーザーフォームのモジュール
164
+
165
+ ```vba
166
+
167
+ Option Explicit
168
+
169
+
170
+
171
+ Dim Prc As New MyProc
172
+
173
+
174
+
175
+ Private Sub CommandButton1_Click()
176
+
177
+ Prc.Exec
178
+
179
+ End Sub
180
+
181
+
182
+
183
+ Private Sub UserForm_Initialize()
184
+
185
+ Prc.Init Sheet1, Me.TextBox1, Me.ComboBox1
186
+
187
+ End Sub
188
+
189
+ ```

1

サンプルコードの追記

2018/03/30 05:10

投稿

hatena19
hatena19

スコア33742

test CHANGED
@@ -7,3 +7,105 @@
7
7
 
8
8
 
9
9
  [複数のコントロールのイベントを一つのプロシージャにまとめる(ExcelVBA) \- パソコンカレッジ スタッフのひとりごと](https://blog.goo.ne.jp/pc_college/e/9ca2b0c452e9e691cad1dbd2783868cf)
10
+
11
+
12
+
13
+ 追記
14
+
15
+ ---
16
+
17
+
18
+
19
+ 他の人の回答へのコメントを見ました
20
+
21
+
22
+
23
+ > それぞれのユーザーフォームをみたとき、似たようなイベントするコントロールがあることに気付く。
24
+
25
+ > このばあいイベント内の共有部分を標準モジュールでサブルーチン化して呼び出すほうが、コード量が減るし、コードの改変が容易になる。
26
+
27
+ > だたし、各フォームによって、似たようなイベントをもつコントロールであってもコントロール名が異なる。
28
+
29
+ > 一つの方法しては変数をpublicにするのも手だがグローバルにすると予想もつかない動きをする可能性があるので変数はフォーム内で閉じておきたい。
30
+
31
+
32
+
33
+ やはり、クラスモジュールで対応するのがベストかと思います。
34
+
35
+ 具体的に何をしたいのか不明ですが、とりあえずシンプルなサンプルを。
36
+
37
+
38
+
39
+ クラスモジュール MyTextBox
40
+
41
+ ```vba
42
+
43
+ Private WithEvents txtb As MSForms.TextBox
44
+
45
+
46
+
47
+ 'クラスとテキストボックスを関連付け
48
+
49
+ Public Sub Bind(ByVal c As MSForms.TextBox)
50
+
51
+ Set txtb = c
52
+
53
+ End Sub
54
+
55
+
56
+
57
+ '共通処理
58
+
59
+ Public Sub ProcA()
60
+
61
+
62
+
63
+ MsgBox "テキストボックスの値は「" & txtb.Value & "」です。"
64
+
65
+
66
+
67
+ 'ここに共通処理を記述
68
+
69
+
70
+
71
+ End Sub
72
+
73
+
74
+
75
+ Private Sub txtb_Change()
76
+
77
+ Debug.Print "テキストが「" & txtb.Value & " 」に更新されました。"
78
+
79
+ End Sub
80
+
81
+ ```
82
+
83
+
84
+
85
+ ユーザーフォームのモジュール
86
+
87
+ ```vba
88
+
89
+ Option Explicit
90
+
91
+
92
+
93
+ Dim cTextbox As New MyTextbox
94
+
95
+
96
+
97
+ Private Sub CommandButton1_Click()
98
+
99
+ cTextbox.ProcA
100
+
101
+ End Sub
102
+
103
+
104
+
105
+ Private Sub UserForm_Initialize()
106
+
107
+ cTextbox.Bind Me.TextBox1
108
+
109
+ End Sub
110
+
111
+ ```