ExcelVBAで電卓を作ろう-その3 「コードを書こう」 - パソコンカレッジ スタッフのひとりごと
のサイトを拝見し、ExcelVBAを用いた電卓の作成を試みました。
コードは上記サイトの手順通りに作成(というか全て引用なのですが…)しまして、なんとかExcel上で形にはなりました。作った電卓のファイルはこちらにあります。
ただ、実際に動かしてみますと…下記のような不具合が起き、普通の電卓のような挙動になりません。
―――――――――――――――――
・「-」「5」と入力しているのに、結果の画面上には「5」のみしか表示されません。
・「-」「5」「×」「-」「5」「=」と入力すると、2つ目の「-」の時点で「25」という値になり、最後の「=」で、20という値が出てきてしまいます。(正しくは「=」を押した後に「25」ですが)
―――――――――――――――――
VBAのどこをどう修正すれば、これらの問題を解決できるのかにつきまして、試行錯誤しても判らず…「Case Act.Minus」「Private Sub Minus_Click()」の辺りを直せばいけそうな気もするのですが…。
お力添えをいただけますと助かります。よろしくお願い致します。
※コードをリンク先ではなく、ここに貼り付けます。
ユーザーフォーム
VBAです
1Option Explicit 2 3Private NumBtn(0 To 9) As New Class1 4Private stack(0 To 1) As Currency 5Private Action As Integer 6 7Private Enum Act 8 Equal 9 Plus 10 Minus 11 Multi 12 Devi 13End Enum 14 15Private Sub UserForm_Initialize() 16 17 'インスタンスの生成 18 Dim i As Integer 19 For i = 0 To 9 20 NumBtn(i).NewClass Controls("b" & i), i 21 Next 22 23 '表示設定 24 TextBox1.Text = 0 25 26 '初期化処理 27 InitCalc 28 29End Sub 30 31 32Private Sub InitCalc() 33 '初期化処理 34 35 'スタックと記号の初期化 36 stack(0) = 0 37 stack(1) = 0 38 Action = Act.Plus 39 40 '表示クリアフラグの初期化 41 IsNew = True 42 43End Sub 44 45Private Sub Calc(ByVal CurrentAction As Integer) 46 '計算処理(記号ボタンが押されると呼び出される) 47 48 '電卓窓の数字を変数に格納 49 Dim n As Long 50 n = CLng(TextBox1.Text) 51 stack(1) = n 52 53 '計算結果を格納する変数 54 Dim Ans As Double 55 56 Select Case Action 57 Case Act.Equal 58 '= 59 Action = Act.Equal 60 Case Act.Plus 61 '+ 62 Ans = stack(0) + stack(1) 63 stack(0) = Ans 64 stack(1) = 0 65 TextBox1.Text = Ans 66 Case Act.Minus 67 '- 68 Ans = stack(0) - stack(1) 69 stack(0) = Ans 70 stack(1) = 0 71 TextBox1.Text = Ans 72 Case Act.Multi 73 '* 74 Ans = stack(0) * stack(1) 75 stack(0) = Ans 76 stack(1) = 0 77 TextBox1.Text = Ans 78 Case Act.Devi 79 '/ 80 If stack(1) = 0 Then 81 Ans = 0 82 Else 83 Ans = stack(0) / stack(1) 84 End If 85 stack(0) = Ans 86 stack(1) = 0 87 TextBox1.Text = Ans 88 End Select 89 90 '引数で受け取った記号を格納 91 Action = CurrentAction 92 '新規入力にする 93 IsNew = True 94 95End Sub 96 97Private Sub Plus_Click() 98 '足し算 99 100 'サブプロシージャの呼び出し 101 Calc Act.Plus 102 103End Sub 104 105 106Private Sub Minus_Click() 107 '引き算 108 109 'サブプロシージャの呼び出し 110 Calc Act.Minus 111 112End Sub 113 114 115Private Sub Multi_Click() 116 '掛け算 117 118 'サブプロシージャの呼び出し 119 Calc Act.Multi 120 121End Sub 122 123Private Sub Devi_Click() 124 '割り算 125 126 'サブプロシージャの呼び出し 127 Calc Act.Devi 128 129End Sub 130 131Private Sub btnEnter_Click() 132 '=の処理 133 134 'サブプロシージャの呼び出し 135 Calc Act.Equal 136 137End Sub 138Private Sub btnAC_Click() 139 'ACボタンの処理 140 141 TextBox1.Text = 0 142 143 '初期化処理 144 InitCalc 145 146End Sub 147
標準モジュール
VBAです
1Option Explicit 2 3Public IsNew As Boolean 4 5Public Sub ShowCalc() 6 frmCalc.Show 7End Sub
クラスモジュール
VBAです
1Option Explicit 2 3'イベントを持つコマンドボタン型の変数を宣言 4Private WithEvents Btn As MSForms.CommandButton 5'ボタンの数字を格納する変数を宣言 6Private Index As Integer 7 8Public Sub NewClass(ByVal c As MSForms.CommandButton, _ 9 ByVal i As Integer) 10 'いわゆるコンストラクタ処理 11 12 '引数のコマンドボタンを変数に格納 13 Set Btn = c 14 'コマンドボタンの数字を変数に格納 15 Index = i 16End Sub 17 18Private Sub Btn_Click() 19 '数字のボタン(0~9)を押した時の処理 20 21 'frmCalcフォームのTextBox1に、 22 '変数Indexの中身を表示する 23 24 If IsNew Then 25 '数字の新規入力時 26 frmCalc.TextBox1.Text = Index 27 Else 28 '数字の入力途中 29 frmCalc.TextBox1.Text = _ 30 CLng(frmCalc.TextBox1.Text & Index) 31 End If 32 33 '数字の入力途中にする 34 IsNew = False 35End Sub
URLは、ツールバーの[リンクの挿入]で、リンクにしてください。
コードは、gist へのリンクではなくツールバーの[<code>]で挿入してください。
質問の書き方は下記を参考にしてください。
https://teratail.com/help/question-tips#questionTips3-7
最初のリンク先のコードと、gist のコードはまったく別物です。
gist のコードの方の参考にしたリンク先を提示してください。
すみません初めての質問で、ルールを十分把握しておりませんでした。読みみにくく申し訳ないです。
修正してみました。他に不十分な点がありましたら、お手数ですがご指摘のほど、よろしくお願い致します。
参考にしたページは下記ではないですか。
https://blog.goo.ne.jp/pc_college/e/7a8247554435af7d4d139cb65f54c752
質問の最初のリンク先を上記に変更しておいてください。
そうでした、失礼しました!