VBAで超長整数型(LongLong)から長整数型(Long)への変換方法を教えてください。

信一 中嶋 60 評価のポイント
2026-03-07T22:50:09.1266667+00:00

Excel2021のVBAで超長整数型(LongLong)から長整数型(Long)への変換が上手く出来ません。

下記に示すように色々試してみましたが、対処法を教えてください。

Const Ketasuu = 200 '10進数の桁数

Const Ncnt = Ketasuu \ 8 '1億進数の桁数

'1億進数(10進数8桁)整数のデータ型

Public Type Lng

Pm As Byte                              '0:正数、1:負数

Dt(0 To Ncnt) As Long                   '1億進数の配列,Dt(0)はデータ数

End Type

'多倍長整数_積算

Private Function LngMul(x As Lng, y As Lng) As Lng

Dim a As Lng

For i% = 1 To y.Dt(0): For j% = 1 To x.Dt(0)

    b^ = x.Dt(j%) * y.Dt(i%)                                        'Long * Long -> LongLong

' c& = b^ \ 100000000^ 'c&:商 -> Long

           **↑「形が一致しません。」のエラー → c&,d&をc^,d^に変更**

' d& = b^ Mod 100000000^ 'd&:余り -> Long

    c^ = b^ \ 100000000^:   'cc& = c^

                                  **↑「形が一致しません。」のエラー → コメント化**

    d^ = b^ Mod 100000000^: 'dd& = d^

' a.Dt(i% + j%) = a.Dt(i% + j%) + c&

' a.Dt(i% + j% - 1) = a.Dt(i% + j% - 1) + d&

    a.Dt(i% + j%) = a.Dt(i% + j%) + c^

                                   **↑「形が一致しません。」のエラー → 対処法は?**

    a.Dt(i% + j% - 1) = a.Dt(i% + j% - 1) + d^

Next j%, i%

~~ 途中省略 ~~

LngMul a

End Function

開発者テクノロジ | Visual Basic for Applications

質問作成者が受け入れた回答
gekka 14,551 評価のポイント MVP ボランティア モデレーター
2026-03-08T00:01:37.5633333+00:00

データ変換関数のCLngLngやCLngを使って型変換しましょう

Option Explicit

Const Ketasuu = 200 '10進数の桁数
Const Ncnt = Ketasuu \ 8 '1億進数の桁数
Const BASE As Long = 100000000

'1億進数(10進数8桁)整数のデータ型
Public Type Lng
    Pm As Byte                              '0:正数、1:負数
    Dt(0 To Ncnt) As Long                   '1億進数の配列,Dt(0)はデータ数
End Type
    
'多倍長整数_積算
Private Function LngMul(x As Lng, y As Lng) As Lng
    Dim a As Lng
    
    Dim b As LongLong
    Dim c As LongLong
    Dim d As LongLong
    
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    
    For i% = 1 To CInt(y.Dt(0)): For j% = 1 To CInt(x.Dt(0))
        k = i% + j%
        
        b^ = CLngLng(x.Dt(j%)) * CLngLng(y.Dt(i%)) 'Long * Long -> LongLong
        c^ = b^ \ BASE:   'cc& = c^
        d^ = b^ Mod BASE: 'dd& = d^
    
        a.Dt(k - 1) = CLng(CLngLng(a.Dt(k - 1)) + d^)
        a.Dt(k) = CLng(CLngLng(a.Dt(k)) + c^)
        
    Next j%, i%
    
    a.Pm = IIf(x.Pm <> y.Pm, 1, 0)
    For i = 1 To Ncnt
        If a.Dt(i) > BASE Then
            a.Dt(i + 1) = a.Dt(i + 1) + (a.Dt(i) \ BASE)
            a.Dt(i) = a.Dt(i) Mod BASE
        End If
    Next
    For i = Ncnt To 1 Step -1
        If a.Dt(i) <> 0 Then
            a.Dt(0) = i
            Exit For
        End If
    Next
    LngMul = a
End Function

Sub test()
    Dim x As Lng
    Dim y As Lng
    Dim z As Lng
    Dim i
    
    x.Dt(0) = 10
    
    For i = 1 To 10
        x.Dt(0) = i
        y.Dt(0) = i
        x.Dt(i) = Rnd * BASE
        y.Dt(i) = Rnd * BASE
    Next
    z = LngMul(x, y)
End Sub

この回答は役に立ちましたか?

1 人がこの回答が役に立ったと思いました。

1 件の追加の回答

並べ替え方法: 最も役に立つ
  1. 信一 中嶋 60 評価のポイント
    2026-03-17T06:26:49.72+00:00

    皆様のおかげでコメントを盛り込み、漸く四則演算と整数関数が揃いましたので以下に添付しましたので参考にしてください。

    多倍長整数.bas.txt

    素数.cls.txt

    ベルヌーイ.cls.txt

    ただ、通常の素因数分解は1秒以内に完了するが、大きな素数を含む素因数分解では10秒~1分以上かかる為、高速化に向けて模索中です。コメントが有りましたら宜しくお願いいたします。

    この回答は役に立ちましたか?


お客様の回答

質問作成者は回答に "承認済み"、モデレーターは "推奨" とマークできます。これにより、ユーザーは作成者の問題が回答によって解決したことを把握できます。