• 締切済み

ヴィジュアルベーシックについて

VBを勉強し始めました。 サイトを見ながらやっているのですが、 そのサイトでの流れに沿って電卓を作っています。 1+ 1=2 となるのですが、 2-1=3 となってしまいます。=ボタンのソースが、 name2=name2 name1 textbox1.text=name2 となっておるのが原因ではないか、と考えています。 ちなみに、 +ボタンのソースは、 name2 = name2 + name1 name1 = Nothing -ボタンのソースは、 If name2 = 0 Then name2 = name1 Else Select Case f Case 1 name2 = name2 + name1 Case 2 name2 = name2 - name1 Case 3 name2 = name2 * name1 Case 4 name2 = name2 / name1 End Select End If name1 = Nothing f = 2 です。 変数の指定は一番最初にしており、 Dim name1 Dim name2 As Double Dim f As String と設定しています。 2-1=3 となってしまう原因で考えられるものをご教授ください。 また、どこを修正すればいいかご教授ください。 最初の最初で躓いて少しショックなのですが、 プログラムに強くなりたく、頑張っています。 よろしくお願いします。。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> 最初の最初で躓いて少しショックなのですが、 > プログラムに強くなりたく、頑張っています。 プログラミングの全体のうち、「プログラムを作っている」時間はわずかです。 多くの時間は「プログラムを設計する」「作ったプログラムを期待通りに動作するように修正する」ことに費やされます。 まずは、動かない理由を推測することから考えましょう。 > 2-1=3 という現象から、 ・引き算のつもりが足し算になっている と推測されます。その原因としては ・- と書かなければならない箇所が + になっている ・2-1のつもりが2 - (-1)になっている ・ - を入力したときに、「-の処理」を実行せずに、「+の処理」を実行している 等が考えられます。 原因の候補が挙がったら、ひとつずつ確認していきます。 Visual Studio なら、デバッガを使って、要所要所にブレークポイントを置いて一時停止させ、変数の中身を確認したり、ステップ実行させてたりして、期待通りになっているか調べるのがよいでしょう。 > =ボタンのソースが、 > name2=name2 name1 > textbox1.text=name2 > となっておるのが原因ではないか、と考えています。 ○ そう思った理由は? ○ ここが間違いであることで、現在起っている現象の説明ができますか? 「動作するプログラム」なら、「期待通り」に動作しない場合でも「書いた通り」には動作します。 「ここが間違いだ」というのなら、それが間違いを引き起す理由が説明できるはずなのです。 > name2=name2 name1 これ、ビルドエラーになりませんか? デバグ実行しようとして「ビルドエラーになりました。前回のビルドを実行しますか?」みたいに聞かれて、「はい」を押していませんか? ビルドエラーが出ている限り、今のプログラムをいくら修正しても、修正できたかどうかの確認はできません。 > -ボタンのソースは、 これを見ると、 - ボタンを押したときに 前回までの結果 前回押したボタン演算子 今回の値 を計算して、-ボタンを押した、ということを記録しているように見えます。 123 ← 数字を入力: name1になる - ← name2=123, f=2 21 ← 数字を入力: name1になる - ←f=2より、select~caseで name2=123-21→ name2=112 が実行される,f=2 .... となると、 + にも = にも同じ処理が入っていないと、計算が合わなくなるのでは? 期待する動作 2 ← 数字を入力: name1になる - ← name2=2, f=2 1 ← 数字を入力: name1になる = ←f=2より、select~caseで name2=2-1→ name2=1 が実行される =ボタンのソースが、「name2=name2 + name1」の場合に行われると予想される動作 2 ← 数字を入力: name1になる - ← name2=2, f=2 1 ← 数字を入力: name1になる = ← name2=2+1→ name2=1 ※なお、同じ処理が必要だからといって、コピペしてはいけません。 同様の処理は、subやfunctionにまとめるようにしましょう

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 教えてください。Visual Basic 2010

    教えてください。Visual Basic 2010で電卓でわからないところ Visual Basic 2010で四則演算ができる簡易電卓を 作っています。 下のソースは+,-.×,÷のボタンが押された時の処理なのですが、 3+6-3の計算が、0になってしまします 3+6-の時点で-3と表示されてしまいます。 str1は最初に入力された数値が保存されています。 Private Sub ButtonAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAdd.Click flag = 1 Call kei() End Sub Private Sub ButtonSub_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSub.Click flag = 2 Call kei() End Sub Private Sub ButtonMul_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonMul.Click flag = 3 Call kei() End Sub Private Sub ButtonDiv_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDiv.Click flag = 4 Call kei() End Sub Private Sub kei() Dim c1 As Single If IsNumeric(str1) = True Then c1 = CSng(str1) Else Exit Sub End If str1 = "" Select Case flag Case 1 anser = anser + c1 Case 2 anser = anser - c1 Case 3 anser = anser * c1 Case 4 If c1 = 0 Then Exit Sub anser = anser / c1 Case Else anser = c1 End Select TextBox1.Text = CStr(anser) flag = 0 End Sub

  • Excel2003で動いたVisualが2007では?

    Excel2003で作った下記のVisual Basicが2007では、最初にクリックしたところには行かず いつも同じ位置に挿入されます。 出来ればセルF1の位置に挿入したいのですが Sub macro1() Dim Fname As String Dim FLT As String Dim Sheetmei As String FLT = "JPEGファイル(*.jpg),*.jpg" Fname = Application.GetOpenFilename(FLT, 2, "開く", True) If Fname = "False" Then Exit Sub End If Sheetmei = Worksheets(1).Name ActiveSheet.Pictures.Insert(Fname).Select Call Jpeg_size_adjust End Sub サブで下記も有ります Sub Jpeg_size_adjust() Selection.ShapeRange.LockAspectRatio = msoFalse Selection.ShapeRange.Height = 270.75 Selection.ShapeRange.Width = 360

  • Visual Basic 合計がうまく出せません。

    Visual Basicを習い始めたばかりですので、コードが分かり難くてすみません。チェックボックスとラジオボタンを使って合計等を出したいのですが、下のコードだとTax、Subtotal、Totalが0になってしまいます。各々のチェックボックスとラジオボタンに下のコードを入れてから、合計等が0になってしまいました。その前は、きちんと計算は出来ていたのですが。ご教授宜しくお願いいたします。 ---------------------- Private Sub Checkbox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Checkbox1.CheckedChanged Dim checkbox1 As Double = 450.40 Dim checkbox2 As Double = 871.65 Dim checkbox3 As Double = 1860.56 Dim radiobutton1 As Integer = 0 Dim radiobutton2 As Double = 250.45 Dim radiobutton3 As Double = 674.24 Dim sum As Double If checkbox1.Checked = True Then sum += checkbox1 End If If checkbox2.Checked = True Then sum += checkbox2 End If If checkbox3.Checked = True Then sum += checkbox3 End If If radiobutton1.Checked = True Then sum += radiobutton1 End If If radiobutton2.Checked = True Then sum += radiobutton2 End If If radiobutton3.Checked = True Then sum += radiobutton3 End If txtSum.Text = FormatCurrency(sum) End Sub ---------------------------- Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click Dim Car As Double Dim Tax As Double Dim Sum As Double txtTax.Text = Format((Car + Sum) * (0.12), "$######.##") ‘Taxの計算 txtSubtotal.Text = Format(Car + Sum + Tax, "$######.##") ‘Subtotalの計算 Dim Subtotal As Double Dim Trade As Double txtTotal.Text = Format(Subtotal + Tax, "$######.##")  ‘合計の計算 End Sub -----------------------

  • VBA超初心者です

    皆さんのお知恵を拝借させてください。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2007/12/1 ユーザー名 : 101 ' Dim pearend As Integer Dim code As Integer Dim codeend As Integer Dim sheet_name As String Dim dayend As Date Sheets("商品名").Select Range("A4").Select Selection.End(xlDown).Select pearend = Selection.Row() For l = 4 To pearend Step 2 For r = 2 To 3 Cells(l, r).Select code = Cells(l, r).Value Select Case code Case 1000 To 1999 sheet_name = "1000" Case 2000 To 2999 sheet_name = "2000" Case 3000 To 3999 ssheet_name = "3000" Case 4000 To 4999 sheet_name = "4000" Case 5000 To 5999 sheet_name = "5000" End Select Sheets(sheet_name).Select Range("B4").Select Selection.End(xlToRight).Select codeend = Selection.Column() Range("A5").Select Selection.End(xlDown).Select dayend = Selection.Row() For i = 2 To codeend If code = Cells(4, i).Value Then Range(Cells(dayend, i), Cells(5, i)).Select Selection.Copy Sheets("商品名").Select Range("K3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End If Next Next Next End Sub というマクロをつくってみたのですが、何順目かあたりから For r = 2 To 3 のrがなぜか4になっています。正直知識がないのでさっぱりわかりません。どこに問題があるか詳しい方教えてください。

  • マクロで二つの構文を繋ぐには

    いつもお世話になります。 WIN7 EXCELL2010 です。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub ThisWorkbook に上記のマクロに下記のマクロを追加したいのですが、 End Sub の ところを End If End With などに変えたのですがうまくゆきません。 御指導お願いできませんでしょうか。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim myRange As Range Set myRange = Intersect(Target, Range("M3:V27")) If Not myRange Is Nothing Then Select Case Target.Value Case "" Target.Value = "○" Case "○" Target.Value = "●" Case Else Target.ClearContents End Select Cancel = True End If End Sub 宜しくお願いいします。

  • Accessフォームの作成

    Accessで作成されているシステムの ファイル取り込みフォームにある実行ボタンを押下すると、 下記のメッセージが表示されます。 「select case に対応する case がみつからない。」 どこかで指定しないといけないのでしょうか? Private Sub Cmd実行_Click() On Error GoTo Err Dim StrSql As String Dim IntNDCnt As Integer Dim IntNTCnt As Integer '確認メッセージの出力 If MsgBox("処理を開始します。よろしいですか?", vbInformation + vbYesNo, "データ取込処理") = vbNo Then Exit Sub End If '対象データ別の処理実行 Select Case Me.Cmb対象.ListIndex Case -1 'エラー MsgBox "読込むデータを指定してください", vbCritical, "データ取込処理" Exit Sub Case 0 '全データ If F_手数料明細読込() = False Then Exit Sub End If If F_奨励金読込() = False Then Exit Sub End If If F_減額読込() = False Then Exit Sub End If If F_預り金読込() = False Then Exit Sub End If Case 1 '手数料データ If F_手数料明細読込() = False Then Exit Sub End If Case 2 '奨励金データ If F_奨励金読込() = False Then Exit Sub End If Case 3 '減額データ If F_減額読込() = False Then Exit Sub Case 4 '預り金データ If F_預り金読込() = False Then Exit Sub End If End Select 今は、Case 4が黄色に反転します。

  • エクセルVBAで指定したセルへジャンプするコード(追加の追加質問です)

    http://oshiete1.goo.ne.jp/qa2903797.html たびたびすみません。最後にひとつだけお願いします。 お教えいただいた下のコードは順調に動作するのですが、 対象セルが結合セルの場合、エラーが出てしまいます。 とまってしまうコードの部分は With Selection.AddComment です。 エラーメッセージにはプロシージャの呼び出し、 または引数が不正です。(Error 5)と書いてあります。 結合セルは動作しないものでしょうか? Sub test01() Dim x As String Dim ThisSheet_Name As String Dim Sheet_Name As String Dim Range_Name As String Dim I As Integer, n As Integer Dim Ans As Integer Dim myComment As String '新規追加 Dim Colors As Integer '新規追加 ThisSheet_Name = ActiveSheet.Name '設定シート Select Case Workbooks.Count Case 1 MsgBox "チェックするファイルがありません。" Exit Sub Case 2 For n = 1 To 2 If Workbooks(n).Name <> ThisWorkbook.Name Then x = Workbooks(n).Name '開いている“もうひとつのブック”の名前 End If Next Case Else MsgBox "他に開いているファイルが複数のため対象を特定できません。" Exit Sub End Select I = 0 Do While (1) With ThisWorkbook.Sheets(ThisSheet_Name) If .Range("A3").Offset(I, 0).Value = "" Then MsgBox "検査項目は以上です。" ThisWorkbook.Activate Exit Do 'A列の3行目以下が、空白なら終わる End If Sheet_Name = .Range("A3").Offset(I, 0).Value Range_Name = .Range("B3").Offset(I, 0).Value myComment = .Range("C3").Offset(I, 0).Value End With Windows(x).Activate Sheets(Sheet_Name).Select Range(Range_Name).Select Colors = Selection.Interior.ColorIndex '新規追加 Selection.Interior.ColorIndex = 6 With Selection.AddComment .Visible = True .Text myComment End With Range(Range_Name).Select Ans = MsgBox("「次をチェックしますか?」", vbYesNo) Selection.Interior.ColorIndex = Colors '修正 Selection.ClearComments '新規追加 If Ans = vbYes Then I = I + 1 Else Exit Do End If Loop End Sub

  • EXCEL2007 VBA グラフサイズ修正バグ?

    下記のようなグラフのサイズ調整するVBAプログラムをEXCEL2007で動かしました。 VBEで実行すると正常に動作します。 シートに図形を設置し、その図形にマクロを登録して実行すると、 グラフが3画面位広がってしまいます。 図形にマクロ登録してグラフ調整を正常に動かすことはできないのでしょうか? ----------------------------------------------------- 'グラフの再調整を行うサブルーチン Sub chartRerange()  Dim wb As Workbook  Dim strWbName As String  Dim myRng1, myRng2, myRng3 As Range  Dim myChart As Shape  Dim rngTarget As Range      '開いているすべてのワークブックを処理対象とする  For Each wb In Workbooks   strWbName = wb.Name      '「月度」が含まれているならば処理   If InStr(strWbName, "月度") <> 0 Then    Set myRng1 = wb.Worksheets(2)    Set myRng2 = wb.Worksheets(3)        For Each myChart In myRng1.Shapes     'グラフならば     If (TypeOf myChart.OLEFormat.Object Is ChartObject) Then            Select Case myChart.Name       Case "chart1"        Set rngTarget = Range("B24:AG42")      End Select             'グラフを指定したエリアに配置する      With myChart        .Top = rngTarget.Top        .Left = rngTarget.Left        .Width = rngTarget.Width        .Height = rngTarget.Height      End With     End If    Next   End If  Next      MsgBox "処理完了"      Set wb = Nothing   Set myRng1 = Nothing   Set myRng2 = Nothing   Set myChart = Nothing   Set rngTarget = Nothing End Sub

  • マクロで条件付き書式(セルの塗りつぶし)

    2003のため、条件付書式を5つ作るのにマクロが必要なのですが触ったことないので全くわかりません。以下のマクロ作ったのですが、"コンパイルエラー End Subが必要です"と出てしまいます。どこが悪いのか見当も付きません(TT)。添削をお願いします。 やりたいことは、「決まっている範囲内に入力されている単語別にセルの色を分ける」です。 Sub 条件() Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range Set rng = IntersectC9: F28 If rng Is Nothing Then Exit Sub Dim x As Range For Each x In rng Dim myColor As Integer Select Case x.Value Case "りんご": myColor = 3 '赤色 Case "ばなな": myColor = 45 'オレンジ色 Case "みかん": myColor = 6 '黄色 Case "いちご": myColor = 5 '青色 Case "他": myColor = 4 '緑色 Case Else: myColor = xlNone End Select x.Interior.ColorIndex = myColor Next x Set rng = Nothing Set x = Nothing End Sub

  • VB.NETで、ORACLE 8に接続するには?

    現在、ローカルのmdbに接続しています。 接続先DBを同LAN上のWin2000ServerのORACE 8に変えるべくコードを修正していますが上手くいきません。 当方、ORACLEは初めてなので、接続方法がイマイチ良くわからず・・・ ちなみに、接続方法はoo4oを用いたいです。 ご教授いただけると幸いです。 ----- mdb接続で用いているコード ------ Public Function getData(ByRef table_name As String, ByRef code_name As String, ByRef extract As String, ByRef code As String) As String  Dim oConn As New OleDbConnection    Dim oCommand As New OleDbCommand  Dim oDataReader As OleDbDataReader  Try  oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\XXXXX.mdb"  oCommand.Connection = oConn  oCommand.CommandText = "SELECT * FROM " + table_name + " ORDER BY " + code_name  oConn.Open()  oDataReader = oCommand.ExecuteReader()  While oDataReader.Read()   If code = CStr(oDataReader(code_name)) Then    getData = CStr(oDataReader(extract))    Exit While   End If  End While   ・   ・(省略)   ・  Finally  If Not oDataReader Is Nothing Then   oDataReader.Close()  End If  If Not oConn Is Nothing Then   oConn.Close()  End If  End Try End Function