• ベストアンサー

VBでの簡易電卓の作成(減算方法)で困っています。

技術評論社の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には、必ずマイナス が入ってしまう状態です。 上手く減算処理出来る方法のアドバイスよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • layer13
  • ベストアンサー率47% (37/78)
回答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 といった感じでしょうか? とりあえず、ぱっと思いついただけなので他にも良い方法があるかもしれません。 がんばってください。

mineral01
質問者

お礼

アドバイスありがとうございます。 「一つ前に押された演算キーを記憶しておく。」と言うお言葉、 大変参考になりました。 本当にありがとうございました。 一様、自分なりにコードを変更してみました。 まだ、プラスとマイナス機能だけですが。(バグもあるかも。(^_^;)) ************************************************************** 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

その他の回答 (2)

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.2

モードを表す変数を導入する。最後に押した機能キーによってモードを変える。起動直後は、「+」を押した場合と同じにする。 ボタンを押した場合の動作:  モードにしたがって計算し、その結果をSに記憶する。  入力欄をクリアする。  モードを今押したボタンに合わせて変更する。 こんなアルゴリズムにすれば普通の計算機のようになるでしょう。 入力欄が空の時のボタンの動作が不定ですが、空の時は0と見なせばとりあえず大丈夫です。

mineral01
質問者

お礼

wolvさん、アドバイスありがとうございました。m(__)m 初めてマイナスボタンが押された時に、 起動直後に「+」ボタンを押した場合と、同じ処理をしてあげることにより、 解消できました。 そうしないと、マイナス付いてしまいます。 演算ボタンを押した時のモード変数も導入してみました。 なんとか、上手く動いています。 本当に、ありがとうございました。m(__)m おかげで、とても勉強になりました。

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

このプログラムは、こういう仕様のようです。つまり、「+」「-」ボタンは、普通の計算機のとちがい、「を足す」「を引く」という動作をします。 (普通の計算機での動作は、「この後入力するデータを足す」「この後…を引く」ですね。) 普通の計算機のようにするなら、アルゴリズムを大幅に変更する必要があります。

