読者です 読者をやめる 読者になる 読者になる

株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

Access2003で作られたmdbファイルをAccess2016で動かしたときの不具合について

こんにちは。sanamekoです。

最近、Access2003で作られたmdbファイルをAccess2016で動かすことがあったのですが、不具合が起こってしまったので、備忘を兼ねて書きたいと思います。

ケース1:DoCmd.TransferSpreadsheetメソッドでSpreadsheetTypeの引数を省略したとき

○場面

DoCmd.TransferSpreadsheet メソッドを使い、テーブルをExcel形式でエクスポートします。
SpreadsheetType引数は省略しています。(acExportの次の引数ですね)

DoCmd.TransferSpreadsheet acExport, , "T_きのこ", "C:\DATA\きのこ.xls", True

○Access2003で動かしたとき(正常)

C:\DATA配下に、「きのこ.xls」が出力され、正常に開くことができました。

f:id:aimstogeek:20160711201117j:plain

○Access2016で動かしたとき(エラー)

こちらも同様に、C:\DATA配下に、「きのこ.xls」が出力されました。
しかし、開いてみると・・・

f:id:aimstogeek:20160711201121j:plain

拡張子が違うよーと怒られてしまいました。
(警告は出ますが、「はい」を押すとファイルを開くことはできます)

○対処法

Access2003では、この引数のデフォルト値は【acSpreadsheetTypeExcel97】ですが、
Access2016では【acSpreadsheetTypeExcel12Xml】になるようなので、
.xlsの拡張子と合わないよってことらしいです。

ちゃんと引数を設定してあげるか、出力ファイルの拡張子を.xlsxに変えてあげれば、エラーは出なくなります。

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, "T_きのこ", "C:\DATA\きのこ.xls", True
DoCmd.TransferSpreadsheet acExport, , "T_きのこ", "C:\DATA\きのこ.xlsx", True

ケース2:Environ関数をクエリ内で使用したとき

○場面

クエリ内でEnviron関数を用いて、ユーザ名を取得します。

f:id:aimstogeek:20160711201125j:plain

○Access2003で動かしたとき(正常)

クエリは正常に実行され、ユーザ名が取得できました。
f:id:aimstogeek:20160711201823j:plain

○Access2016で動かしたとき(エラー)

クエリ実行時、エラーが出てしまいました。
f:id:aimstogeek:20160711201135j:plain

○対処法

Microsoftのサポートページで、Environ関数について、下記の記述がありました。

サンドボックス モードでエラーになる関数

次の Visual Basic for Applications (VBA) 関数は、Access データベース エンジン クエリの式または Access のプロパティから呼び出すとエラーになります。

Access2007から、サンドボックスというセキュリティ機能がつけられ、Environ関数もこれに含まれているようです。

解消するには、レジストリをいじって、サンドボックスモードを無効にすればよいらしいのですが、
社内ポリシー的に、特定のメンバーのレジストリを変更することに抵抗があったため、別の方法で暫定対応しました。

クエリ内ではNGのようですが、VBAコードで書けばOKということなので、取り急ぎ、ユーザ関数を定義して、エラーを回避しました。

Public Function GetUsername() As String
    GetUsername = Environ("Username")
End Function

クエリ内で、定義したGetUsername関数を呼び出します。

f:id:aimstogeek:20160711201138j:plain

これで動くようになりました。

f:id:aimstogeek:20160711201831j:plain


なんだかまだまだ不具合が眠ってそうなので、見つけたら随時追記していきたいと思います!