技術評論社の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には、必ずマイナス
が入ってしまう状態です。
上手く減算処理出来る方法のアドバイスよろしくお願いします。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- Visual Basic(VBA) テーブルを配列に入れて、元のテーブルの行番号を取得したい 1 2022/08/16 20:15
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
visual basic初心者です。 visual studioで電卓を作成しています。 実行時にテ
Visual Basic(VBA)
-
VB6で電卓を作っているのですが誰か教えてください
Visual Basic(VBA)
-
0での割り算
Visual Basic(VBA)
-
-
4
Vba 電卓 一文字消すボタン
Visual Basic(VBA)
-
5
VBで電卓の=
Visual Basic(VBA)
-
6
VBでの入力値制限について
Visual Basic(VBA)
-
7
電卓の作成 VB
Visual Basic(VBA)
-
8
0除算の例外処理ができない!!助けて!!
Visual Basic(VBA)
-
9
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
10
バックスペース機能の作り方
Visual Basic(VBA)
-
11
VB 電卓 メモリー機能
Visual Basic(VBA)
-
12
VB初心者。小数点以下の表示でつまづいています(2
Visual Basic(VBA)
-
13
VB初心者。小数点以下の表示でつまづいています(涙
Visual Basic(VBA)
-
14
VBで電卓のメモリー機能はどのように作るのですか。
Visual Basic(VBA)
-
15
VBで作成したフォーム上に電卓アプリの計算結果を反映させたい
その他(プログラミング・Web制作)
-
16
VB 電卓 数字キーを押して ラベルに出力
Visual Basic(VBA)
-
17
マイナス記号を▲で表す方法
Visual Basic(VBA)
-
18
Excel VBA TEXTBOXの字数制限
Excel(エクセル)
-
19
値を返さないコード パス
Visual Basic(VBA)
-
20
VBA テキストボックスの計算
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
プログラム上のCPU稼働率低減に...
-
SQLの速度をあげるには・・・
-
Excel VBAにて、2GB超の点群デ...
-
If Not c Is Nothing Then ~延...
-
Excel VBA データ削除の高速化
-
win10で、正確な待ち時間の作り方
-
小数点を含む数値かどうか判断...
-
Timerを使用しての強制待機
-
実行時のCPU使用率を増やしたい
-
逆ポーランド記法における単項...
-
絶対パスの取得について
-
ナップザック問題?をエクセル...
-
C言語 再帰処理のメリットとデ...
-
WebBrowserの読み込み待ちの処...
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
Windows10でDOSゲーム
-
explorer.exeが異様にメモリを食う
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
win10で、正確な待ち時間の作り方
-
小数点を含む数値かどうか判断...
-
SQLの速度をあげるには・・・
-
絶対パスの取得について
-
Excel VBAにて、2GB超の点群デ...
-
VBでの簡易電卓の作成(減算方...
-
C言語:関数を使うメリットとデ...
-
テキストファイルの空行をスキ...
-
プログラム上のCPU稼働率低減に...
-
Excel(VBA)でSetTimer関数を使...
-
ナップザック問題?をエクセル...
-
If Not c Is Nothing Then ~延...
-
プログラム 擬似コードとはどん...
-
基本情報技術者試験詳しい方へ...
-
ノットイコールを教えて下さい
-
符号付きにすべきか、符号なし...
-
C言語 時刻差分の算出方法
-
実行時のCPU使用率を増やしたい
おすすめ情報