![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
技術評論社のVisual Basic5.0入門編という、
参考書を見ながら、作成したのですが。
どうも、参考書のコードが間違っているみたいでした
良かったら、お知恵をお貸しください。
とりあえず、足し算と引き算処理の作成です。
※使用コントロール
0から9までのコマンドボタンをコントロール配列と、
足し算、引き算、クリアーのコマンドボタンが3つ、
後、数字入力用のテキストボックスが1つです。
コード
****************************************************
Option Explicit
Dim EnterFlag As Boolean 'プラス、マイナスキーが押された直後ならTrueを示すフラグ。
Dim S As Long
Private Sub Command3_Click() 'クリアーボタン
Text1.Text = ""
S = 0
End Sub
Private Sub Plas_Click() '加算処理
S = S + Val(Text1.Text)
Text1.Text = S
EnterFlag = True
End Sub
Private Sub Mainas_Click() '減算処理
S = S - Val(Text1.Text)
Text1.Text = S
EnterFlag = True
End Sub
Private Sub Form_Load()
Text1.Text = ""
S = 0
End Sub
Private Sub key_Click(Index As Integer)
If EnterFlag Then
Text1.Text = ""
EnterFlag = False
End If
If Len(Text1.Text) < 10 Then '10桁以内のとき
Text1.Text = Text1.Text & Index
End If
End Sub
*********************************************************
とこんな感じです。
加算処理は、上手くできますが。
減算処理は、明らかにコードが間違っていると思いました。
初めて(1回目)マイナスボタンを押した時に、変数Sには、必ずマイナス
が入ってしまう状態です。
上手く減算処理出来る方法のアドバイスよろしくお願いします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
No.3ベストアンサー
- 回答日時:
これは、業務用でよく使われる電卓と同じ仕様ですね。
初めてマイナスを押したときに結果がマイナスになるのは正しい動作です。
どういう理由だったか忘れましたが、この方が効率が良い場合があるので
先に数値、その次に演算という入力順序になっているそうです。
それはさておき、普通の電卓と同じ処理をしたいのであれば、
一つ前に押された演算キーを記憶しておいて、新しい演算キーが押されたときに
一つ前の演算を処理する、というような流れになるのではないかと思います。
そうすると、Plas_Click、Mainas_Clickも変更が必要で、演算自体は
一つ前の演算処理、演算子を新しく自分のものに更新する。
Private Sub Plas_Click() '加算処理
select case <演算子>
case 1
S = S + Val(Text1.Text)
Text1.Text = S
case 2
S = S - Val(Text1.Text)
Text1.Text = S
end select
EnterFlag = True
<演算子>=1
End Sub
といった感じでしょうか?
とりあえず、ぱっと思いついただけなので他にも良い方法があるかもしれません。
がんばってください。
アドバイスありがとうございます。
「一つ前に押された演算キーを記憶しておく。」と言うお言葉、
大変参考になりました。
本当にありがとうございました。
一様、自分なりにコードを変更してみました。
まだ、プラスとマイナス機能だけですが。(バグもあるかも。(^_^;))
**************************************************************
Option Explicit
Dim EnterFlag As Boolean 'プラス、マイナスボタンが押された時にテキストを空白にする。
Dim Ans As Long '計算結果の退避変数
Dim Enzan As Integer '演算処理変数
Private Sub Keisan()
Select Case Enzan
Case 1 '加算処理と、始めてマイナスボタンが押された時
Ans = Ans + Val(Text1.Text)
Text1.Text = Ans
EnterFlag = True
Case 2 '減算処理
Ans = Ans - Val(Text1.Text)
Text1.Text = Ans
EnterFlag = True
End Select
End Sub
Private Sub Clear_Click()
Text1.Text = ""
Ans = 0
Enzan = 1
End Sub
Private Sub Plas_Click()
Call Keisan 'プラスボタンが押された時、前回の計算結果を算出するプロシージャへ
Enzan = 1
End Sub
Private Sub Mainas_Click()
Call Keisan '演算フラグを変更する前に、計算結果算出プロシージャへ。ポイント(自分なりの)
Enzan = 2
End Sub
Private Sub Form_Load()
Text1.Text = ""
Ans = 0
Enzan = 1 '初めてマイナスボタンが押された時、加算処理を実行するための初期設定
End Sub
Private Sub key_Click(Index As Integer)
If EnterFlag Then
Text1.Text = ""
EnterFlag = False
End If
If Len(Text1.Text) < 10 Then
Text1.Text = Text1.Text & Index
End If
End Sub
****************************************************************
もし、時間等がありましたら、バグあったら教えてくれると嬉しいです。
本当に、ありがとうございました。m(__)m
No.2
- 回答日時:
モードを表す変数を導入する。
最後に押した機能キーによってモードを変える。起動直後は、「+」を押した場合と同じにする。ボタンを押した場合の動作:
モードにしたがって計算し、その結果をSに記憶する。
入力欄をクリアする。
モードを今押したボタンに合わせて変更する。
こんなアルゴリズムにすれば普通の計算機のようになるでしょう。
入力欄が空の時のボタンの動作が不定ですが、空の時は0と見なせばとりあえず大丈夫です。
wolvさん、アドバイスありがとうございました。m(__)m
初めてマイナスボタンが押された時に、
起動直後に「+」ボタンを押した場合と、同じ処理をしてあげることにより、
解消できました。
そうしないと、マイナス付いてしまいます。
演算ボタンを押した時のモード変数も導入してみました。
なんとか、上手く動いています。
本当に、ありがとうございました。m(__)m
おかげで、とても勉強になりました。
No.1
- 回答日時:
このプログラムは、こういう仕様のようです。
つまり、「+」「-」ボタンは、普通の計算機のとちがい、「を足す」「を引く」という動作をします。(普通の計算機での動作は、「この後入力するデータを足す」「この後…を引く」ですね。)
普通の計算機のようにするなら、アルゴリズムを大幅に変更する必要があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
visual basic初心者です。 visual studioで電卓を作成しています。 実行時にテ
Visual Basic(VBA)
-
Vba 電卓 一文字消すボタン
Visual Basic(VBA)
-
VB6で電卓を作っているのですが誰か教えてください
Visual Basic(VBA)
-
-
4
VB初心者。小数点以下の表示でつまづいています(涙
Visual Basic(VBA)
-
5
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
6
VBで電卓のメモリー機能はどのように作るのですか。
Visual Basic(VBA)
-
7
0での割り算
Visual Basic(VBA)
-
8
テキストボックスの中身をリセット(クリア)したい
Visual Basic(VBA)
-
9
VB2005のTextBoxでカンマ区切りの表示
Visual Basic(VBA)
-
10
VB.netでメソッドからコントロールを取得
Visual Basic(VBA)
-
11
テキストボックスに記述した数値を加算させたい
Visual Basic(VBA)
-
12
特定の文字を、入力文字数に含めない方法は(VB.NET)
Visual Basic(VBA)
-
13
電卓の小数点
その他(プログラミング・Web制作)
-
14
VB 電卓 メモリー機能
Visual Basic(VBA)
-
15
VB.NETでコンボボックスの1行目を空白にしたい
Visual Basic(VBA)
-
16
VBでの入力値制限について
Visual Basic(VBA)
-
17
電卓の作成 VB
Visual Basic(VBA)
-
18
return trueとreturn falseの用途・違いは・・・?
JavaScript
-
19
VB 電卓 数字キーを押して ラベルに出力
Visual Basic(VBA)
-
20
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
win10で、正確な待ち時間の作り方
-
.netからexcel操作の処理速度が...
-
Excelでのセル内容の高速消去方法
-
randについて
-
C言語で、文字とか入力されなく...
-
DoEvents関数って何?
-
C言語でのUTF-8の文字列の処理...
-
ExcelVBA処理経過をリアルタイ...
-
「単体テスト」に関する深刻な...
-
Excel VBA データ削除の高速化
-
テキストファイルの空行をスキ...
-
SQLの速度をあげるには・・・
-
Excel VBAにて、2GB超の点群デ...
-
DLLで初回呼び出しと最後の...
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
-
緯度、経度の 10進法と 60進法...
-
WriteFile()でのデータ送信がで...
-
家電製品の電力周波数を変える機械
-
malloc関数の使い終わった後の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
小数点を含む数値かどうか判断...
-
win10で、正確な待ち時間の作り方
-
絶対パスの取得について
-
SQLの速度をあげるには・・・
-
VBでの簡易電卓の作成(減算方...
-
基本情報技術者試験詳しい方へ...
-
C言語 時刻差分の算出方法
-
テキストファイルの空行をスキ...
-
ノットイコールを教えて下さい
-
ナップザック問題?をエクセル...
-
プログラム上のCPU稼働率低減に...
-
If Not c Is Nothing Then ~延...
-
エクセルVBA 時間抜けの取得
-
「単体テスト」に関する深刻な...
-
実行時のCPU使用率を増やしたい
-
ソートにかかった時間を測りたい。
-
C言語:関数を使うメリットとデ...
-
Excel VBA での処理時間計測結...
おすすめ情報