旧バージョンのAccessを64ビット版のWindows 7+Access 2010で開いたところAPIでエラーが発生しました。理由は64ビット版であること。その原因と対策方法を下記に明記しておきます。
最近はPHPの開発以外にMicrosoft社のAccessを使ったソフトの開発も時々やっています。もっとも、もともとはAccessやなんですけどね(^^ゞ。Accessの開発時はVirtual PCで素のOSにAccessもしくはOfficeを入れたシンプルな環境で開発を行います。それら開発は旧バージョンのAccess 2000だったりAccess 2007だったりと様々です。
先日、Access 2002で作ったファイルをホストOSであるWindows 7に入れたAccess 2010で開いてみました。うまく動くか気にはなっていたのですが、なかなかテストする機会がありませんでした。MDBファイルをコピーしてダブルクリックで起動。すると、半分予想していた通り下記のようなエラーが発生しました。

Access起動時に発生したエラー
—————————
Microsoft Visual Basic for Applications
—————————
次の非表示モジュール内でコンパイル エラーが発生しました: module1
このエラーが発生するのは、一般的に、コードがこのアプリケーションのバージョン、プラットフォーム、またはアーキテクチャと互換性がない場合です。このエラーを修正する方法については、[ヘルプ] をクリックしてください。
—————————
OK ヘルプ
—————————
ここで書かれている「module1」はモジュール名です。あまり見たことのないエラーなのですが
「どこでエラーが発生したのかな~♪」
と、のんきに調べてみたところ、Win32 APIのソースコードでエラーが発生していました。エラーが発生したソースは下記の部分です。
Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer
この部分のソースはほかの環境では問題なく動いていましたが、Windows7のAccess2010だと動きません。さっそくGoogle先生に聞いてみたところすぐに答えはわかりました。原因はWindows7が64ビット環境だったせいです。
Win32は見ての通り32ビット用のものです。そして、今回動かしたのは64ビットです。ここで引っかかりました。細かいことはリンク先を読んでいただくこととして64ビット版でDeclareステートメントをそのまま使うとNGとのこと。そこで、下記のように「PtrSafe」を加えるととOKとなります。
Declare PtrSafe Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer
ただ、ファイルを移動するたびにソースコードを変更するのはちょっと面倒です。そこで「#If~#Else~#End If」の条件付きコンパイルを使います。書き方は下記のとおりです。
#If VBA7 And Win64 Then
'64ビット版
Declare PtrSafe Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer
#Else
'32ビット版
Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer
#End If
このソースを32ビット版で書くと「PtrSafe」で
「そんなの知しらねぇよ~」
と怒られますが、コンパイルは通ります。あまりスマートな書き方ではありませんが、知っておくと何かと便利です。
Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性
Office 2007/2010・リボンのカスタマイズ 初心者備忘録
コメント