• 締切済み

Excel VBAの割り算の記述に関して

各シートにA列とB列の計算した結果をC列に出力するようなExcel VBAの記述をしたいのですが、 シートAには、計算する個数を入力します。 開発タブよりフォーム コントロールのボタンを選択します。 ボタンを押すと シートBには、A列とB列のそれぞれの値の和の結果をC列に シートCには、A列とB列のそれぞれの値の差の結果をC列に シートDには、A列とB列のそれぞれの値の積の結果をC列に シートEには、A列とB列のそれぞれの値の商の結果をC列に シートEの割り算の計算ですが、小数点を出力したい。 割り算がうまく出力してくれません。"/"を使えば良いと思うのですが、異なる結果が出て困っています。以下の記述のどこが間違っているのでしょうか。 Sub 問題作成() Dim count As Long Dim input_training As Long Dim left_num As Long Dim right_num As Long Dim answer_num As Long input_training = Range("A1").Value ' 加算 Worksheets("SheetB").Range(("A2"), ("C100000")) = "" ' 減算 Worksheets("SheetC").Range(("A2"), ("C100000")) = "" ' 積 Worksheets("SheetD").Range(("A2"), ("C100000")) = "" ' 商 Worksheets("SheetE").Range(("A2"), ("C100000")) = "" Randomize For count = 1 To input_training left_num = Int(1000 * Rnd) right_num = Int(1000 * Rnd) answer_num = left_num + right_num Worksheets("SheetB").Cells(1 + count, 1) = left_num Worksheets("SheetB").Cells(1 + count, 2) = right_num Worksheets("SheetB").Cells(1 + count, 3) = answer_num Next ' 減算 For count = 1 To input_training left_num = Int(1000 * Rnd) right_num = Int(1000 * Rnd) answer_num = left_num - right_num Worksheets("SheetC").Cells(1 + count, 1) = left_num Worksheets("SheetC").Cells(1 + count, 2) = right_num Worksheets("SheetC").Cells(1 + count, 3) = answer_num Next ' 積 For count = 1 To input_training left_num = Int(1000 * Rnd) right_num = Int(1000 * Rnd) answer_num = left_num * right_num Worksheets("SheetD").Cells(1 + count, 1) = left_num Worksheets("SheetD").Cells(1 + count, 2) = right_num Worksheets("SheetD").Cells(1 + count, 3) = answer_num Next ' 商 For count = 1 To input_training left_num = Int(1000 * Rnd) right_num = Int(1000 * Rnd) answer_num = left_num / right_num Worksheets("SheetE").Cells(1 + count, 1) = left_num Worksheets("SheetE").Cells(1 + count, 2) = right_num Worksheets("SheetE").Cells(1 + count, 3) = answer_num Next End Sub

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

なにを聞きたいのか? ーー ここの質問には、あまり多数のVBAとしての論点を含めないこと。 引っかかっている点が、数値の演算のこと、データは小数点以下数らしいこと、などは判るが、 質問コード例では、乱数が出たり、演算するデータの場所がいろいろあったり、複雑でよくわからない。 質問は、自分の今回の課題に100%突き合わせないこと。 質問は、エッセンスにして質問できるようになること。 コードのコピペに頼らず、疑問点をパターン化したときはどうなるか、文章表現を磨け。プログラムの勉強は、このパターンのレパートリーを増やすこと、になると思う。 ーー ・エクセルのVBAであること、として ・データ型は https://kokodane.com/2013_macro_15.htm 倍精度浮動小数点数型 など読んで考えたら。 ・エクセルには、数の小数点以下の数を指定できる関数がある。Roundなど。 ・またエクセルは、表示形式という仕組みで、表示の小数点以下を指定できる。 それらについては、質問者はどう考えているのか。 >割り算がうまく出力してくれません 「うまく」とは、他人には例でも挙げないと、判らないだろう。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.1

Dim answer_num As Double にしてみてください。 エクセルの神髄 第12回.変数宣言のDimとデータ型 https://excel-ubara.com/excelvba1/EXCELVBA312.html

tsugurin0823
質問者

お礼

早速、ご返答ありがとうございます。 さらに、有力なURLを教えていただきましてありがとうございます。

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

