質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2415閲覧

VBAでの電卓での計算について/演算キーを押すたびに加算される、割り算引き算で0になる

milk1218

総合スコア20

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2021/09/09 05:41

編集2021/09/10 06:21

VBAでの電卓作成です。昨日に引き続き問題個所が新たに出てきて、これ以上自分ではどこをどう修正すれば
良いのか解らないので、質問させていただきます。

発生している問題・エラーメッセージ

以下のような現象が出てしまいます(発見出来てないだけで他にもあるかもしれませんが・・)

(1)a-b = c 若しくは a/b = c の後に「+」、「×」「-」、「÷」を押すと0或いは1になる 
(2)axb = c 若しくはa+b = c の後に「+」、「×」、「-」、「÷」を押すと cが足されて
クリックするごとに加算されていく

例えば(2)の場合、1+1=2の後に 2×2とやったら4になるようにしたいですが
現状だと「×」を押しただけでそのまま2が加算されて4になります。

該当のソースコード

Option Explicit Dim ans As Double '答えを保持 Dim num As Double Dim ent As Integer '分岐する変数 1は+、2は-、3は*、4は/ Dim enzan As Boolean 'ture;+-*/ falseそれ以外 条件を指定した結果を保 Private Sub CommandButton1_Click() If enzan = False Then If TextBox1.Text = "0" Then TextBox1.Text = "1" Else TextBox1.Text = TextBox1.Text & "1" End If Else TextBox1.Text = "1" enzan = False End If End Sub ※2~9ボタンも上記と同様です。 Private Sub CommandButton12_Click() '- 引き算 enzan = True num = Val(TextBox1.Text) Select Case ent Case 0 ans = num Case 1 ans = ans + num Case 2 ans = ans - num Case 3 ans = ans * num Case 4 ans = ans / num End Select TextBox1.Text = ans ent = 2 End Sub Private Sub CommandButton13_Click() '* 掛け算 enzan = True num = Val(TextBox1.Text) Select Case ent Case 0 ans = num Case 1 ans = ans + num Case 2 ans = ans - num Case 3 ans = ans * num Case 4 ans = ans / num End Select TextBox1.Text = ans ent = 3 End Sub Private Sub CommandButton14_Click() '/  割り算 enzan = True num = Val(TextBox1.Text) Select Case ent Case 0 ans = num Case 1 ans = ans + num Case 2 ans = ans - num Case 3 ans = ans * num Case 4 ans = ans / num End Select TextBox1.Text = ans ent = 4 End Sub Private Sub CommandButton11_Click() '⁺  足し算 enzan = True num = Val(TextBox1.Text) Select Case ent Case 0 ans = num Case 1 ans = ans + num Case 2 ans = ans - num Case 3 ans = ans * num Case 4 ans = ans / num End Select TextBox1.Text = ans ent = 1 End Sub Private Sub CommandButton15_Click() 'イコールボタン ここで条件分岐 enzan = True num = Val(TextBox1.Text) If ent = 1 Then ans = num + ans TextBox1.Text = CStr(ans) End If If ent = 2 Then ans = ans - num TextBox1.Text = CStr(ans) End If If ent = 3 Then ans = ans * num TextBox1.Text = CStr(ans) End If If ent = 4 Then ans = ans / num TextBox1.Text = CStr(ans) End If Range("A1").Value = Str(ans) End Sub Private Sub CommandButton18_Click() 'クリアボタン ent = 0 num = 0 TextBox1.Text = CStr(ans) End Sub Private Sub CommandButton10_Click() '0ボタン If enzan = False Then If TextBox1.Text = "0" Then TextBox1.Text = "" Else TextBox1.Text = TextBox1.Text & "0" End If Else TextBox1.Text = "0" enzan = False End If End Sub Private Sub CommandButton16_Click() 'オールクリア TextBox1.Text = "0" ent = 0 num = 0 ans = 0 End Sub Private Sub CommandButton17_Click() '00ボタン If enzan = False Then If TextBox1.Text = "0" Then TextBox1.Text = "" Else TextBox1.Text = TextBox1.Text & "00" End If Else TextBox1.Text = "00" enzan = False End If End Sub Private Sub CommandButton19_Click() '小数点 TextBox1.Text = TextBox1.Text & "." End Sub Private Sub UserForm_Click() End Sub

試したこと

=の部分のところで、一度 ans = 0 num = 0と付け加えましたが
改善されませんでした。

解決策・修正箇所などが解れば教えていただけると幸いです。

補足情報(FW/ツールのバージョンなど)

【補足】
・テキストボックスには同じ数字を羅列させるために一旦文字列として表しています。
ex「1111」など

・足し算は「1」、引き算は「2」、掛け算は「3」、割り算は「4」
で条件分岐するようにしています。