関連するQ&A

  • VB電卓作成について

    今、Visual Studio NETを用いて電卓を作ろうとしています。 いろいろ調べてやっているのですが、うまくいきません。 1+2はできるのですが、1+2+3が5になってしまいます。 どうすればいいのか、どなたか教えていただけませんか? 今のコードをキーの設定以外を記載しておきます。 お願いします。 ================================================ Private Sub 数字キー(ByVal n As Integer) If CL Then R1 = 0 CL = False End If R1 = R1 * 10 + n Textreg.Text = R1 End Sub Private Sub 演算キー(ByVal o As Integer) Op = o R2 = R1 CL = True End Sub Private Sub 計算() Select Case Op Case 1 R1 = R2 + R1 Case 2 R1 = R2 - R1 Case 3 R1 = R2 * R1 Case 4 R1 = R2 \ R1 End Select Textreg.Text = R1 End Sub Private Sub keyEQ_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles keyEQ.Click 計算() End Sub Private Sub keyCL_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles keyCL.Click Textreg.Text = "0" R1 = 0 R2 = 0 Op = 0 CL = True End Sub Private Sub Form電卓_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Textreg.Text = 0 R1 = 0 R2 = 0 Op = 0 CL = True End Sub End Class

  • VB初心者です

    計算結果が"7"の時に限り、「当たり!」と表示される、ちょっと意味不明な計算機を作っています。 現在、下記のように書いてますが、何故かうまくいきません。(当たりが表示されない 何故でしょうか?お助けください。。m(_ _)m Private Sub Command1_Click() Label1.Caption = Str(Val(Text1.Text) + Val(Text2.Text)) Label3.Caption = "+" Label4.Visible = False '画像を隠す。 'いずれかの数字が「7」のとき、メッセージを表示する。 If Label1.Caption = "7" Then Label4.Visible = True End If End Sub Private Sub Command2_Click() End End Sub Private Sub Command3_Click() Label1.Caption = Str(Val(Text1.Text) * Val(Text2.Text)) Label3.Caption = "*" End Sub Private Sub Command4_Click() Label1.Caption = Str(Val(Text1.Text) - Val(Text2.Text)) Label3.Caption = "-" End Sub Private Sub Command5_Click() Label1.Caption = Str(Val(Text1.Text) / Val(Text2.Text)) Label3.Caption = "/" End Sub

  • VB2013でのプログラム作成でつまづきました

    初めまして ご質問です 会社にて、職場改善のため VB2013でプログラムを作成していますが PCに詳しいのが自分しかいなく、指名されました。。。 もちろん自作PCとか作れるぐらいですが プログラムなんてやったことないし困っています 職場にプログラム専門の方がいるので教育を受けていますが 2.3回教えてもらって  「windowsの電卓を作ろう」と言われました 電卓作成は、初心者用の題材らしいですが とりあえず教えてもらった事を駆使し まずは、テキストボックスとテキストボックスに数字を入れ その二つを +や-ボタンを押し =ボタンを押すと、3つ目のテキストボックスに表示させるという 簡単なプログラムは、なんとかできましたが windowsぽくすると 例 11 + 12 - 9 とテキストに表示され =ボタンを押すと 表示が消え 計算結果が表示されます いまの問題 ・整数と文字列を表示させ、計算だけさせる ・変数宣言、IF、Serectしか教わってない(それだけでできる言われた笑) ・まだ、いまいちわかっていないため 詳しく知りたい 無論、教えてもらったコードをそのまま使いたいわけじゃなく どーいう流れで、どーいう風にというのを理解したいです 結局は自分が理解して、少しずつやらないといけないので 詳しい方、教えてください。 現在なにもできてないコードです ここにどう埋めるか教えてほしいです ------------------------------------------------------------------------------ Option Explicit On Public Class Form Public oboe As String '押されたボタンが数値以外を覚える変数 Public befor As String '押されたボタンが数値の場合 覚える変数 Public anser As Integer ' 計算結果を保存する 変数 Public number As Integer '入力された数値を保存する 変数 Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '1 befor = "1" ans.Text &= "1" End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '2 befor = "2" ans.Text &= "2" End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click '3 befor = "3" ans.Text &= "3" End Sub Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 'たし算 oboe = "+" ans.Text &= "+" number = befor + ans.Text End Sub Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click '掛け算 End Sub Private Sub Button4_Click_1(sender As Object, e As EventArgs) Handles Button4.Click '計算 End Sub Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click 'CLEAR End Sub Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click '引き算 End Sub Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click '割り算 End Sub Private Sub ans_TextChanged(sender As Object, e As EventArgs) Handles ans.TextChanged

  • 電卓作成(緊急です!!)

    電卓作成(緊急です!!) 以下のようなコードで電卓を作りました。これで完成かな?と思いきや1+2=7-8=29、1+2+3=5 となり不具合が出てしまいました。どう直せばこれを解決できますか?(=の所がおかしい?) Public Class Form電卓 Inherits System.Windows.Forms.Form Dim R1 As Integer 'レジスタの値 Dim R2 As Integer 'レジスタの保存 Dim Op As Integer '演算子 Dim CL As Integer '数字列の制御 windows フォームデザイナーで生成されたコード Private Sub Button終了_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button終了.Click End End Sub Private Sub 数字キー(ByVal k As Integer) If CL Then R1 = 0 CL = False End If R1 = R1 * 10 + k TextReg.Text = R1 End Sub Private Sub 演算キー(ByVal o As Integer) Op = o R2 = R1 CL = True End Sub Private Sub 計算() Select Case Op Case 1 R1 = R2 + R1 Case 2 R1 = R2 - R1 Case 3 R1 = R2 * R1 Case 4 R1 = R2 \ R1 End Select End Sub Private Sub KeyN0_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles KeyN0.Click 数字キー(0) End Sub ’(引数が1~9と置き換わったコードがこの下に続きますが長くなるので今は省略します) Private Sub KeyOA_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles KeyOA.Click 演算キー(1) End Sub ’(引数が2~4と置き換わったコードがこの下に続きますが長くなるので今は省略します) Private Sub KeyEg_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles KeyEg.Click 計算() TextReg.Text = R1 End Sub Private Sub KeyCl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles KeyCl.Click R1 = 0 R2 = 0 Op = 0 CL = True TextReg.Text = "" End Sub Private Sub Form電卓_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load R1 = 0 R2 = 0 Op = 0 CL = True TextReg.Text = "" End Sub End Class

  • VBでデバックするとエラーになる。

    VBでデバックすると下のようなエラーがでます ArgumentNullExceptionはハンドルされませんでした。 値を Null にすることはできません。 パラメーター名: activationContext VBを初めて日が浅いのでヘルプを読んでも意味が理解できませんでした。 なので、易しく回答してもらえると嬉しいです コードは下です Public Class Form1 'TextBox2に入力したURLをWebBrowser1で表示する Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click WebBrowser1.Navigate(TextBox2.Text) End Sub 'ブラウザ→戻るでWebBrowser1を処理する Private Sub 戻るToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 戻るToolStripMenuItem.Click WebBrowser1.GoBack() End Sub 'ブラウザ→進むでWebBrowser1を処理する Private Sub 進むToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 進むToolStripMenuItem.Click WebBrowser1.GoForward() End Sub 'ブラウザ→テキストボックスにURLを入力した時の処理 Private Sub ToolStripTextBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripTextBox1.Click WebBrowser1.Navigate(ToolStripTextBox1.Text) End Sub 'TextPageのタブをクリックした時のイベント Private Sub TabPage1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage1.Enter TextBox2.Visible = False Button1.Visible = False ブラウザToolStripMenuItem.Enabled = False 書式ToolStripMenuItem.Enabled = True ToolStripMenuItem1.Enabled = True End Sub 'BrowserPageのタブをクリックした時のイベント Private Sub TabPage2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage2.Enter TextBox2.Visible = True Button1.Visible = True ブラウザToolStripMenuItem.Enabled = True 書式ToolStripMenuItem.Enabled = False ToolStripMenuItem1.Enabled = False End Sub Private Sub 新規ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新規ToolStripMenuItem.Click TextBox1.Text = ("") End Sub Private Sub 開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = OpenFileDialog1.ShowDialog() filename = OpenFileDialog1.FileName If selectButton = DialogResult.OK Then Try TextBox1.Text = _ My.Computer.FileSystem.ReadAllText(filename, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub 保存ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 保存ToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = SaveFileDialog1.ShowDialog() filename = SaveFileDialog1.FileName If selectButton = DialogResult.OK Then Try My.Computer.FileSystem.WriteAllText(filename, TextBox1.Text, False, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub フォントToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles フォントToolStripMenuItem.Click Dim fd As New FontDialog() fd.Font = TextBox1.Font fd.Color = TextBox1.ForeColor fd.MaxSize = 19 fd.MinSize = 8 fd.FontMustExist = True fd.AllowVerticalFonts = False fd.ShowColor = True fd.ShowEffects = True fd.FixedPitchOnly = False fd.AllowVectorFonts = True If fd.ShowDialog() <> DialogResult.Cancel Then 'TextBox1のフォントと色を変える TextBox1.Font = fd.Font TextBox1.ForeColor = fd.Color End If End Sub End Class

  • VB6でスロットを作成したい

    VB6歴2ヶ月の初心者です。 フォーム上に ラベルコントロールが三つ コマンドボタンが二つ タイマーコントロールが一つ あります。 タイマーのプロパティは Enabled False Interval 10 です。 スロットを作成したいのですが、 ボタン1を一回押すごとに左からスロットが回り、 最後にボタン2で動きを止めたいのです。 一応自分でも書いてみたのですが、ここで行き詰まりました。 ウワァァァァァァヽ(`Д´)ノァァァァァァン! Private Sub Command1_Click() Timer1.Enabled = True End Sub Private Sub Command2_Click() Timer1.Enabled = False End Sub Private Sub Timer1_Timer() Dim slot As Integer slot = Int(Rnd(1) * 9 + 1) Label1.Caption = slot End Sub 思い通りに動かすにはどんなコードにしたらいいですか?

  • VB Loopを一時停止し再開あるいはキャンセル

    Loopで処理を回しています。処理件数が多く、処理の途中で一時停止させ、DataGridViewに表示されている処理結果を目で確認ないしマウスでコピーしてから、処理を再開ないしキャンセルして終了させる仕様を作成中です。 MessageBoxを使用すれば、Loopは一時停止出来たのですが、MessageBoxだとDataGridView上の処理結果をマウスでコピーなど出来ません。 そこで、MessageBoxを使用せずに、以下のコマンドを書いてみたのですが、最初のStopFlag=Trueが効くだけで次のコマンドは一瞬で処理されLoopが続いてしまいます。いかにすればLoopを一時停止できるか教えてください。 <変数宣言> Public StopFlag As Boolean Public CancelFlag As Boolean <前処理> TextBox1.Text = "処理待ち" 'テキストボックスに処理ステータスを表しています。 TextBox1.Refresh() <処理> Do Me.Cursor = Cursors.WaitCursor '砂時計開始 TextBox1.Text = "処理中" ’ステータスを処理中として表示 TextBox1.Refresh() ~ Application.DoEvents() 'ストップボタンを押下したらここでDoEventsさせます。 If StopFlag = True Then ’ここでLoopを一時停止させておきたいのです。 Me.Cursor = Cursors.Default '一旦砂時計を止めます TextBox1.Text = "処理一時停止" TextBox1.Refresh() If StopFlag = False Then ’再開ボタンが押下されたらここで再開させたい。 TextBox1.Text = "処理中" ’処理中と表示させます TextBox1.Refresh() Me.Cursor = Cursors.WaitCursor '砂時計再開です ElseIf CancelFlag = True Then ’キャンセルボタンが押下されれば、処理はLoopを抜けます。 TextBox1.Text = "キャンセル" TextBox1.Refresh() Exit Do End If Loop '----------ストップボタン---------- Private Sub Button2_Click~ StopFlag = True End Sub '----------再開ボタン---------- Private Sub Button3_Click~ StopFlag = False End Sub '----------キャンセルボタン---------- Private Sub Button4_Click~ CancelFlag = True End Sub この質問に補足する

  • VB6のバグか?

    VB6のバグか? 下記のように、 文字列「278754742940.733」を数値に変更し、1000倍にすると、278754742940732になったんですよ。 Private Sub Command1_Click() Dim s As String s = "278754742940.733" Dim d As Double d = Val(s) * 1000 MsgBox Fix(d) 'intも同じ End Sub 結果: 278754742940732 どうすれば、解決できますか?

  • VB 電卓 数字キーを押して ラベルに出力

    VB.NET 2005では、 VB.NETにはコントロール配列は存在しないらしいので、それに類似した処理をどう行うかを教えていただきたいのです。 電卓の数字0~9までのボタンをクリックした時 どうすればよいのでしょうか? 作成中のコードです。 Option Explicit On Public Class frmMain Dim dData1 As Double, dData2 As Double '数値記憶用 Dim SuuFlag As Boolean '数字キー用 Dim EFlag As Boolean '演算キー用 Dim Enzan As Integer '演算種類記憶用(+:0,-:1,*:2,/:3,4:=) Const NONE = -1 Const TASU = 0 Const HIKU = 1 Const KAKERU = 2 Const WARU = 3 Const EQU = 4 Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load dData1 = 0 '数値記憶用変数の初期化 dData2 = 0 Enzan = NONE '演算種類初期値 SuuFlag = False EFlag = False End Sub Private Sub cmd_Click(ByVal Index As Integer) '0が1文字だけ、または、演算キーを押した後の時 If txtDisplay.Text = "0" Or SuuFlag = False Then txtDisplay.Text = "" '0を消す dData2 = 0 End If If Index <= 9 Then '0 - 9 数字 txtDisplay.Text = txtDisplay.Text & Trim(Str(Index)) ElseIf Index = 10 Then '.小数点 If txtDisplay.Text = "" Then '最初が小数点 txtDisplay.Text = "0." ElseIf InStr(txtDisplay.Text, ".") = 0 Then '小数点無し txtDisplay.Text = txtDisplay.Text & "." End If End If SuuFlag = True End Sub End Class 数字のオブジェクト名は 1=cmd1 2=cmd2 3=cmd3 0=cmd0 ~といった感じです。 この先、数字を表示させるには いったいどうすればよいのでしょうか。 大変申し訳ないのですが、回答お願いいたします。

  • VBで、このようなことはどうやっら出来るのでしょうか?

    こんばんは。単刀直入のこんなことです。 Private Sub Command1_Click() Dim a As Double a = a + 1 Text1.Text = a End Sub このプログラムを実行して、、コマンドボタン1を押すと テキスト1には、1が表示されます。 で、やりたいことは、またコマンドボタン1を押すと、テキスト1には2{a=1(一回目によって代入された値)+1}が表示されるようにしたいのですが、どうすればよいのでしょうか?