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

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

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

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

Q&A

2回答

4148閲覧

ExcelVBAで電卓を作ろうとしたのですが減算の値の処理がうまくいきません

ControlSource

総合スコア4

VBA

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

0グッド

1クリップ

投稿2019/09/06 16:34

編集2019/09/07 06:08

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

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

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

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

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

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

hatena19

2019/09/06 20:32

URLは、ツールバーの[リンクの挿入]で、リンクにしてください。 コードは、gist へのリンクではなくツールバーの[<code>]で挿入してください。 質問の書き方は下記を参考にしてください。 https://teratail.com/help/question-tips#questionTips3-7
hatena19

2019/09/06 20:53

最初のリンク先のコードと、gist のコードはまったく別物です。 gist のコードの方の参考にしたリンク先を提示してください。
ControlSource

2019/09/07 02:12

すみません初めての質問で、ルールを十分把握しておりませんでした。読みみにくく申し訳ないです。 修正してみました。他に不十分な点がありましたら、お手数ですがご指摘のほど、よろしくお願い致します。
ControlSource

2019/09/07 06:06

そうでした、失礼しました!
guest

回答2

0

引き算の-と符号としてのマイナスは、別のボタンに役割を分けないとだめじゃないですかね?
シャープ電卓
カシオ電卓
符号反転(+/-)キーの追加

投稿2019/09/07 01:03

mattuwan

総合スコア2136

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

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

Zuishin

2019/09/07 01:07

「+-」ボタンは正負反転のためのボタンで、普通の電卓ではマイナスボタンでもマイナス入力できるんじゃないかと思います。
ControlSource

2019/09/07 02:15

ご回答ありがとうございます。そうですね。符号反転ボタンというのは馴染みがないので…できるだけ、普通の電卓に近付けたいと考えております。
mattuwan

2019/09/07 03:21

普通の電卓で、 「-」「5」「×」「-」「5」と押すと、-10になりました。 単に0-5 → -5 -5-5 → -10 と計算されて×の操作はやり直しとして無効になるようです。 やはりマイナスの計算があるときはサインチェンジキーでマイナスの符号をつけるのが、 普通の電卓の使い方のようです。 http://www.sguc.ac.jp/i/st/learning/statistics/calculator/index1.pdf
mattuwan

2019/09/07 03:25

まぁ、自作するんだから、自分で仕様を決めちゃってもいいのでしょうが、 引き算の記号は表示しない仕様なら、マイナスの表示をしたいときは別途ボタンを用意しないと、 おかしなことになるような気がします。
guest

0

指摘したいことがいっぱいあるが、とりあえずは、下記の点を修正することから、始めてください。

Calcプロシージャ内で、下記のように変数を宣言してますが、

vba

1 '電卓窓の数字を変数に格納 2 Dim n As Long 3 4 5 '計算結果を格納する変数 6 Dim Ans As Double 7

「-」は数値ではないので、数値がだの変数には格納できません。
また、Long では小数も格納できません。

「-」「.」を電卓窓に表示させたいのなら、String型にする必要があります。

演算するとき(「=」をクリックしたとき)に、Val関数で数値に変換して演算するか、
あるいは Application.Evaluate を使えば String型 のまま演算できます。

投稿2019/09/06 20:53

hatena19

総合スコア33715

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

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

ControlSource

2019/09/07 02:30

hatena19さんありがとうございます、そうだったんですね。 修正してみます。「=」を押した後ですね。 電卓窓で「-」「5」「×」「-」と押すと、イコールを押す前に「25」と出てきます。 この段階では「-」(2つ目の値の符号)だけ、電卓に表示されるべきだと思うのですが。 「=」を押す前に、なぜ「25」が出てくるのかというのも判らなく、どう修正すれば正しく動いてくれるのか悩んでおります。
hatena19

2019/09/07 03:11

回答する前に下記に点について確認させてください。 この電卓プログラムは、プログラミングの勉強の為ですか。 それとも、実用性を目指して作成していますか(運用中に、実際に使うことがある。) 実用性を目指すなら、無理に実際の電卓に近づける必要性はないように思います。 電卓のように狭い画面に縛られることはないので。 例えば、電卓窓には、 「-5*-5」というように入力した通りに表示させて、「=」のクリックで、 TextBox1.Text = Application.Evaluate("-5*-5") とすれば 25 と表示されます。 こちらの方がコードがシンプルだし、途中式を表示されるので入力間違いを確認しやすくて実用的だと思いますが。
ControlSource

2019/09/07 06:11

実用性ではなく、プログラミングの勉強の為になります。 本物の電卓のように、小数点の計算や関数電卓のようなことはでもなくていいので、四則演算ぐらいができるものが作れたらと考えております。
hatena19

2019/09/07 06:24

四則演算に関しては、自作しなくても上記の Application.Evaluate を使えば簡単にできます。 勉強のために四則演算も自作するというのなら、回答にも書いたように、String型変数に入力値を格納するようにしないと、「-」とか「.」を電卓窓に表示できません。まずは、電卓窓に マイナスや小数を表示できるところまでトライしてみてください。演算はそれからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問