・オールクリアボタンを押すとテキストボックスには「0」が入るため
次に数字を押した時に「01」とか「023」などにならないようにDim enzan As Boolean で
0を上書きするようにしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

milk1218

2021/09/10 06:59

対応致しました。ありがとうございます。
guest

回答2

0

ベストアンサー

milk1218さんのソースコードは無視して
私なりのコードというか、画像で紹介します
簡単な計算で 5x2=10で説明しています

イメージ説明
イメージ説明
イメージ説明
イメージ説明
演算子記号をクリックされるとTextBox2へ演算子記号を表示させています
と 同時に入力されたTextBox1の「5」は 変数「合数1」に代入
次に掛ける数字「2」を入力
次に「=」をクリックされたら、TextBox2に表示されている記号を
If関数で計算式を検索しています

投稿2021/09/11 12:03

syousuke.33

総合スコア312

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

milk1218

2021/09/13 15:13

ご丁寧にありがとうございます・・・!! 初めて見る書き方だったのでとても参考になりました!!
guest

0

=を押した後に、entはどうなればいいのかを考える必要がある気がします。
=を押した後に押すのが+などの場合、entは0になっていてほしい。
でも、=を押した後に押すのが再び=の時は、entは0ではなくその直前の演算子であってほしい。
そこを区別するための何かが必要ではないでしょうか。


試しに作ってみた。まだおかしなところはあるかも。

vba

1Option Explicit 2 3Dim a, x, b 4Dim enzan As Boolean 5Dim equal As Boolean 6 7Private Sub CommandButton1_Click() 8 NumberKey "1" 9End Sub 10Private Sub CommandButton2_Click() 11 NumberKey "2" 12End Sub 13Private Sub CommandButton3_Click() 14 NumberKey "3" 15End Sub 16Private Sub CommandButton4_Click() 17 NumberKey "4" 18End Sub 19Private Sub CommandButton5_Click() 20 NumberKey "5" 21End Sub 22Private Sub CommandButton6_Click() 23 NumberKey "6" 24End Sub 25Private Sub CommandButton7_Click() 26 NumberKey "7" 27End Sub 28Private Sub CommandButton8_Click() 29 NumberKey "8" 30End Sub 31Private Sub CommandButton9_Click() 32 NumberKey "9" 33End Sub 34Private Sub CommandButton10_Click() 35 NumberKey "0" 36End Sub 37Private Sub CommandButton17_Click() '00ボタン 38 NumberKey "00" 39End Sub 40Private Sub CommandButton19_Click() '小数点 41 TextBox1.Text = TextBox1.Text & "." 42End Sub 43Sub NumberKey(key As String) 44 TextBox1.Text = IIf(enzan, key, Str(TextBox1.Text & key)) 45 enzan = False 46 b = TextBox1.Text 47End Sub 48 49 50Private Sub CommandButton11_Click() '+  足し算 51 enzan = True 52 If a = "" Or equal Then 53 a = TextBox1.Text 54 equal = False 55 Else 56 calc 57 End If 58 x = "+" 59End Sub 60Private Sub CommandButton12_Click() '- 引き算 61 enzan = True 62 If a = "" Or equal Then 63 a = TextBox1.Text 64 equal = False 65 Else 66 calc 67 End If 68 x = "-" 69End Sub 70 71Private Sub CommandButton13_Click() '* 掛け算 72 enzan = True 73 If a = "" Or equal Then 74 a = TextBox1.Text 75 equal = False 76 Else 77 calc 78 End If 79 x = "*" 80End Sub 81Private Sub CommandButton14_Click() '/  割り算 82 enzan = True 83 If a = "" Or equal Then 84 a = TextBox1.Text 85 equal = False 86 Else 87 calc 88 End If 89 x = "/" 90End Sub 91 92Function calc() 93 Select Case x 94 Case "+": a = CDbl(a) + CDbl(b) 95 Case "-": a = CDbl(a) - CDbl(b) 96 Case "*": a = CDbl(a) * CDbl(b) 97 Case "/": a = CDbl(a) / CDbl(b) 98 End Select 99 TextBox1.Text = a 100End Function 101 102Private Sub CommandButton15_Click() 'イコールボタン ここで条件分岐 103 enzan = True 104 equal = True 105 calc 106End Sub 107 108Private Sub CommandButton18_Click() 'クリアボタン 109 TextBox1.Text = "" 110End Sub 111Private Sub CommandButton16_Click() 'オールクリア 112 a = "" 113 x = "" 114 TextBox1.Text = "0" 115End Sub 116

投稿2021/09/10 09:43

編集2021/09/11 16:02
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

milk1218

2021/09/13 15:14

”=を押した後に押すのが+などの場合、entは0になっていてほしい。 でも、=を押した後に押すのが再び=の時は、entは0ではなくその直前の演算子であってほしい” ・・・まさにこれなんです・・!!ありがとうございます!! 参考にさせていただきます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問