ExcelVBA64bitエラー対応 | 管理人Nのブログ

管理人Nのブログ

システム開発関係者の独り言

    【事象】
    Windows10移行にて
    EXCEL VBAでODBC接続(ADODB)している場合、
    以降前:32bitWindows+32bitEXCEL+32bitODBC    正常動作

    移行後:64bitWindows+32bitEXCEL+32bitODBC    問題なし
        64bitWindows+64bitEXCEL+64bitODBC    エラー
        → ADODBのデータセットの件数を取得する場合、

             エラーが発生する。(型が一致しません)
            RecordSet.RecordCount を Long(Integer)型にいれるか、 
            Long(Integer)型を加算しようとした場合

    【原因】
    これは、32bitまたは 64bit プラットフォームの相互運用性の問題で
    参照設定で「Microsoft ActiveX Data Objects」の
    2.0 2.1 2.5 2.6 2.7 2.8 6.0 を使用している場合に発生する。


    【詳細原因】
 一部の ADO Api のプラットフォームは、 ADO 2.7以降のバージョンに依存しています。 64bit バージョンの Windows では、これらの ADO Api は、 LONGLONGのデータ型) などの 64bit データ型を使用して引数を処理します。ただし、これらの Api を使用するアプリケーションでは、まだ、 LONGデータ型を使用します。
    したがって、マクロを実行しようとするとき、「型の不一致」エラー メッセージが表示されます。

    LongLong データ型
    office 365 dev account  olprod  Office GSX
    Longlong(Longlong integer) 変数は、64ビット (8 バイト) の符号付き数値として格納されます。
    -9223372036854775808 から9223372036854775807の範囲内


    【対策】
    →参照設定で、「Microsoft ActiveX Data Objects x.x Library」からチェックをはずす。
           「Microsoft ActiveX Data Objects 6.1 Library」に変更


    【注意】
    型変換 CInt、CLng、CDbl は使用できません。
    CInt    Integer    -32,768 から 32,767。小数点以下は丸められます。
    CLng    Long    -2,147,483,648 から 2,147,483,647。小数点以下は丸められます。
    CDbl    Double    負の値の場合は -1.79769313486231E308 ~ -4.94065645841247E-324、
            正の値の場合は 4.94065645841247E-324 ~ 1.79769313486232E308。

        LongLong (64 ビットのプラットフォームの LongPtr を含む) をそれよりも
        小さい整数型に明示的に代入するには、変換関数を使用する必要があります。 
        LongLong をそれよりも小さい整数に暗黙的に変換することはできません。