• ベストアンサー

エクセルVBAで16の16乗を正確にさせるには?

エクセルVBAにて16の16乗を取り扱いたいのですが.... データ型が、LongとCurrencyでは、オーバーフローしてしまいます。 そこで、SingleとDuobleですると   Singelでは、1.844674E+19   Doubleでは、1.84467440737096E+19 になります。 これを、正確に18446744073709551616とさせる方法を教示ください。 Dim Dec_data As Double Dec_data = 16 ^ 16 MsgBox Dec_data

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

10進型なら28桁までいけるので如何でしょうか。 Dim Dec_data dt1 = 16 Dec_data = dt1 caret = 16 For i = 2 To caret Dec_data = CDec(Dec_data) * dt1 Next MsgBox Dec_data

oz_kas
質問者

お礼

ありがとうございます。 結果、良好でした。

その他の回答 (2)

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

Doubleは a * 2^nの形で記憶していて、 16^16 = 2^64なので 1.0 * 2^64 と、誤差無くDoubleの保存されています。(おそらく) ただ、そのままMsgBoxで出そうとしたので、デフォルトの文字列変換で 1.84467440737096E+19 と指数表現で表示されているだけです。 ちょっと今確認できる環境が無いのですが、Format関数で#を沢山並べたらどうでしょうか MsgBox Format(Dec_data,"#############################0")

oz_kas
質問者

お礼

ありがとうございます。 結果は、丸められて18446744073709560000でした。

回答No.1

エクセルの(VBの)表現可能な有効数字範囲を超えているので、既定のデータ型では実現できません。 いわゆる「多倍長計算」が必要になります。(計算処理を自作する必要がある) このURLの「多倍長計算 乗算編 Excelブック(2003/9作成)」が参考になるでしょう。

参考URL:
http://www.tokyo-pax.co.jp/jisaku.htm
oz_kas
質問者

お礼

ありがとうございます。 今後のこともありますんで「多倍長計算」勉強してみます

