Access

 旧バージョンの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起動時に発生したエラー

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・リボンのカスタマイズ 初心者備忘録

MICROSOFT ACCESS 2010 基礎 セミナーテキスト (セミナーテキストシリーズ)

著者/訳者:日経BP社

出版社:日経BP社( 2010-07-02 )

定価:

Amazon価格:¥ 1,600

単行本 ( 232 ページ )

ISBN-10 : 482229305X

ISBN-13 : 9784822293055