• ベストアンサー

足し算の結果のみが変!?

ExcelVBAでinputbox()やuserformのtextboxから値を取得する場合に Sub prog() Dim a, b, c As Integer a = InputBox("値1を入力") b = InputBox("値2を入力") c = a + b MsgBox c End Sub とすると,例えば(値1)=2,(値2)=3としたときにメッセージボックスに本来であれば2+3なので5と表示されるはずですが23と表示されてしまうのはどうしてでしょうか。引き算や掛け算,割り算の場合はちゃんと表示されるのですが、、、

  • backs
  • お礼率85% (564/660)

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

  • ベストアンサー
  • fantom
  • ベストアンサー率31% (30/94)
回答No.2

変数の宣言の所を省略せずに、 Dim a As Integer, b As Integer, c As Integerにしてみて下さい。 既存のままだと、 a,bはVariant型になってしまい文字として認識されていると思います。

backs
質問者

お礼

早速の回答ありがとうございます。 aとbはVariant型になってしまっていたのですね。ご指摘いただいたようにそれぞれ分けて宣言をしたら大丈夫でした。

その他の回答 (1)

noname#20377
noname#20377
回答No.1

ExcelやWordについているVBA や VB6以前のVBとそれ以降のVB.NETとでは変数の型の扱いが違います(宣言と代入を参照のこと) http://santamartadotnet.hp.infoseek.co.jp/documents/vbdotnetbasic/01_variables.html つまり Dim a, b, c As Integer のaとbはVariant型です。 InputBox関数の戻り値はString型なので aとbに入る戻り値はString型扱いとなり String型同士の間に定義されている+演算子の役割は 文字の連結なので該当の状況が発生します。 従ってa = CInt(InputBox("値1を入力"))とすれば aに代入される値がInteger型と解釈されるので 5が表示されます。 記憶が定かじゃないですが、できるなら Dim a As Integer,b as Integer,c as Integer と宣言するかあるいは別な行に分けるかすることをお勧めします。

backs
質問者

お礼

早速の回答ありがとうございます。 なるほど,String型の場合は+が足し算ではなく文字を連結させるためのものだったのですね。

