• ベストアンサー

VBAでLong型同士の乗算について

すいません。タイトルの件で Long型同士での乗算なのですが... 以下のマクロがどうしてもオーバーフローになってしまいます。 (SLはLong、Double、Variantにしてみましたが全てオーバーフロー・・) すいませんが御教授お願いします。 (普段からあまりデータ型をあまり意識してないのがバレバレですね(>_<) Option Explicit Sub Macro1() Dim AL As Long Dim BL As Long Dim SL As Variant AL = 65535 BL = 65535 Cells(1, 1) = AL Cells(1, 2) = BL SL = CVar(AL * BL) Cells(1, 3) = SL End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >SL = CVar(AL * BL) Long型同士で計算して、代入値のSLの精度自体をあげることは出来ないと思います。Long型の精度の上には、Currency やDouble型がありますから、以下では、Double型を使ってやってみました。 だから、もし、計算するのなら、計算値の値の型の精度を上げるか、最初の宣言で、精度を上げておかなくてはなりませんね。 たとえば、以下のようにします。 以下の方法を「型の昇格」と呼びます。 SL = AL * CDbl(BL) '片方の型の精度を上げて計算すると、計算結果の精度が上がる もしくは、型の宣言を最初からあげておくことなのです。 Dim AL As Double Dim BL As Double Dim SL As Double

koro_koro_koro
質問者

お礼

ありがとうございました。Wendy02さんには最近よくアドバイスを してもらい感謝の限りです。

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

その他の回答 (3)

  • Bickyon
  • ベストアンサー率41% (42/101)
回答No.4

#1です。先ほどはごめんなさい。 ALとBLもVariantで宣言したらうまく動作しました。

koro_koro_koro
質問者

お礼

いろいろ試してまでくださり、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Bickyon
  • ベストアンサー率41% (42/101)
回答No.3

#1です。 ごめんなさい。誤答でした。

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

バリアント型の変数に代入したいのであれば無視してください。 CVarを止めれば良いと思いますが... SLはLong型で宣言すれば良いと思います。

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

関連するQ&A

  • 『エクセル』 vbaでオートフィルができない

    Sub Macro1() Range("a1:a10").Select Selection.AutoFill Destination:=Range("A1:A10"), Type:=xlFillSeries End Sub がエラーになります。 内容は「RangeクラスのAotofillメソッドが失敗しました」 となります。 Sub Macro2() Dim i As Long For i = 1 To 10 Cells(i, 1) = i Next End Sub や Sub Macro3() Dim i As Long i = 1 While i <= 10 Cells(i, 1) = i i = i + 1 Wend End Sub と同じような動きをAutoFillを使ってVBAで行いたいのですが むりでしょうか? というのも、 A1に長い関数式を入れて A10000までオートフィルしたいのですが 手作業だと時間がかかるためマクロで行いたいです。 アドバイス宜しくお願い致します。

  • マクロを変数を使って実行する場合のVBAの書き方について教えてください。

    抽出条件によりデータベースから読込んだマクロが SYORI_001の場合 Dim Macro_Name As String Dim val As Variant Macro_Name = Rst.Fields("Macro_Name").Value Macro_Name = "Call " & Macro_Name val = Macro_Name これだとコンパイル エラー: Sub、 Function、またはPropertyが必要です。となってしまいます。 echo文のように単純に、echo "Call SYORI_001" としたいのですが VBAで書くにはどうしたら良いのでしょうか? どうぞよろしくお願いします。

  • VBA 100億になると#が自動で付く

    下記のコードを見てください。 Option Explicit Sub test1() Dim i As Long i = 1000000000 End Sub Sub test2() Dim i As Long i = 10000000000# End Sub test2の#は私が付けたものではありません。 test1より一つ多く0を付けたら勝手に付きました。 どうしてなのでしょう? 不思議です。

  • VBA「型が一致しません」とエラーが出ます

    下記記事の関連質問です。 Excel 文字列抜き出しについて https://okwave.jp/qa/q9979633.html 記事を参考に複数行にマッチするように下記のようにコードを考えましたが msplit(mRng, " ", iii)で「型が一致しません」とエラーが出ます。 なぜでしょうか? テスト用のA4セル 1 01 45124422 ミント 09/01~03/01 108 98 01/05~02/01 Option Explicit Sub test() Dim msplit As Variant Dim buf As String, i As Long, ii As Long, iii As Long, cnt As Long Dim mRng As Range For ii = 4 To Cells(Rows.Count, 1).End(xlUp).Row buf = Cells(ii, "A") For i = 1 To Len(Cells(ii, "A")) If Mid(buf, i, 1) = " " Then cnt = cnt + 1 Next For iii = 1 To cnt Set mRng = Cells(ii, "A") ’Stop Cells(iii + 1, ii) = msplit(mRng, " ", iii) Next Next Set mRng = Nothing End Sub Function msplit(ByRef mRng As Range, ByVal Spstr As String, ByVal num As Long) As Variant msplit = Split(mRng, Spstr)(num - 1) End Function

  • vbaでオーバーフローしてしまいました。

    Dim i As Long Dim k As Long For i = 1 To 829 For k = 1 To 995 Worksheets("2").Cells(k,i) = Worksheets("1").Cells(k,i) /Worksheets("1").Cells(996,i) Next k Next i これを実行したらオーバーフローしてしまい、途中までしか計算できませんでした。 解決方法を教えて頂きたいです。よろしくお願いします。

  • EXCEL VBAで Arrayの使い方が判りません

    あらかじめ、セル上にシート名を入れておき、 Arrayでシートを指定したいのですが、 うまく行きません 内容 Sub Macro2()    'Cells(2, 2) に 「"Sheet1","Sheet3","Sheet6"」   と入力されています   Dim hani As String   Dim hani2 As Variant   hani = Cells(2, 2)    hani2 = Array(hani) '下記がエラーになります   Sheets(hani2).Select   Sheets(hani2).Copy '以下略 End Sub 1)セル上にあらかじめ、配列の中身を入力しておく 2)その値を取得後、arrayでシートを指定する この2件はどうしても避けられないのです

  • EXCEL2010エラーVBA

    下記を実行するとエラーになりEXCEL2010が終了してしまいます。 fDebug:0 offset00009391 がエラーメッセージです。 何が原因でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Dim rg As Range Dim r As Variant Dim c As Long Dim hanni1 As Range Dim atai As Range Set ws = Worksheets("あああ") Set rg = Worksheets("コード").Range("A1:B10") r = ws.Cells(Rows.Count, 1).End(xlUp).Row Set hanni1 = ws.Range(Cells(2, 2), Cells(r, 3)) Set atai = ws.Range(Cells(2, 3), Cells(r, 3)) atai = Application.VLookup(hanni1, rg, 2, False) End Sub

  • VBA どこでもセル選択

    教えて頂いたVBAなのですがもう一つ Sub Macro1() Dim Ws01 As Worksheet Dim Counter As Long, i As Long, j As Long Dim INP As String Set wS = Worksheets("Sheet4") wS.Cells.ClearContents For i = 3 To ActiveSheet.UsedRange.Rows.Count INP = "" For j = Selection(1).Column To Selection(Selection.Count).Column If Cells(i, j) = 1 Then INP = INP & Cells(2, j) & "," End If Next j Counter = Counter + 1 If INP <> "" Then wS.Cells(Counter, "A") = Left(INP, Len(INP) - 1) End If Next i End Sub -------------------------------------------------------------- For i = 3 のところを3としないでどのセル(行)にも対応させたいのですが どうすればいいでしょうか?

  • VBA RemoveDuplicatesが動かない

    以下のマクロを実行しても動きません。 RemoveDuplicatesの行でエラーとなります。 メッセージ:アプリケーション定義またはオブジェクト定義のエラーです。 何が間違ってるのでしょう? エクセル2013 Windows8 E列の重複を削除するマクロです。不要なWithを使っているのは、別マクロから切り出したものだからです。 Sub test() Dim Colref As Long, LastRow As Long With Worksheets("Sheet1") Colref = 5 LastRow = Cells(Rows.Count, Colref).End(xlUp).Row Range(.Cells(1, Colref), .Cells(LastRow, Colref)).RemoveDuplicates Columns:=CVar(Colref), Header:=xlNo End With End Sub

  • エクセル2003 別シートの項目を集計したいVBA

    仕事でエクセル2003を使っています。 超初心者なので、うまく説明ができませんがお許しください。 Sheet1に、印刷シートとして「名前」「フリガナ」「住所」「電話番号」「性別」などのデータを入力しています。 これを1回ずつデータを入力して印刷をしています。 印刷をするときに、入力したデータをリストにするためにSheet2へコピーするというマクロを作りました。 ↓こんな風に作ってみました。 Sub 正方形長方形2_Click() Call macro01 Call macro02 End Sub Sub macro01() Dim ws1 As Worksheet, ws2 As Worksheet Dim x As Long, y As Long Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet3") x = ws2.Cells(Rows.Count, "b").End(xlUp).Row + 1 y = ws1.Cells(Rows.Count, "b").End(xlUp).Row ws1.Cells(21, "g").Resize(y, 9).Copy ws2.Cells(x, "b").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub Sub macro02() Worksheets("Sheet1").PrintOut End Sub ここから本題なのですが… ふと、リストの件数をSheet1に出せないものか?と思ったのです。 マクロを実行することで、Sheet2にデータが増えてその増えたデータの項目の合計件数をSheet1に反映させて印刷する。 「別シートの項目を集計する」で検索してみたのですが、私には難しすぎて理解できずいろんな方の回答をもアレンジできません。 なにとぞ、ご教授いただきますようお願いします。

専門家に質問してみよう