質問編集履歴
3
リンク先を修正しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[
|
1
|
+
[ExcelVBAで電卓を作ろう-その3 「コードを書こう」 - パソコンカレッジ スタッフのひとりごと](https://blog.goo.ne.jp/pc_college/e/7a8247554435af7d4d139cb65f54c752)
|
2
2
|
|
3
3
|
のサイトを拝見し、ExcelVBAを用いた電卓の作成を試みました。
|
4
4
|
コードは上記サイトの手順通りに作成(というか全て引用なのですが…)しまして、なんとかExcel上で形にはなりました。[作った電卓のファイルはこちら](http://xfs.jp/aUZ2qI)にあります。
|
2
文章を要約してみました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -6,24 +6,12 @@
|
|
6
6
|
ただ、実際に動かしてみますと…下記のような不具合が起き、普通の電卓のような挙動になりません。
|
7
7
|
|
8
8
|
―――――――――――――――――
|
9
|
-
|
9
|
+
・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。
|
10
|
-
|
10
|
+
・「-」「5」「×」「-」「5」「=」と入力すると、2つ目の「-」の時点で「25」という値になり、最後の「=」で、20という値が出てきてしまいます。(正しくは「=」を押した後に「25」ですが)
|
11
|
-
**
|
12
11
|
―――――――――――――――――
|
13
12
|
|
14
13
|
VBAのどこをどう修正すれば、これらの問題を解決できるのかにつきまして、試行錯誤しても判らず…「Case Act.Minus」「Private Sub Minus_Click()」の辺りを直せばいけそうな気もするのですが…。
|
15
14
|
|
16
|
-
~~―――――――――――――――
|
17
|
-
ユーザーフォーム
|
18
|
-
https://gist.github.com/AuroraNorthernQuarter/08fe8104867470fc827076bb9116b60e
|
19
|
-
標準モジュール
|
20
|
-
https://gist.github.com/AuroraNorthernQuarter/a5bb57afe5217ab5b92e40062ef590b5
|
21
|
-
クラスモジュール
|
22
|
-
https://gist.github.com/AuroraNorthernQuarter/9b955f1701924e3f80f1e7053bba8e98
|
23
|
-
―――――――――――――――
|
24
|
-
|
25
|
-
にそれぞれコードを記述しました(著作権に抵触するかもしれませんので、疑問が解決しましたらリンク先のコードは削除します)。~~
|
26
|
-
|
27
15
|
お力添えをいただけますと助かります。よろしくお願い致します。
|
28
16
|
|
29
17
|
※コードをリンク先ではなく、ここに貼り付けます。
|
1
リンク先を貼り直しました。コードを質問上に記載しました。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
ExcelVBAで電卓を作ろうとしたのですが
|
1
|
+
ExcelVBAで電卓を作ろうとしたのですが減算の値の処理がうまくいきません
|
body
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
第21講 電卓の高度化その1 第6話 メモリーボタンコーティング例
|
2
|
-
http://suugaku.biz/vbakougi/dai3bu/dai21koudai6wa.html
|
1
|
+
[第21講 電卓の高度化その1 第6話 メモリーボタンコーティング例](http://suugaku.biz/vbakougi/dai3bu/dai21koudai6wa.html)
|
3
2
|
|
4
3
|
のサイトを拝見し、ExcelVBAを用いた電卓の作成を試みました。
|
5
|
-
コードは上記サイトの手順通りに作成(というか全て引用なのですが…)しまして、なんとかExcel上で形にはなりました。作った電卓のファイルはこちら
|
4
|
+
コードは上記サイトの手順通りに作成(というか全て引用なのですが…)しまして、なんとかExcel上で形にはなりました。[作った電卓のファイルはこちら](http://xfs.jp/aUZ2qI)にあります。
|
6
5
|
|
7
6
|
ただ、実際に動かしてみますと…下記のような不具合が起き、普通の電卓のような挙動になりません。
|
8
7
|
|
9
8
|
―――――――――――――――――
|
10
|
-
・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。
|
9
|
+
**・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。**
|
11
|
-
・「-」「5」「×」「-」「5」「=」と入力すると、2つ目の「-」の時点で「25」という値になり、最後の「=」で、20という値が出てきてしまいます。(正しくは「=」を押した後に「25」ですが)
|
10
|
+
**・「-」「5」「×」「-」「5」「=」と入力すると、2つ目の「-」の時点で「25」という値になり、最後の「=」で、20という値が出てきてしまいます。(正しくは「=」を押した後に「25」ですが)
|
11
|
+
**
|
12
12
|
―――――――――――――――――
|
13
13
|
|
14
14
|
VBAのどこをどう修正すれば、これらの問題を解決できるのかにつきまして、試行錯誤しても判らず…「Case Act.Minus」「Private Sub Minus_Click()」の辺りを直せばいけそうな気もするのですが…。
|
15
15
|
|
16
|
-
―――――――――――――――
|
16
|
+
~~―――――――――――――――
|
17
17
|
ユーザーフォーム
|
18
18
|
https://gist.github.com/AuroraNorthernQuarter/08fe8104867470fc827076bb9116b60e
|
19
19
|
標準モジュール
|
@@ -22,6 +22,207 @@
|
|
22
22
|
https://gist.github.com/AuroraNorthernQuarter/9b955f1701924e3f80f1e7053bba8e98
|
23
23
|
―――――――――――――――
|
24
24
|
|
25
|
-
にそれぞれコードを記述しました(著作権に抵触するかもしれませんので、疑問が解決しましたらリンク先のコードは削除します)。
|
25
|
+
にそれぞれコードを記述しました(著作権に抵触するかもしれませんので、疑問が解決しましたらリンク先のコードは削除します)。~~
|
26
26
|
|
27
|
-
お力添えをいただけますと助かります。よろしくお願い致します。
|
27
|
+
お力添えをいただけますと助かります。よろしくお願い致します。
|
28
|
+
|
29
|
+
※コードをリンク先ではなく、ここに貼り付けます。
|
30
|
+
### ユーザーフォーム
|
31
|
+
```VBAです
|
32
|
+
Option Explicit
|
33
|
+
|
34
|
+
Private NumBtn(0 To 9) As New Class1
|
35
|
+
Private stack(0 To 1) As Currency
|
36
|
+
Private Action As Integer
|
37
|
+
|
38
|
+
Private Enum Act
|
39
|
+
Equal
|
40
|
+
Plus
|
41
|
+
Minus
|
42
|
+
Multi
|
43
|
+
Devi
|
44
|
+
End Enum
|
45
|
+
|
46
|
+
Private Sub UserForm_Initialize()
|
47
|
+
|
48
|
+
'インスタンスの生成
|
49
|
+
Dim i As Integer
|
50
|
+
For i = 0 To 9
|
51
|
+
NumBtn(i).NewClass Controls("b" & i), i
|
52
|
+
Next
|
53
|
+
|
54
|
+
'表示設定
|
55
|
+
TextBox1.Text = 0
|
56
|
+
|
57
|
+
'初期化処理
|
58
|
+
InitCalc
|
59
|
+
|
60
|
+
End Sub
|
61
|
+
|
62
|
+
|
63
|
+
Private Sub InitCalc()
|
64
|
+
'初期化処理
|
65
|
+
|
66
|
+
'スタックと記号の初期化
|
67
|
+
stack(0) = 0
|
68
|
+
stack(1) = 0
|
69
|
+
Action = Act.Plus
|
70
|
+
|
71
|
+
'表示クリアフラグの初期化
|
72
|
+
IsNew = True
|
73
|
+
|
74
|
+
End Sub
|
75
|
+
|
76
|
+
Private Sub Calc(ByVal CurrentAction As Integer)
|
77
|
+
'計算処理(記号ボタンが押されると呼び出される)
|
78
|
+
|
79
|
+
'電卓窓の数字を変数に格納
|
80
|
+
Dim n As Long
|
81
|
+
n = CLng(TextBox1.Text)
|
82
|
+
stack(1) = n
|
83
|
+
|
84
|
+
'計算結果を格納する変数
|
85
|
+
Dim Ans As Double
|
86
|
+
|
87
|
+
Select Case Action
|
88
|
+
Case Act.Equal
|
89
|
+
'=
|
90
|
+
Action = Act.Equal
|
91
|
+
Case Act.Plus
|
92
|
+
'+
|
93
|
+
Ans = stack(0) + stack(1)
|
94
|
+
stack(0) = Ans
|
95
|
+
stack(1) = 0
|
96
|
+
TextBox1.Text = Ans
|
97
|
+
Case Act.Minus
|
98
|
+
'-
|
99
|
+
Ans = stack(0) - stack(1)
|
100
|
+
stack(0) = Ans
|
101
|
+
stack(1) = 0
|
102
|
+
TextBox1.Text = Ans
|
103
|
+
Case Act.Multi
|
104
|
+
'*
|
105
|
+
Ans = stack(0) * stack(1)
|
106
|
+
stack(0) = Ans
|
107
|
+
stack(1) = 0
|
108
|
+
TextBox1.Text = Ans
|
109
|
+
Case Act.Devi
|
110
|
+
'/
|
111
|
+
If stack(1) = 0 Then
|
112
|
+
Ans = 0
|
113
|
+
Else
|
114
|
+
Ans = stack(0) / stack(1)
|
115
|
+
End If
|
116
|
+
stack(0) = Ans
|
117
|
+
stack(1) = 0
|
118
|
+
TextBox1.Text = Ans
|
119
|
+
End Select
|
120
|
+
|
121
|
+
'引数で受け取った記号を格納
|
122
|
+
Action = CurrentAction
|
123
|
+
'新規入力にする
|
124
|
+
IsNew = True
|
125
|
+
|
126
|
+
End Sub
|
127
|
+
|
128
|
+
Private Sub Plus_Click()
|
129
|
+
'足し算
|
130
|
+
|
131
|
+
'サブプロシージャの呼び出し
|
132
|
+
Calc Act.Plus
|
133
|
+
|
134
|
+
End Sub
|
135
|
+
|
136
|
+
|
137
|
+
Private Sub Minus_Click()
|
138
|
+
'引き算
|
139
|
+
|
140
|
+
'サブプロシージャの呼び出し
|
141
|
+
Calc Act.Minus
|
142
|
+
|
143
|
+
End Sub
|
144
|
+
|
145
|
+
|
146
|
+
Private Sub Multi_Click()
|
147
|
+
'掛け算
|
148
|
+
|
149
|
+
'サブプロシージャの呼び出し
|
150
|
+
Calc Act.Multi
|
151
|
+
|
152
|
+
End Sub
|
153
|
+
|
154
|
+
Private Sub Devi_Click()
|
155
|
+
'割り算
|
156
|
+
|
157
|
+
'サブプロシージャの呼び出し
|
158
|
+
Calc Act.Devi
|
159
|
+
|
160
|
+
End Sub
|
161
|
+
|
162
|
+
Private Sub btnEnter_Click()
|
163
|
+
'=の処理
|
164
|
+
|
165
|
+
'サブプロシージャの呼び出し
|
166
|
+
Calc Act.Equal
|
167
|
+
|
168
|
+
End Sub
|
169
|
+
Private Sub btnAC_Click()
|
170
|
+
'ACボタンの処理
|
171
|
+
|
172
|
+
TextBox1.Text = 0
|
173
|
+
|
174
|
+
'初期化処理
|
175
|
+
InitCalc
|
176
|
+
|
177
|
+
End Sub
|
178
|
+
|
179
|
+
```
|
180
|
+
|
181
|
+
### 標準モジュール
|
182
|
+
```VBAです
|
183
|
+
Option Explicit
|
184
|
+
|
185
|
+
Public IsNew As Boolean
|
186
|
+
|
187
|
+
Public Sub ShowCalc()
|
188
|
+
frmCalc.Show
|
189
|
+
End Sub
|
190
|
+
```
|
191
|
+
### クラスモジュール
|
192
|
+
```VBAです
|
193
|
+
Option Explicit
|
194
|
+
|
195
|
+
'イベントを持つコマンドボタン型の変数を宣言
|
196
|
+
Private WithEvents Btn As MSForms.CommandButton
|
197
|
+
'ボタンの数字を格納する変数を宣言
|
198
|
+
Private Index As Integer
|
199
|
+
|
200
|
+
Public Sub NewClass(ByVal c As MSForms.CommandButton, _
|
201
|
+
ByVal i As Integer)
|
202
|
+
'いわゆるコンストラクタ処理
|
203
|
+
|
204
|
+
'引数のコマンドボタンを変数に格納
|
205
|
+
Set Btn = c
|
206
|
+
'コマンドボタンの数字を変数に格納
|
207
|
+
Index = i
|
208
|
+
End Sub
|
209
|
+
|
210
|
+
Private Sub Btn_Click()
|
211
|
+
'数字のボタン(0~9)を押した時の処理
|
212
|
+
|
213
|
+
'frmCalcフォームのTextBox1に、
|
214
|
+
'変数Indexの中身を表示する
|
215
|
+
|
216
|
+
If IsNew Then
|
217
|
+
'数字の新規入力時
|
218
|
+
frmCalc.TextBox1.Text = Index
|
219
|
+
Else
|
220
|
+
'数字の入力途中
|
221
|
+
frmCalc.TextBox1.Text = _
|
222
|
+
CLng(frmCalc.TextBox1.Text & Index)
|
223
|
+
End If
|
224
|
+
|
225
|
+
'数字の入力途中にする
|
226
|
+
IsNew = False
|
227
|
+
End Sub
|
228
|
+
```
|