関連するQ&A

  • EXCEL VBA 取得したセルの列の最終行

    お客さんからいただいたEXCELフォーマットに沿って、集計ツールを作成していますが 下記でつまってしまいました。 Wb.Worksheets("Sheet1").Cells.Find("実施日").Select Sel_Col = Selection.Column Last_Row = Wb.Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row ※1 For i = Last_Row To 2 Step -1 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Value = Day Then ※2 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "A" Then A_count = A_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "B" Then B_count = B_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "C" Then C_count = C_count + 1 End If Else End If Next i まず※1の箇所ですが、Sheet1の実施日と入力されているセルの列番号を取得して その列の最終行を取得したいのですが、上記作成したものですと入力されている列全部の 中での最終行が取得されてしまいます。 この場合、Sel_Col をどのように使えばよろしいでしょうか? 次に※2ですが、※1で取得した列の最終行から1つずつ上に上がりながら 日付が今日であれば、そのセルから5つ左のセルのA、B、Cいずれかを カウントするという造りにしたいと思っています。 実行すると1004エラーでアプリケーション定義、オブジェクト定義のエラーと 出てしまいます。 Wbはset Wbとして開いたブックを定義しています。 DayはDay = Dateで今日の日付を取得しています。 独学で無茶苦茶なコードですが、 どなたか詳しい方、ご教示お願いいたします。

  • Excel vbaのClearについて

    よろしくお願いします。 Excel2003使用です。 最終行を指定して、それを使って動作をしたいのですが、、うまく動作しません。 A列~D列まで入力があり、A列の52行目からD列の最終行までをClearしたいのです。 Set ps = ThisWorkbook.Worksheets("●●") LastRow = ps.Cells(ps.Rows.Count,1).End(xlUP).Row ps.Range(Cells(52,1),Cells(LastRow,4)).Clear →Error1004がでます うまく動く方法をご存じな方、よろしくお願いします。

  • ExcelにおけるVBAで、データの振り分けをしたい

    Sub a() Dim i As Long Dim s As Long Dim b As Worksheet Dim c As Worksheet Dim maxi As Long Dim maxs As Long Application.ScreenUpdating = False With ThisWorkbook Set b = .Worksheets("bbb") Set c = .Worksheets("ccc") End With maxi = b.Range("A1").CurrentRegion.Rows.Count maxs = c.Range("A1").CurrentRegion.Rows.Count For i = maxi To 2 Step -1 For s = maxs To 2 Step -1 If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then c.Cells(s, 14) = b.Cells(i, 3) End If Next s Next i Application.ScreenUpdating = True End Sub ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

  • エクセルマクロでシートの比較

    sheetAとsheetBそれぞれのA列に千件くらいのデータが入っています。 かなり重複もあります。 今回マクロでSheetCのA列に重複されないデータのみ抜き出したいと思います。 どのような記述になるのでしょうか?

  • Excel2007VBAのランダム置換ソース

    Excel(エクセル)2007VBAを使って、 「複数ある、同一の置換したい文字・数」 を 「複数の文字・数」 でランダムに置換したいのですが、 VBAソースが分かりません。 たとえば、 【A列】に A1:私は(置換する所)と(置換する所)が得意です。 A2:彼は(置換する所)と(置換する所)と(置換する所)が特技です。 A3:彼女は(置換する所)と(置換する所)と(置換する所)と(置換する所)の選手です。 A4:彼らは(置換する所)と(置換する所)と(置換する所)と(置換する所)と(置換する所)が好きです。 A5:あの人は(置換する所)と(置換する所)と(置換する所)と(置換する所)と(置換する所)と(置換する所)をしたことがありません。 と入力されている時に、 【B列】に B1:拳闘 B2:柔道 B3:野球 B4:籠球 B5:打球 B6:羽球 B7:剣道 B8:卓球 B9:水泳 B10:避球 と入力したとします。 そして、コマンドボタンを押すと 【A列】にあるすべての 「(置換する所)」 を、 【B列】にある「拳闘」「柔道」「野球」「籠球」「打球」「羽球」「剣道」「卓球」「水泳」「避球」のどれかで必ず置換されるようにします(【ランダムで置換】されるようにしたいです)。 ※置換の条件として、一つのセル内で同じ文字が重複しないようにしたいです。 (私は拳闘と拳闘が得意です。)     ↑   ↑ 同じ文字が2つ以上ある置換は失敗です。 --------------------------------- 置換の成功例 (重複なしの置換) ◆置換前の【A列】A5 あの人は(置換する所)と(置換する所)と(置換する所)と(置換する所)と(置換する所)と(置換する所)をしたことがありません。       ↓↓↓ ◆置換後の【A列】A5 あの人は打球と柔道と水泳と剣道と避球と拳闘をしたことがありません。 --------------------------------- これが未完成のVBAソースです。 ↓↓↓ Sub test_Click() For Each CellA In Range("A1:A5").Cells Rnd1 = Int(Rnd() * 10) + 1 Rnd2 = Int(Rnd() * 9) + 1 Rnd3 = Int(Rnd() * 8) + 1 Rnd4 = Int(Rnd() * 7) + 1 Rnd5 = Int(Rnd() * 6) + 1 Rnd6 = Int(Rnd() * 5) + 1 If Rnd2 = Rnd1 Then Rnd2 = Rnd2 + 1 If Rnd3 = Rnd2 Then Rnd3 = Rnd3 + 1 If Rnd4 = Rnd3 Then Rnd4 = Rnd4 + 1 If Rnd5 = Rnd4 Then Rnd5 = Rnd5 + 1 If Rnd6 = Rnd5 Then Rnd6 = Rnd6 + 1 CellA.Value = Replace(CellA, "(置換する所)", Cells(Rnd1, 2), , 1) CellA.Value = Replace(CellA, "(置換する所)", Cells(Rnd2, 2), , 1) CellA.Value = Replace(CellA, "(置換する所)", Cells(Rnd3, 2), , 1) CellA.Value = Replace(CellA, "(置換する所)", Cells(Rnd4, 2), , 1) CellA.Value = Replace(CellA, "(置換する所)", Cells(Rnd5, 2), , 1) CellA.Value = Replace(CellA, "(置換する所)", Cells(Rnd6, 2), , 1) Next End Sub 【補足】 ※コマンドボタンを押すとランダム置換される仕様です。 ※1回限定の置換ではなく、コマンドボタンを押すたびに(何度でも)ランダム置換できるようにしたいです。 ※上記の【A列】【B列】の文字はあくまで例です。実際は、【A列】【B列】ともに自由に文字を変更できる応用の利く仕様にしたいです(Excelの【A列】【B列】に、文字を直接入力して変更するという意味です)。 ※上記の【A列】が5行、【B列】が10行というのもあくまで例です。実際は、【A列】【B列】ともに何行にでも対応できる仕様にしたいです(具体的には【A列】【B列】ともに、10000行くらいまで対応できるのが理想です)。 長くなりましたが、ここまでの条件を満たすVBAソースが知りたいです。 どうかよろしくおねがいいたします。

  • エクセルVBAについて

    前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。

  • エクセルVBAを勉強し始めたものです。多くの方にここで教えを請いながら

    エクセルVBAを勉強し始めたものです。多くの方にここで教えを請いながら日々少しづつ勉強しています。ありがとうございます。 (2) With Worksheets("sheet1").Range("A2:A" & Rows.Count) If (flag = False) Or (firstRange Is Nothing) Then Range("A2:A" & Rows.Count).Interior.ColorIndex = xlColorIndexNone (1) Set c = .Find(What:=myKey, After:=.Cells(.Count), LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns) ギモン1 上記のプログラムですが、あるプログラムの一部分です。(1)のAfter:=.Cells(.Count), はどういう意味なのでしょうか。 afterは指定したセルの次から、という意味と書いてありました。 ギモン2 =.Cells(.Count),cellsと.countの.は(2)の With Worksheets("sheet1")と関連性があるのでしょうか。 ギモン3 .Cells(.Count),どうやって次のセルを指定しているのでしょうか。 よくわからないので、教えていただけますよう、よろしくお願いします。

  • EXCELでVBAをつかったコピーの高速化

    EXCELのVBAで、A1からA1000まで乱数をセルに書き込むと8秒かかるのですが、これを高速化することが可能でしょうか? For 行番号 = 1 To 1000 Cells(行番号, 1).Value = Int((10 * Rnd) + 1) Next セルに書き込まずに、1000個の乱数を発生させると1秒もかからないので、8秒のうちのほとんどの時間は、セルへの書込み時間にとられています。 EXCELで列のコピーをした場合は、セルへの書込み時間が早いので、1000個の乱数の結果をいったんメモリに書き込み、列のコピーのように、セルにコピーができれば、高速化が可能かなと思うのですが、VBAでできるのでしょうか?よろしくお願いします。 For 行番号 = 1 To 1000 Int((10 * Rnd) + 1)をメモリに書込み Next メモリの内容をA1:A1000にコピー

  • EXCELのVBAでDcount関数がうまく動きません。

    EXCELのVBAでDcount関数を使おうとして、下記コードを作成しましたが、Dcount関数の部分が期待どおり動かず、該当なしとして、0を返してきます。 デバックで途中でマクロを止めて(Dcount関数の前)、セルに直接Dcount関数を入力すると、期待どおりの値を返してきます。 Dcount関数の記述の何が問題なのか、ご教示いただければ幸いです。 Sub 期間集計() Dim myrow, Krow As Double Dim First, Last As Date Dim i, Count As Integer Dim Data As Integer Dim Keria As String 'Worksheets("期間別").Activate Worksheets("期間別").Range("A1:BB65536").Delete Worksheets("入力").Activate With Worksheets("入力") '入力表の最終行の行数をmyrowに代入 myrow = .Range("A65536").End(xlUp).Offset(1).Row '出力前に入力データを日付順にソート .Range("A3").Sort _ Key1:=.Columns("A"), _ Header:=xlGuess First = Worksheets("集計").Range("G3") Last = Worksheets("集計").Range("H3") .Range("BH3:BH5").ClearContents .Range("BH3") = "日付" .Range("bi3") = "日付" .Range("BH4") = ">=" & First .Range("BI4") = "<=" & Last .Range(.Cells(2, 1), Cells(myrow, 47)).AdvancedFilter Action:=xlFilterCopy, _ Criteriarange:=.Range("BH3:BI4"), Copytorange:=Worksheets("期間別").Range("C11"), Unique:=False Krow = Worksheets("期間別").Range("C65536").End(xlUp).Row Keria = "C11:" & "AW" & Krow End With Worksheets("集計").Activate With Worksheets("集計") .Range(.Cells(13, 10), .Cells(24, 10)).ClearContents For i = 1 To 12 Count = 12 + i .Range(.Cells(Count, 16), .Cells(Count, 61)).Copy .Range(.Cells(11, 16), .Cells(11, 61)).PasteSpecial Paste:=xlValues .Range(.Cells(10, 16), .Cells(11, 61)).Copy With Worksheets("期間別") .Range(.Cells(11, 53), .Cells(12, 98)).PasteSpecial Paste:=xlValues Data = WorksheetFunction.DCount(.Range(Keria), .Range("C11"), .Range("BA11:CT12")) End With .Cells(Count, 10) = Data Next i End With

  • エクセルで入力済みのセルのみ見つけて・・

    エクセルで入力済みのセルだけを見つけ出して、 指定した場所に並べる作業をマクロで1発で出来るようにしたいのですが、その方法を教えてください。 シートが37シートあります。(sheetA1~sheetA12,sheetB1~sheetB12,sheetC1~sheetC12,sheet37) それぞれセルC5からC20まで数値が入っていますが、 最終行はC20とは限りません。(sheet37はまとめるためのシートで空白) C15が最終行の場合もあれば、C18が最終行の場合もあります。 各シートそれぞれ最終行が違います。(列は同じですスタートもC5です) 各シートのC列の入力済みのセルの数値をsheet37のB1セルから順番に縦に並べたいのです。 A,B,Cのシート順にC列に入力された数値を縦に並べます。 空白は無しで詰めて並べます。 これを1回の作業でできるマクロを教えてください。 それから入力済みの最終行を見つけ出すマクロの部分を表示して頂けるとありがたいです。 宜しくお願いします。

専門家に質問してみよう