質問編集履歴

3

リンク先を修正しました。

2019/09/07 06:08

投稿

ControlSource
ControlSource

スコア4

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- [第21講 電卓の高度化その 第6話 メモリボタンーティグ例](http://suugaku.biz/vbakougi/dai3bu/dai21koudai6wa.html)
1
+ [ExcelVBAで電卓を作ろう-その3 「コドを書こう」 - パソコンカレッジ スタッフのひとりごと](https://blog.goo.ne.jp/pc_college/e/7a8247554435af7d4d139cb65f54c752)
2
2
 
3
3
 
4
4
 

2

文章を要約してみました。

2019/09/07 06:08

投稿

ControlSource
ControlSource

スコア4

test CHANGED
File without changes
test CHANGED
@@ -14,11 +14,9 @@
14
14
 
15
15
  ―――――――――――――――――
16
16
 
17
- **・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。**
17
+ ・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。
18
-
18
+
19
- **・「-」「5」「×」「-」「5」「=」と入力すると、2つ目の「-」の時点で「25」という値になり、最後の「=」で、20という値が出てきてしまいます。(正しくは「=」を押した後に「25」ですが)
19
+ ・「-」「5」「×」「-」「5」「=」と入力すると、2つ目の「-」の時点で「25」という値になり、最後の「=」で、20という値が出てきてしまいます。(正しくは「=」を押した後に「25」ですが)
20
-
21
- **
22
20
 
23
21
  ―――――――――――――――――
24
22
 
@@ -28,28 +26,6 @@
28
26
 
29
27
 
30
28
 
31
- ~~―――――――――――――――
32
-
33
- ユーザーフォーム
34
-
35
- https://gist.github.com/AuroraNorthernQuarter/08fe8104867470fc827076bb9116b60e
36
-
37
- 標準モジュール
38
-
39
- https://gist.github.com/AuroraNorthernQuarter/a5bb57afe5217ab5b92e40062ef590b5
40
-
41
- クラスモジュール
42
-
43
- https://gist.github.com/AuroraNorthernQuarter/9b955f1701924e3f80f1e7053bba8e98
44
-
45
- ―――――――――――――――
46
-
47
-
48
-
49
- にそれぞれコードを記述しました(著作権に抵触するかもしれませんので、疑問が解決しましたらリンク先のコードは削除します)。~~
50
-
51
-
52
-
53
29
  お力添えをいただけますと助かります。よろしくお願い致します。
54
30
 
55
31
 

1

リンク先を貼り直しました。コードを質問上に記載しました。

2019/09/07 02:12

投稿

ControlSource
ControlSource

スコア4

test CHANGED
@@ -1 +1 @@
1
- ExcelVBAで電卓を作ろうとしたのですが
1
+ ExcelVBAで電卓を作ろうとしたのですが減算の値の処理がうまくいきません
test CHANGED
@@ -1,12 +1,10 @@
1
- 第21講 電卓の高度化その1 第6話 メモリーボタンコーティング例
2
-
3
- http://suugaku.biz/vbakougi/dai3bu/dai21koudai6wa.html
1
+ [第21講 電卓の高度化その1 第6話 メモリーボタンコーティング例](http://suugaku.biz/vbakougi/dai3bu/dai21koudai6wa.html)
4
2
 
5
3
 
6
4
 
7
5
  のサイトを拝見し、ExcelVBAを用いた電卓の作成を試みました。
8
6
 
9
- コードは上記サイトの手順通りに作成(というか全て引用なのですが…)しまして、なんとかExcel上で形にはなりました。作った電卓のファイルはこちら http://xfs.jp/aUZ2qI にあります。
7
+ コードは上記サイトの手順通りに作成(というか全て引用なのですが…)しまして、なんとかExcel上で形にはなりました。[作った電卓のファイルはこちら](http://xfs.jp/aUZ2qI)にあります。
10
8
 
11
9
 
12
10
 
@@ -16,9 +14,11 @@
16
14
 
17
15
  ―――――――――――――――――
18
16
 
19
- ・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。
17
+ **・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。**
20
-
18
+
21
- ・「-」「5」「×」「-」「5」「=」と入力すると、2つ目の「-」の時点で「25」という値になり、最後の「=」で、20という値が出てきてしまいます。(正しくは「=」を押した後に「25」ですが)
19
+ **・「-」「5」「×」「-」「5」「=」と入力すると、2つ目の「-」の時点で「25」という値になり、最後の「=」で、20という値が出てきてしまいます。(正しくは「=」を押した後に「25」ですが)
20
+
21
+ **
22
22
 
23
23
  ―――――――――――――――――
24
24
 
@@ -28,26 +28,428 @@
28
28
 
29
29
 
30
30
 
31
+ ~~―――――――――――――――
32
+
33
+ ユーザーフォーム
34
+
35
+ https://gist.github.com/AuroraNorthernQuarter/08fe8104867470fc827076bb9116b60e
36
+
37
+ 標準モジュール
38
+
39
+ https://gist.github.com/AuroraNorthernQuarter/a5bb57afe5217ab5b92e40062ef590b5
40
+
41
+ クラスモジュール
42
+
43
+ https://gist.github.com/AuroraNorthernQuarter/9b955f1701924e3f80f1e7053bba8e98
44
+
31
45
  ―――――――――――――――
32
46
 
33
- ユーザーフォーム
47
+
34
-
35
- https://gist.github.com/AuroraNorthernQuarter/08fe8104867470fc827076bb9116b60e
48
+
36
-
37
- 標準モジュール
38
-
39
- https://gist.github.com/AuroraNorthernQuarter/a5bb57afe5217ab5b92e40062ef590b5
40
-
41
- クラスモジュール
42
-
43
- https://gist.github.com/AuroraNorthernQuarter/9b955f1701924e3f80f1e7053bba8e98
44
-
45
- ―――――――――――――――
46
-
47
-
48
-
49
- にそれぞれコードを記述しました(著作権に抵触するかもしれませんので、疑問が解決しましたらリンク先のコードは削除します)。
49
+ にそれぞれコードを記述しました(著作権に抵触するかもしれませんので、疑問が解決しましたらリンク先のコードは削除します)。~~
50
50
 
51
51
 
52
52
 
53
53
  お力添えをいただけますと助かります。よろしくお願い致します。
54
+
55
+
56
+
57
+ ※コードをリンク先ではなく、ここに貼り付けます。
58
+
59
+ ### ユーザーフォーム
60
+
61
+ ```VBAです
62
+
63
+ Option Explicit
64
+
65
+
66
+
67
+ Private NumBtn(0 To 9) As New Class1
68
+
69
+ Private stack(0 To 1) As Currency
70
+
71
+ Private Action As Integer
72
+
73
+
74
+
75
+ Private Enum Act
76
+
77
+ Equal
78
+
79
+ Plus
80
+
81
+ Minus
82
+
83
+ Multi
84
+
85
+ Devi
86
+
87
+ End Enum
88
+
89
+
90
+
91
+ Private Sub UserForm_Initialize()
92
+
93
+
94
+
95
+ 'インスタンスの生成
96
+
97
+ Dim i As Integer
98
+
99
+ For i = 0 To 9
100
+
101
+ NumBtn(i).NewClass Controls("b" & i), i
102
+
103
+ Next
104
+
105
+
106
+
107
+ '表示設定
108
+
109
+ TextBox1.Text = 0
110
+
111
+
112
+
113
+ '初期化処理
114
+
115
+ InitCalc
116
+
117
+
118
+
119
+ End Sub
120
+
121
+
122
+
123
+
124
+
125
+ Private Sub InitCalc()
126
+
127
+ '初期化処理
128
+
129
+
130
+
131
+ 'スタックと記号の初期化
132
+
133
+ stack(0) = 0
134
+
135
+ stack(1) = 0
136
+
137
+ Action = Act.Plus
138
+
139
+
140
+
141
+ '表示クリアフラグの初期化
142
+
143
+ IsNew = True
144
+
145
+
146
+
147
+ End Sub
148
+
149
+
150
+
151
+ Private Sub Calc(ByVal CurrentAction As Integer)
152
+
153
+ '計算処理(記号ボタンが押されると呼び出される)
154
+
155
+
156
+
157
+ '電卓窓の数字を変数に格納
158
+
159
+ Dim n As Long
160
+
161
+ n = CLng(TextBox1.Text)
162
+
163
+ stack(1) = n
164
+
165
+
166
+
167
+ '計算結果を格納する変数
168
+
169
+ Dim Ans As Double
170
+
171
+
172
+
173
+ Select Case Action
174
+
175
+ Case Act.Equal
176
+
177
+ '=
178
+
179
+ Action = Act.Equal
180
+
181
+ Case Act.Plus
182
+
183
+ '+
184
+
185
+ Ans = stack(0) + stack(1)
186
+
187
+ stack(0) = Ans
188
+
189
+ stack(1) = 0
190
+
191
+ TextBox1.Text = Ans
192
+
193
+ Case Act.Minus
194
+
195
+ '-
196
+
197
+ Ans = stack(0) - stack(1)
198
+
199
+ stack(0) = Ans
200
+
201
+ stack(1) = 0
202
+
203
+ TextBox1.Text = Ans
204
+
205
+ Case Act.Multi
206
+
207
+ '*
208
+
209
+ Ans = stack(0) * stack(1)
210
+
211
+ stack(0) = Ans
212
+
213
+ stack(1) = 0
214
+
215
+ TextBox1.Text = Ans
216
+
217
+ Case Act.Devi
218
+
219
+ '/
220
+
221
+ If stack(1) = 0 Then
222
+
223
+ Ans = 0
224
+
225
+ Else
226
+
227
+ Ans = stack(0) / stack(1)
228
+
229
+ End If
230
+
231
+ stack(0) = Ans
232
+
233
+ stack(1) = 0
234
+
235
+ TextBox1.Text = Ans
236
+
237
+ End Select
238
+
239
+
240
+
241
+ '引数で受け取った記号を格納
242
+
243
+ Action = CurrentAction
244
+
245
+ '新規入力にする
246
+
247
+ IsNew = True
248
+
249
+
250
+
251
+ End Sub
252
+
253
+
254
+
255
+ Private Sub Plus_Click()
256
+
257
+ '足し算
258
+
259
+
260
+
261
+ 'サブプロシージャの呼び出し
262
+
263
+ Calc Act.Plus
264
+
265
+
266
+
267
+ End Sub
268
+
269
+
270
+
271
+
272
+
273
+ Private Sub Minus_Click()
274
+
275
+ '引き算
276
+
277
+
278
+
279
+ 'サブプロシージャの呼び出し
280
+
281
+ Calc Act.Minus
282
+
283
+
284
+
285
+ End Sub
286
+
287
+
288
+
289
+
290
+
291
+ Private Sub Multi_Click()
292
+
293
+ '掛け算
294
+
295
+
296
+
297
+ 'サブプロシージャの呼び出し
298
+
299
+ Calc Act.Multi
300
+
301
+
302
+
303
+ End Sub
304
+
305
+
306
+
307
+ Private Sub Devi_Click()
308
+
309
+ '割り算
310
+
311
+
312
+
313
+ 'サブプロシージャの呼び出し
314
+
315
+ Calc Act.Devi
316
+
317
+
318
+
319
+ End Sub
320
+
321
+
322
+
323
+ Private Sub btnEnter_Click()
324
+
325
+ '=の処理
326
+
327
+
328
+
329
+ 'サブプロシージャの呼び出し
330
+
331
+ Calc Act.Equal
332
+
333
+
334
+
335
+ End Sub
336
+
337
+ Private Sub btnAC_Click()
338
+
339
+ 'ACボタンの処理
340
+
341
+
342
+
343
+ TextBox1.Text = 0
344
+
345
+
346
+
347
+ '初期化処理
348
+
349
+ InitCalc
350
+
351
+
352
+
353
+ End Sub
354
+
355
+
356
+
357
+ ```
358
+
359
+
360
+
361
+ ### 標準モジュール
362
+
363
+ ```VBAです
364
+
365
+ Option Explicit
366
+
367
+
368
+
369
+ Public IsNew As Boolean
370
+
371
+
372
+
373
+ Public Sub ShowCalc()
374
+
375
+ frmCalc.Show
376
+
377
+ End Sub
378
+
379
+ ```
380
+
381
+ ### クラスモジュール
382
+
383
+ ```VBAです
384
+
385
+ Option Explicit
386
+
387
+
388
+
389
+ 'イベントを持つコマンドボタン型の変数を宣言
390
+
391
+ Private WithEvents Btn As MSForms.CommandButton
392
+
393
+ 'ボタンの数字を格納する変数を宣言
394
+
395
+ Private Index As Integer
396
+
397
+
398
+
399
+ Public Sub NewClass(ByVal c As MSForms.CommandButton, _
400
+
401
+ ByVal i As Integer)
402
+
403
+ 'いわゆるコンストラクタ処理
404
+
405
+
406
+
407
+ '引数のコマンドボタンを変数に格納
408
+
409
+ Set Btn = c
410
+
411
+ 'コマンドボタンの数字を変数に格納
412
+
413
+ Index = i
414
+
415
+ End Sub
416
+
417
+
418
+
419
+ Private Sub Btn_Click()
420
+
421
+ '数字のボタン(0~9)を押した時の処理
422
+
423
+
424
+
425
+ 'frmCalcフォームのTextBox1に、
426
+
427
+ '変数Indexの中身を表示する
428
+
429
+
430
+
431
+ If IsNew Then
432
+
433
+ '数字の新規入力時
434
+
435
+ frmCalc.TextBox1.Text = Index
436
+
437
+ Else
438
+
439
+ '数字の入力途中
440
+
441
+ frmCalc.TextBox1.Text = _
442
+
443
+ CLng(frmCalc.TextBox1.Text & Index)
444
+
445
+ End If
446
+
447
+
448
+
449
+ '数字の入力途中にする
450
+
451
+ IsNew = False
452
+
453
+ End Sub
454
+
455
+ ```