none
Office365の64bit版とOffice2010の32bit版について RRS feed

  • 質問

  • お世話になっております。

    現在、Office2010の32bit版がPCに入っていて、Office365の64bit版を導入しようと考えております。

    ExcelのマクロやAccessのマクロなどがたくさんある中で、両エディションの非互換を調査したいと考えております。

    何か参考になるドキュメントなどはございますでしょうか。

    何卒よろしくお願いいたします。

    2019年8月1日 23:57

回答

  • 2010 時点で、「32bit/64bit 両対応」のコードを書いていたかどうかが肝ですね。
    32bit 前提としていた場合は、すべての Declare ステートメントを修正する必要があります。

    もう一つは、現在使用している「参照設定」「コンポーネント」「ODBC ドライバー」等の外部ライブラリの 64bit 対応状況の個別調査。

    ODBC Drivier や OLE DB Provider は、32bit/64bit とで別のものが必要になることがありますので、外部データベースとの連携がある場合、ミドルウェアの見直しや追加購入が必要になるかもしれません(Oracle データベース接続に使われる oo4o は 64bit 版が無いので ODBC 接続に変更するなど)

    • 回答としてマーク oousruja 2019年8月2日 7:20
    2019年8月2日 1:29
  • お世話になっております。

    現在、Office2010の32bit版がPCに入っていて、Office365の64bit版を導入しようと考えております。

    ExcelのマクロやAccessのマクロなどがたくさんある中で、両エディションの非互換を調査したいと考えております。

    何か参考になるドキュメントなどはございますでしょうか。

    何卒よろしくお願いいたします。

    ほかはわかりませんが、Excel 2010 以前と Excel 2013 以降では使用が大きく
    変更されているので、どんな機能を使っているかにもよりますが一朝一夕には
    困難かもしれません。

    たとえば、ウィンドウの管理方法が Multiple Document Interface (SDI) から
    Single Document Interface (SDI) になっています。

    むしろ、旧バージョンに戻る予定がないのであればいっそのこと作り直したほうが
    早い可能性もあります。

    なお、WinAPI の定義はこのファイルを DL して参考にしてください。
    すべてではありませんが多くの定義が記述されています。
    また、2007 以前の互換性を考慮しないのであれば大半は 32bit と 64 bit の
    切り分けも不要ですが一部の関数は 32bit と 64bit で別の関数を使わないと
    いけないので注意してください。

    たとえば、SetWindowLongA は 64bit では SetWindowLongPtrA
    GetWindowLongA は 64bit では GetWindowLongPtrA を使わないと
    いけないので以下のように定義します。

    #If Win64 Then
        ' 64 bit 版
        ' SetWindowLongPtr: ウィンドウの設定を変更する
        Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        ' GetWindowLongPtr: ウィンドウの設定を取得する
        Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    #Else
        ' 32 bit 版
        ' SetWindowLongPtr: ウィンドウの設定を変更する
        Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        ' GetWindowLongPtr: ウィンドウの設定を取得する
        Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    #End If

    • 編集済み infade 2019年8月2日 6:55 リンク先間違いの修正
    • 回答としてマーク oousruja 2019年8月2日 7:20
    2019年8月2日 6:54

