こんにちは。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」が出力され、正常に開くことができました。
○Access2016で動かしたとき(エラー)
こちらも同様に、C:\DATA配下に、「きのこ.xls」が出力されました。
しかし、開いてみると・・・
拡張子が違うよーと怒られてしまいました。
(警告は出ますが、「はい」を押すとファイルを開くことはできます)
○対処法
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関数を用いて、ユーザ名を取得します。
○Access2003で動かしたとき(正常)
クエリは正常に実行され、ユーザ名が取得できました。
○Access2016で動かしたとき(エラー)
クエリ実行時、エラーが出てしまいました。
○対処法
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関数を呼び出します。
これで動くようになりました。
なんだかまだまだ不具合が眠ってそうなので、見つけたら随時追記していきたいと思います!
\\『明日のはたらくを創る』仲間を募集中!! //
中途採用ページには記載がないですが、データエンジニアも大大大募集してます!!Access使える方大歓迎!!
919.jp