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

質問編集履歴

3

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

2019/09/07 06:08

投稿

ControlSource
ControlSource

スコア4

title CHANGED
File without changes
body 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
  のサイトを拝見し、ExcelVBAを用いた電卓の作成を試みました。
4
4
  コードは上記サイトの手順通りに作成(というか全て引用なのですが…)しまして、なんとかExcel上で形にはなりました。[作った電卓のファイルはこちら](http://xfs.jp/aUZ2qI)にあります。

2

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

2019/09/07 06:08

投稿

ControlSource
ControlSource

スコア4

title CHANGED
File without changes
body CHANGED
@@ -6,24 +6,12 @@
6
6
  ただ、実際に動かしてみますと…下記のような不具合が起き、普通の電卓のような挙動になりません。
7
7
 
8
8
  ―――――――――――――――――
9
- **・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。**
9
+ ・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。
10
- **・「-」「5」「×」「-」「5」「=」と入力すると、2つ目の「-」の時点で「25」という値になり、最後の「=」で、20という値が出てきてしまいます。(正しくは「=」を押した後に「25」ですが)
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

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

2019/09/07 02:12

投稿

ControlSource
ControlSource

スコア4

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上で形にはなりました。作った電卓のファイルはこちら http://xfs.jp/aUZ2qI にあります。
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
+ ```