すべての返信

  • 2010 時点で、「32bit/64bit 両対応」のコードを書いていたかどうかが肝ですね。
    32bit 前提としていた場合は、すべての Declare ステートメントを修正する必要があります。

    もう一つは、現在使用している「参照設定」「コンポーネント」「ODBC ドライバー」等の外部ライブラリの 64bit 対応状況の個別調査。

    ODBC Drivier や OLE DB Provider は、32bit/64bit とで別のものが必要になることがありますので、外部データベースとの連携がある場合、ミドルウェアの見直しや追加購入が必要になるかもしれません(Oracle データベース接続に使われる oo4o は 64bit 版が無いので ODBC 接続に変更するなど)

    • 回答としてマーク oousruja 2019年8月2日 7:20
    2019年8月2日 1:29
  • お世話になっております。

    現在、Office2010の32bit版がPCに入っていて、Office365の64bit版を導入しようと考えております。

    ExcelのマクロやAccessのマクロなどがたくさんある中で、両エディションの非互換を調査したいと考えております。

    何か参考になるドキュメントなどはございますでしょうか。

    何卒よろしくお願いいたします。

    ほかはわかりませんが、Excel 2010 以前と Excel 2013 以降では使用が大きく
    変更されているので、どんな機能を使っているかにもよりますが一朝一夕には
    困難かもしれません。

    たとえば、ウィンドウの管理方法が Multiple Document Interface (SDI) から
    Single Document Interface (SDI) になっています。

    むしろ、旧バージョンに戻る予定がないのであればいっそのこと作り直したほうが
    早い可能性もあります。

    なお、WinAPI の定義はこのファイルを DL して参考にしてください。
    すべてではありませんが多くの定義が記述されています。
    また、2007 以前の互換性を考慮しないのであれば大半は 32bit と 64 bit の
    切り分けも不要ですが一部の関数は 32bit と 64bit で別の関数を使わないと
    いけないので注意してください。

    たとえば、SetWindowLongA は 64bit では SetWindowLongPtrA
    GetWindowLongA は 64bit では GetWindowLongPtrA を使わないと
    いけないので以下のように定義します。

    #If Win64 Then
        ' 64 bit 版
        ' SetWindowLongPtr: ウィンドウの設定を変更する
        Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        ' GetWindowLongPtr: ウィンドウの設定を取得する
        Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    #Else
        ' 32 bit 版
        ' SetWindowLongPtr: ウィンドウの設定を変更する
        Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        ' GetWindowLongPtr: ウィンドウの設定を取得する
        Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
    #End If

    • 編集済み infade 2019年8月2日 6:55 リンク先間違いの修正
    • 回答としてマーク oousruja 2019年8月2日 7:20
    2019年8月2日 6:54
  • お世話になっております。

    ご回答ありがとうございます。

    やはりDeclareステートメントを修正する必要があるのですね。

    Oracle接続についてもありがとうございます。

    2019年8月2日 7:22
  • お世話になっております。

    ご回答ありがとうございます。

    なんと・・・作り直しも視野にして検討したいと思います。

    2019年8月2日 7:23
  • ActiveX コントロールを使っている場合、64bit 対応版が存在するかどうかを確認しないといけませんね。最近だと下記の投稿がありました。

     

    また、API 宣言を複数の環境に対応させたい場合、殆どの場合は #If VBA7 Then による切り替えが必要になります。ただし SetWindowLongPtr の場合 のように、Win64 と VBA7 を併用した三段階の切り替えが必要になることもあります。(Any を使うなど、LongPtr であることに拘らないなら、Win64 だけでの二段階の切り替えでも可)

    #If VBA7 Then
        #If Win64 Then
            Private Declare PtrSafe Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongPtrW" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #Else
            Private Declare         Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongW"    (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
        #End If
    #Else
            Private Declare         Function SetWindowLongPtr Lib "USER32" Alias "SetWindowLongW"    (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
    #End If

    2019年8月2日 8:02
  • ActiveX コントロールを使っている場合、64bit 対応版が存在するかどうかを確認しないといけませんね。最近だと下記の投稿がありました。

    また、API 宣言を複数の環境に対応させたい場合、殆どの場合は #If VBA7 Then による切り替えが必要になります。ただし SetWindowLongPtr の場合 のように、Win64 と VBA7 を併用した三段階の切り替えが必要になることもあります。(Any を使うなど、LongPtr であることに拘らないなら、Win64 だけでの二段階の切り替えでも可)

    VBA で 32bit と 64bit の移行時対策でよく VBA7 というプリプロセッサ定数が
    使われていますが実際には VBA のバージョンが 7.0 未満 (Office 2007 以前) か
    7.0 以降 (Office 2010 以降) かを調べるのに使われる定数であり、使っている
    Office が 2010 以降であり、2007 以前の使用を想定しないのであれば不要です。
    現在サポートが既にない 2007 以前の対応はほぼ需要がないと考えられ、
    無意味に近いのでなくてもいいと思います。
    (LongPtr / LongLong 型と PtrSafe は 64bit 環境向けのキーワードであり、
    64bit 版がある 2010 以降でのみ使えるため、2007 以前に対応をする必要が
    ある場合のみ使う)

    LongPtr 型は VBA の環境が 32bit の場合は Long 型 (32bit 整数) と等価で、
    64bit の場合は LongLong 型 (64bit 整数) と等価です。
    32bit の環境下では LongLong 型は使えないので型宣言時に使ったり
    CLngLng での型変換などを行おうとするとエラーになります。
    一方で、64 bit の環境下では Declare に PtrSafe がないとエラーになりますが、
    32bit の環境下で PtrSafe がついていても問題なく、LongPtr 型は環境によって
    Long / LongLong 型に自動変換されるので、32bit 版と 64bit 版で型が異なる
    関数でも LongPtr を使えば通常は Win64 プリプロセッサ定数による切り分けも
    不要です。

    上記のように一部の関数は bit によって使える関数が異なるのでそういうのだけ
    切り分けます。


    • 編集済み infade 2019年8月2日 11:25 文の微追記・修正
    2019年8月2日 11:06