関連するQ&A

  • 単純【エクセルVBA】なぜオーバーフローになる?

    環境 Excel2003 Win7 64bit -------------- Const C as Currency = 50000000 Sub Test()   Dim A as Currency   Dim B as Currency   B = 6823695200   A = B \ C '←ここでオーバーフロー End Sub --------------- 「A = B \ C」 ↑この式はオーバーフロー時、ウォッチ式上では、 型: Integer と表示されますが、これも不思議。 また、「A = B \ C」を、 A = CCur(B) \ CCur(C) としても、オーバーフロー。 それと、 「Const C as Currency = 50000000」を、 「Const C = 50000000」 としても、同様にオーバーフロー。 Currency型は、 -922,337,203,685,477.5808~922,337,203,685,477.5807 のはず。 このオーバーフローは、一体なぜ?

  • Excel2000のVBAでわからないことがあります。

    こんなものを作ってみました。 Sub 理想体重() Dim Sin As Long Dim Tai As Long Sin = InputBox("あなたの体重は?", "体重") Tai = InputBox("あなたの身長は?", "身長") If Tai >= Sin * Sin * 21 / 10000 + 3 Then MsgBox "太りすぎです" ElseIf Tai <= Sin * Sin * 21 / 10000 - 3 Then MsgBox ("痩せすぎです") Else MsgBox ("標準です") End If End Sub 結果はきちんと出てくるのですが、最初の変数宣言のところがわかりません。 最初は、Longではなく、Integerにしたのですが、オーバーフローのエラーが出たので、Longに変更したところ、きちんと出てくるようになりました。 しかし、なぜ、Integerではだめなのかがわかりません。私としては、Integerは32,767までの数字が入るのだから、身長や体重を入れたぐらいだと、オーバーフローにはならないのではないかと考えています。 きっと、根本的なものがわかっていないんだとは思うのですが、違いを教えていただければうれしいです。 よろしくお願いいたします。 (VBAを勉強したばかりです。)

  • EXCEL VBAで初歩の質問ですが。

    初歩的な質問ですが教えて下さい。 Dim B As Single と Dim B As Double 。 SingleとDoubleの使い分けを教えて下さい。 どういう場合にどちらを使うかわかりません。 すいませんが、お願い致します。

  • 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

  • VBAのsingle,doubleのデータ型のE+,E-

    VBAのデータ型longやsingleの E+やE-は何を表しているのでしょうか? 単精度浮動小数点型 3.4028235E+38~などです。 また、single doubleはそれぞれ-3.4028~、-1.797~ などと書いてありますが、1万台で小数点以下の数値がある値、たとえば17,562.256はどのデータ型を使えばよいのでしょうか?

  • VBAで計算した結果がデータ型により相違してしまいます。VBAに詳しい

    VBAで計算した結果がデータ型により相違してしまいます。VBAに詳しい方、理由を教えてください。よろしくお願いします。 Dim 税率 As Single Dim 売上 As Double 単価=Range("b5").Value:個数=Range("d5").value:税率=Range("f5").Value 売上=(1+税率)*単価*個数 (1)単価=30000、個数=15、税率=0.05と入力すると売上の数値=472500.000335276となります。 (2)売上のデータ型をsingleにした場合は、売上=472500となります。 (3)売上のデータ型Single、税率のデータ型をDoubleとした場合も売上=472500となります。 (1)の結果の小数点以下の数値の意味がわかりません。 よろしくお願いいたします。

  • excelのVBAでアドバイスお願いします

    excel2000を利用しています。 ■状況 ・「実験フォルダ」という名前のフォルダがあります ・「実験フォルダ」の中に「差し込み表示.xls」という名前のファイルがあります ・「実験フォルダ」の中に「実験データ.xls」という名前のファイルがあります。 ■やりたいこと ・「実験データ.xls」のファイルデータを参照して、「差し込み表示.xls」のファイルにデータを表示させたい。 ・検索するキーは日付(「実験データはB列、差し込み表示はE5セル」です。 ■状況 自分で作ったコードだと値がみつかりません、となって、うまくデータを転記して表示してくれません。 ■お願いしたいこと コードの修正アドバイス、もしくは、他にもっといいプログラムがあるなどのアドバイスがあればいただけるとありがたいです。 ■うまくいかないコード Option Explicit Sub datatyuusyutu() On Error Resume Next Const sashikomiDisplay As String = "差し込み表示.xls" Const dataFile As String = "実験データ.xls" Dim i As Long Dim j As Long Dim k As Long Dim objectionrow As Long Dim lastRow As Long Dim targetDate As String Dim targetTime As String Dim data(1 To 43) As Double Dim dataFindFlag As Boolean Dim 対象フォルダ As String '検索する年月日を取得 targetDate = Range("E5").Value MsgBox targetDate 対象フォルダ = ThisWorkbook.Path & "\" Workbooks.Open 対象フォルダ & dataFile lastRow = Cells(Rows.Count, "B").End(xlUp).Row 'B列の最終行を得る MsgBox lastRow '年月日で検索 For i = 2 To lastRow If Cells(i, 2) = targetDate Then Cells(i, 2).Select dataFindFlag = True For k = 1 To 43 data(k) = Cells(i - 1, k) Next k Exit For End If Exit For Next i Windows(sashikomiDisplay).Activate With Workbooks("実験データ.xls") If dataFindFlag = True Then Cells(1, 2) = data(1) Cells(12, 3) = data(4) Cells(14, 6) = data(5) MsgBox "実行しました" Else MsgBox "データがありません" End If End With Workbooks(dataFile).Close savechanges:=False End Sub

  • エクセルVBAで2つの画像を比較したい

    こんにちは。VBAの初心者です。 エクセル2003のVBAを使って、シートに読み込んだ縦横24ピクセルの2つの画像(picA、picB)を比較したいと考えています。VBなどのページを参考に、APIのGetPixel関数を使えばなんとかなりそうだというところまではたどり着いて、以下のコードを組んでみたのですが、うまく動きません。 Private Declare Function GetPixel Lib "gdi32" _ (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Sub CommandButton1_Click() Dim picA As Image Dim picB As Image Dim p1 As Integer Dim p2 As Integer Dim ScreenhDC As Long For x = 1 To 24 For y = 1 To 24 p1 = picA.GetPixel(ScreenhDC, x, y) p2 = picB.GetPixel(ScreenhDC, x, y) If p1 <> p2 Then MsgBox "違う画像です" Exit Sub End If Next Next MsgBox "同じ画像です" End Sub 「p1 = picA.GetPixel(ScreenhDC, x, y)」のところで「実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。」というメッセージが出て止まってしまいます。解決法をご教示いただけませんでしょうか。 そもそもエクセルのVBAではAPIは使えないなどということはありますか?

  • VBA Functionについて

    アクセスです。 サンプルコードを見ていてよくわからないので教えてください。 サンプルコードはこちらです↓ ------------------------------------------- Public Function kakaku(cost As Currency, rate As Double) As Currency kakaku = cost / (1 + rate) End Function Sub M0108() Dim Zeikomi As Currency Dim Zeiritu As Double Zeikomi = InputBox("内税の価格を入力してください。") Zeiritu = InputBox("税率を入力してください。") MsgBox (kakaku(Zeikomi, Zeiritu) & "円") End Sub ------------------------------------------- M0108を実行してみたら納得いく結果になったので問題ないのですが kakaku関数についてよくわかりません。 cost / (1 + rate) とはどういう意味なのでしょうか? costもrateも値が代入されていませんが、 この二つの変数は何の意味があるのでしょうか? ご教授よろしくお願いします。

  • VBAでln関数の計算

    VBAでln関数から以下のようなプログラムを組みましたが、 オーバーフローします。どこが原因でしょうか? 初心者なので初歩的なところで間違えていると思います。 Sub log関数() Dim i As Double Dim t As Double i = 2 Do i = i + 1 t = Log(i) Loop While (t > 10) MsgBox (i & "はin(x)が最初に10を超える数字です") End Sub 値として最初の数字の3でとまってしまいます。 ぜひとも間違いご指摘ください。