問題について掲載されているサイト
Office 2016 バージョン 1708 以降で日本語の VBA モジュール名を含むファイルを開くとエラー
質問が出ているサイト
エラー『VBA プロジェクトを読み取れないため、データベースを開くことができません。』
上記サイトののMS の更新のおしらせ
2017/9/28 Update
現象発生条件の補足と、暫定対応でご案内している Office を以前のバージョンに戻す手順を、今回の問題向けにより簡略化したものを追記しました。また、本問題の修正に向けた作業に着手していますので、状況を更新しました。
2017/9/29 Update
Access のエラーメッセージの情報を追記しました。また、情報が多くなったため、記事構成を全体的に変更しました。
- 現象
Office 2016 クイック実行形式向けの更新 バージョン 1708 (16.0.8431.xxxx) において、モジュール名やフォーム名に日本語が設定された Office のマクロ付きファイルを開こうとすると、以下のようなメッセージが表示され、正常に開くことができません。
Excel 2016
例1:
'ファイル名' の一部の内容に問題が見つかりました。可能な限り内容を回復しますか?
ブックの開発元が信頼できる場合は、[はい] をクリックしてください。
例2:
このブック内の Visual Basic for Applications (VBA) マクロは破損しており、削除されました。
マクロの破損は現在のファイルに存在する可能性があります。
マクロを回復するには このファイルのバックアップ コピーを開いてください (バックアップ コピーがある場合) 。
Access 2016
例3 :
データベースに含まれている VBA プロジェクトを読み取れないため、データベースを開くことができません。データベースを開くには、VBA プロジェクトを削除する必要があります。VBA プロジェクトを削除すると、モジュール、フォーム、およびレポートからすべてのコードが削除されます。データベースを開いて、VBA プロジェクトを削除する前に、バックアップ コピーを作成することをお勧めします。
データベースのバックアップ コピーを作成する場合は、[キャンセル] をクリックしてください。バックアップ コピーを作成しないでデータベースを開き、VBA プロジェクトを削除する場合は、[OK] をクリックしてください。
反応
モジュール名、フォーム名の日本語表記を英語表記にしたら復活しました。https://t.co/IDXfVcAQy7 https://t.co/o8wY4YaPb6
— タカハシノリアキVBA本発売中! (@ntakahashi0505) 2017年9月29日
「今朝からMSアクセスのフォームが正しく表示されない」てな不具合対応る。Officeのバグでマクロやらの日本語対応でやらかしぽい。レシピ通りのOfficeのVer巻き戻しで対応る。https://t.co/aDZjnKMzG9
— ぽげ田さん (@pogemuta) 2017年9月29日
!週明け混乱注意!
— みき (@miki_x_jrc) 2017年9月24日
AccessVBAにて日本語使ってる場合、エラーでYesしたらご臨終確定します
Office2016 Ver1708 以降で日本語のVBAモジュール名を含むファイルを開くとエラー https://t.co/1vfxiu8Z5e
詳細
2017/9/20 Update
この問題は、VBA モジュールの問題によって生じるため、***VBA を作成できるすべての Office アプリケーション (Excel / Word / PowerPoint / Access / Publisher / Project / Visio / Outlook) で問題が生じます。***アプリケーションによって、VBA モジュールのエラーハンドリングが異なるため、詳細な動作は異なりますが、いずれも、日本語のモジュール名、ユーザーフォーム名を含む VBAProject を読み込むことができず、マクロを実行できません。その他、以下のような現象が発生します。
ファイルのオープン時や、Visual Basic Editor の起動時にエラーメッセージが表示されます
***ファイルを保存すると、VBAProject が削除されます (上書き保存を行わないようご注意ください)***
Word については、日本語のモジュール名を含む VBAProject が含まれている場合、ファイルを上書き保存することができません
Publisher については、日本語のモジュール名を含む VBAProject が含まれている場合、ファイルを開くことができません
2017/9/28 Update
補足) 本現象は、厳密には、モジュール名やフォーム名の末尾が日本語 (をはじめとする DBCS 文字) の場合に発生します。このため、例えば「フォーム1」(1 は半角数字) のように末尾が半角の場合には、名前に日本語を含んでいても現象は発生しません。
当方での発生状況
以下のコードでaccdbを開いたところ「サンプル」という日本語モジュールがひっかかり、エラーが出るようになった。以後、データベースを開くごとにエラーが出てしまう。
Option Explicit
' http://techbank.jp/Community/blogs/mymio/archive/2009/01/22/4480.aspxを改良(?)
' --------------------------------------------------------------------------------
' 定数
' --------------------------------------------------------------------------------
Dim vbext_ct_ClassModule, vbext_ct_Document, vbext_ct_MSForm, vbext_ct_StdModule
vbext_ct_ClassModule = 2
vbext_ct_Document = 100
vbext_ct_MSForm = 3
vbext_ct_StdModule = 1
' --------------------------------------------------------------------------------
' 変数宣言
' --------------------------------------------------------------------------------
Dim inFileName, fs, inFile, outPath, outFolder
Dim accessObj, vbproject, vbcComp, ext, moduleName
' --------------------------------------------------------------------------------
' メイン
' --------------------------------------------------------------------------------
inFileName = WScript.Arguments(0)
Set fs = CreateObject("Scripting.FileSystemObject")
Set inFile = fs.GetFile(inFileName)
outPath = inFile.ParentFolder.Path & "\" & inFile.Name & "_text"
' 出力フォルダが存在していれば消して作り直す
If fs.FolderExists(outPath) Then
fs.DeleteFolder(outPath)
End If
fs.CreateFolder(outPath)
Set outFolder = fs.GetFolder(outPath)
' mdbを開く
Set accessObj = CreateObject("Access.Application")
accessObj.OpenCurrentDatabase(inFileName)
accessObj.Visible = True
accessObj.UserControl = True
' モジュールをテキスト化
Set vbproject = accessObj.VBE.ActiveVBProject
For Each vbcComp In vbproject.VBComponents
Select Case vbcComp.Type
Case vbext_ct_Document, vbext_ct_StdModule
ext = ".bas"
Case vbext_ct_ClassModule
ext = ".cls"
Case vbext_ct_MSForm
ext = ".frm"
Case Else
ext = ""
End Select
' Accessでは、「/」 入りのモジュール名を作成することができるが
' モジュールファイルをエクスポートするとOSの問題で、
' 「/」入りのファイル名を保存することができない
' そのため、「/」文字を「_」に変換してエクスポートする
moduleName = Replace(vbcComp.Name, "/", "_")
vbcComp.Export (outFolder.Path & "\" & moduleName & ext)
Next
' mdbを閉じる
accessObj.Quit()
msgbox "完了しました"
解決方法
現在示されている解決方法はオフィスを巻き戻すことです。事態が流動的なため、ツィートなどに引用されているMSのブログを参照してください。
当方はこの方法で戻ったため、「サンプル」というモジュールやクラス名に「サンプル1」(1は半角)をくわえて対応しました。そのあとコンパイルでクラス名を引っ張ってきているコードを修正しました。
現在の解決方法についての注意
Ver 1708からコマンドラインで元に戻したら次の自動更新の停止までやらないとまた1708にアップデートします。
類似の現象
Access2010でも類似のエラーメッセージが出るようになる場合が2013年ごろ発生しているが、今回はOffice2016 Access2016限定である。
VBAオブジェクトを読み取れないエラーの対処方法
Access2010でデータベースファイルを開いた際に、『データベースに含まれているVBAオブジェクトを読み取れないため、データベースを開くことができません。』といったエラーメッセージが表示されデータベースを開けない場合、そのAccessにService Packが適用されていないことが原因として考えられます。次の手順で対処を行ってみてください。
Access2010でコンボボックスの配置時にウィザード起動せず、エラーがでる。