関連するQ&A

  • 計算の順序 a×b÷c

    小学生の算数で, たし算,ひき算は,かけ算,わり算より先 たし算と,ひき算が,又は,かけ算,わり算が, 複数ある時は,普通,左からと習います。 しかし, たし算だけ, かけ算だけなら,どこからでも計算できます。 a×b÷c は,b÷cを先に計算することは,できますか? いくつか,問題を作って解いてみましたが, a×bを先に計算した時と,答えが同じになりました。 よろしくお願いします。

  • VBAで最終行の取得について

    UserFormのConboBoxで「○○」を選んで、 UserFormのTextBoxで『あいう』と入力すると、ワークシートに A      B 1 ○○   ×× 2 あいう と表示され、 UserFormのConboBoxで「××」を選んで、 UserFormのTextBoxで『アイウ』と入力すると A      B 1 ○○   ×× 2 あいう  アイウ 3 :    : と表示されるようにしたいと思います。 以下のプログラムまではできています。 ********************************************* Private Sub UserForm_Initialize()  Dim lasClm As Integer, i As Integer  lasClm = Sheet1.Range("A1").End(xlToRight).Column   For i = 1 To lasClm   ComboBox1.AddItem Sheet1.Cells(1, i).Value   Next i End Sub ********************************************* Private Sub CommandButton1_Click()  Select Case ComboBox1.Text  Case Sheet1.Cells(1, 1).Value '「○○」が選択  Sheet1.Cells(2, 1).Value = TextBox1.Text ・・・(1)  Case Sheet1.Cells(1, 2).Value '「××」が選択  Sheet1.Cells(2, 2).Value = TextBox1.Text ・・・(2)  End Select  UserForm1.Hide End Sub ********************************************** 今は(1)、(2)のように直接セルを指定しているのですが、 この部分を各列(A列、B列)の最終行の値を取得して、 最終行+1のセルに順次TextBoxに入力された値を代入していきたいのですが、 どのようにしたらよいのでしょうか。 しかし、A列とB列は同じように値が増えていくとは限りません。 例)    A     B 1 ○○   ×× 2 あいう  アイウ 3 かきく 4 さしす となる場合もあるので、A列とB列それぞれの最終行の値を取得したいと思っています。

  • msgboxの値をシリアル値で表示するには?

    お世話になります。 エクセル2010VBA初心者です。 以下の手順で msgboxの値をシリアル値で表示するには どうすればいいのでしょうか? Sub シリアル値で表示() a = InputBox("年を入力してください") b = InputBox("月を入力してください") c = InputBox("日を入力してください") d = a & "年" & b & "月" & c & "日" MsgBox d End Sub 宜しくおねがいいたします。

  • VBにおいて2次方程式で虚根が出た場合に、実根が計算で求められるまで繰り返したいのですが・・・

    VBにおいて2次方程式で虚根が出た場合に、実根が計算で求められるまで繰り返し入力をすることができるようにしたいのですが・・・ どのようにすればいいのかわからず、途方に暮れている状況です。 コードは現状ではこのように書いています。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim a, b, c, r As Integer a = TextBox1.Text b = TextBox2.Text c = TextBox3.Text Try r = (b ^ 2 - (4 * a * c)) ^ (1 / 2) Catch Do While r <= 0 Label8.Text = "虚根です。" a = Val(InputBox("aの値を再入力", "エラー")) b = Val(InputBox("bの値を再入力", "エラー")) c = Val(InputBox("cの値を再入力", "エラー")) r = Math.Sqrt(b ^ 2 - (4 * a * c)) Loop Finally Label8.Text = "" Label5.Text = (-1 * b + r) / (2 * a) Label6.Text = (-1 * b - r) / (2 * a) End Try End Sub DO~LOOPのDOをTRYの上に持って来る事ができたらインプットボックスで入力した数値に関してもエラーの可能性のある物として計算することができるのですが、どんなにコネクリ回しても構文的にエラー状態にしかならないので、是非どなたかのお知恵を拝借できたらと思います。 宜しくお願い致します。

  • エクセルVBAのマクロ文について

    エクセルVBAで、シート上のボタン(フォーム)をクリックすると、UserForm1が表示されてその中のTextBoxに別のシートのセルに入力したいる値を表示させたくて、以下のようにボタン(フォーム)にマクロを入力したのですが、エラーがでてきてうまくいきません。 入力したマクロが間違っているのでしょうか? Sub ボタン1_Click() UserForm1.Show UserForm1.TextBox1 = Sheets("入力").Ranges("D11").Value End Sub すみませんが、ご存知の方、教えてくださいませんか?

  • ベクトルの四則演算

    A,Bをベクトルとして ・足し算  A+B ・引き算  A-B ・割り算  A/Bがありません。 掛け算もなかったような。どうしてでしょうか? 定義できないのでしょうか?

  • 入力エラー時にメッセージを出す方法

    下記コードなのですが、入力ミスでもフォームが開いてしまいます。 5602、5662以外の場合、メッセージを出して、正しく入力を求めるようにしたいのですが、どのようにしたらいいでしょうか。 Sub 推進区() s = InputBox("納入便を選択して下さい。" & Chr(13) & _ "推進区:5602" & Chr(13) & "推進区:5662", "納入便選,s) If s = "5602" Then UserForm1.OptionButton3.Visible = False UserForm1.TextBox1.Value = 5602 Else UserForm1.OptionButton3.Visible = True UserForm1.TextBox1.Value = "5662" End If UserForm1.Show End Sub

  • Excelで検索結果表示の修正

    下記のマクロでA列だけ検索できるようにしたいのですが、どこを修正したらいいのか教えてください。 Private Sub CommandButton1_Click() AAA End Sub Sub AAA() strMoji$ = UserForm1.TextBox1.Text If UserForm1.TextBox1.Text = "" Then MsgBox "検索条件を入力してください。", 48 Exit Sub End If On Error GoTo Fail Cells.Find(What:=strMoji, After:=ActiveCell, LookIn:=xlValues, LookAt:= _ xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ ).Activate lonNUM& = Selection.Row UserForm1.TextBox2.Text = Cells(lonNUM, 2).Value UserForm1.TextBox3.Text = Cells(lonNUM, 3).Value Exit Sub Fail: MsgBox "該当なし", 48 End Sub Private Sub UserForm_Click() End Sub

  • Excel VBA セルの内容をTextBoxに

    ExcelのVBAで質問があります。 複数のシートの表に入力した値の合計を出したいのですが、 その後の処理もあり、ユーザーフォームのテキストボックスに反映させたいと考えています。 Windows7のExcel2010で作っています。 試しにセルB1の値が変わった時、 テキストボックスに反映させるつもりで作ったコードは以下の通りですが、 上手くいきません。 Sub Z_test() UserForm2.Show vbModeless End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(False, False) = "B1" Then UserForm2.TextBox1.Value = Range("B1").Value '←※ End If End Sub ※の行には他にも UserForm2.Controls("TextBox1").Value = Range("B1").Value と調べたコードを試してみたのですが、 セルの内容が全く反映されません。 セルB1には数式の「=SUM(C2:C1000)」 が入っており、表のC列に入力された値の合計を求めています。 どなたかお知恵を拝借できれば大変助かります。 宜しくお願い致します。 長文失礼しました。

  • ExcelVBAで複数のTextBoxから値取得

    ExcelVBA初心者です。 複数のTextBoxから値を取得し、 その値を使って計算と文字連結を行なったものを セルに挿入したいのですが、 値の取得からできていないようです。 Dim optData(5) As Integer '入力データ Dim i As Integer 'カウンタ UserForm1.Show '4つのTextBoxのあるオブジェクト表示 For i = 1 To 4 '値取得 optData(i) = UserForm1.Controls("TextBox" & i).Value '確認用 MsgBox optData(i) Next i この方法だとTextBoxの値は取得できないんでしょうか。 教えてください。

専門家に質問してみよう