当ブログでも「KB2553154の更新プログラムをアンインストールするVBScript」記事で取り上げていますが、昨年末に“2014年12月のWindows Update以降コマンドボタンが使えなくなった”というトラブルが数多く報告されました。
(下記はMicrosoft Communityのスレッドの一例です。)
- 本日実施した Windows Update 後から Excel 2010 の VBA が動作しなくなった
- http://answers.microsoft.com/thread/5886d5cb-2449-46e9-a396-2e8142784b5e
- KB2553154 と MSForms.Exd 削除で対応できていたが、 「実行時エラー ‘57121’ アプリケーション定義またはオブジェクト定義エラーです」 のエラーが表示するようになった。
- http://answers.microsoft.com/thread/a7e658d7-02a9-451e-b39b-916519fa3a1e
- 2014/12/10の一連のwindows updateによりwordのチェックボックスがクリックできなくなる
- http://answers.microsoft.com/thread/e8d3a1f4-4a6f-4eec-8a70-f9069af9dd24
- KB2553154をインストール後の問題
- http://answers.microsoft.com/thread/9c7b865f-a85c-4eb9-af44-e8a536f8225d
- OfficeのUPDATEでExcel2010のボタンが押せなくなった
- http://answers.microsoft.com/thread/0c5bbfc2-3594-49d1-bc1c-5e1a3d28b414
- EXCEL2010のVBで 実行時エラー ”438″ が発生するようになった
- http://answers.microsoft.com/thread/35372e2d-e937-432b-b443-847b7012b39d
- Microsoft Office 2010 32 ビット版 KB2553154のパッチを入れるとエクセルシートに貼ったTextBoxが入力できなくなる
- http://answers.microsoft.com/thread/77902ccd-1abe-492e-bcf2-f54f83bf6fc5
- WindowsUpdate後からの実行時エラー32809について
- http://answers.microsoft.com/thread/86b9570e-5662-4a92-a968-d551a2122fa1
- excel2010 active-xで作ったコマンドボタンが消える
- http://answers.microsoft.com/thread/6b0d3f15-06b7-4695-a5f0-d68a1414115f
- excel2010でActiveXコントロールのオブジェクトが挿入できない、使用できない
- http://answers.microsoft.com/thread/7298c3e3-2c3e-41e8-bbce-4017faa5bcf5
- 12/11のwindows updateでExcel VBAで作成したソフトにトラブル発生!!!
- http://answers.microsoft.com/thread/57ceb786-234c-4605-8b61-b790058f1298
- 2015/02/03 のWindows Update 後から Excel 2010 の VBA が動作しなくなった
- http://answers.microsoft.com/thread/c7548a1e-d799-4636-ae37-96267e748b36
- Excel 2013 VBA のコマンドボタンが作動しない
- http://answers.microsoft.com/thread/6a7ed705-609d-458f-87bb-de630df82207
- VBAで組んだマクロが突然動かない
- http://answers.microsoft.com/thread/6c12681a-bb48-427d-a214-24b11bcfd5fa
- excel VBA コマンドボタンが作動しなくなる
- http://answers.microsoft.com/thread/b6716b9e-5200-4e3e-9b63-6cc52ea928c7
- チェックボックスにチェックがはいらない
- http://answers.microsoft.com/thread/f61a4b66-aed7-48f9-842f-c6de70bf8fe7
- EXCEL 2013 フォームコントロールがPCによって選択出来ない。
- http://answers.microsoft.com/thread/7210420b-4e27-4f17-aa64-581e0e210b66
ActiveX コントロールのキャッシュ(exdファイル)が原因のようで、対処法としては、「“オブジェクトを挿入できません” エラーが MS14-082 セキュリティ更新プログラムをインストールした後に ActiveX カスタム Office ソリューションで表示される」にあるように、Windows Updateで該当パッチ(Office 2007:KB2596927、Office 2010:KB2553154、Office 2013:KB2726958)を当てた後、MSForms.exdファイルを削除する、という方法になります。
上記ページではFix itもすでに公開されていて、このFix itを実行すれば自動的にexdファイルを削除してくれるようです。
そこで気になったのがこのFix itの中身。
一体どのような処理をしているのだろう?と気になったので、ファイルを展開して調べてみました。
すると、MSIファイルの中に「Binary.DeleteOfficeFile」ファイルがあり、そのファイル(VBScript)が実際にexdファイルの削除を行っているようでした。
・Binary.DeleteOfficeFile(Microsoft Fix it 51029)
Dim objFso : Set objFso = CreateObject("Scripting.FileSystemObject") Dim objShell : Set objShell = CreateObject("WScript.shell") Dim officeFolders : officeFolders = Array("%appdata%\microsoft\forms\",_ "%temp%\vbe\",_ "%temp%\excel8.0\",_ "%temp%\word8.0\",_ "%temp%\PPT11.0\",_ "%temp%\MicrosoftVisio12\",_ "%temp%\MicrosoftVisio14\",_ "%temp%\MicrosoftVisio15\") Dim fileExtensionName : fileExtensionName = "EXD" For Each officeFolder In officeFolders If(objFSO.FolderExists(objShell.ExpandEnvironmentStrings(officeFolder))) then Set objFolder = objFSO.GetFolder(objShell.ExpandEnvironmentStrings(officeFolder)) Set colFiles = objFolder.Files For Each objFile in colFiles If(UCase(objFso.GetExtensionName(objFile.Path)) = fileExtensionName) Then objFso.DeleteFile(objFolder.path & "\" & objFile.Name) end if Next end if Next
・Binary.DeleteOfficeFile(Microsoft Fix it 51031) ※ 要管理者権限
On Error Resume Next Const HKEY_LOCAL_MACHINE = &H80000002 Dim objFso : Set objFso = CreateObject("Scripting.FileSystemObject") Dim objShell : Set objShell = CreateObject("WScript.shell") Dim currentFolderPath Dim tempFolderPath Dim appDataFolderPath Dim fileExtensionName : fileExtensionName = "EXD" Dim strComputer : strComputer = "." Dim objRegistry Dim strKeyPath : strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") objRegistry.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubkeys For Each objSubkey In arrSubkeys strValueName = "ProfileImagePath" strSubPath = strKeyPath & "\" & objSubkey objRegistry.GetExpandedStringValue HKEY_LOCAL_MACHINE,strSubPath,strValueName,strValue currentFolderPath = strValue ' for debug ************************************************ 'Wscript.Echo currentFolderPath If objFSO.FolderExists(objShell.ExpandEnvironmentStrings(currentFolderPath)) Then Set currentFolder = objFso.GetFolder(currentFolderPath) If objFSO.FolderExists(objShell.ExpandEnvironmentStrings(currentFolderPath & "\AppData\Local\Temp")) or _ objFSO.FolderExists(objShell.ExpandEnvironmentStrings(currentFolderPath & "\AppData\Roaming\Microsoft")) Then tempFolderPath = objShell.ExpandEnvironmentStrings(currentFolderPath & "\AppData\Local\Temp") appDataFolderPath = objShell.ExpandEnvironmentStrings(currentFolderPath & "\AppData\Roaming\Microsoft") Dim officeFolders : officeFolders = Array() officeFolders = Array(appDataFolderPath & "\forms\", tempFolderPath) For Each officeFolder In officeFolders If(objFSO.FolderExists(objShell.ExpandEnvironmentStrings(officeFolder))) Then Set objFolder = objFSO.GetFolder(objShell.ExpandEnvironmentStrings(officeFolder)) Set colFiles = objFolder.Files For Each objFile in colFiles If(UCase(objFso.GetExtensionName(objFile.Path)) = fileExtensionName) Then ' for debug ************************************************ objFso.DeleteFile(objFolder.path & "\" & objFile.Name) 'Wscript.Echo objFolder.path & "\" & objFile.Name End If Next ShowSubfolders objFSO.GetFolder(objShell.ExpandEnvironmentStrings(officeFolder)) End If Next End if End if Next Sub ShowSubFolders(Folder) On Error Resume Next For Each Subfolder in Folder.SubFolders Set objFolder = objFSO.GetFolder(Subfolder.Path) Set colFiles = objFolder.Files For Each objFile in colFiles If(UCase(objFso.GetExtensionName(objFile.Path)) = fileExtensionName) Then ' for debug ************************************************ objFso.DeleteFile(objFolder.path & "\" & objFile.Name) 'Wscript.Echo objFolder.path & "\" & objFile.Name End If Next ShowSubFolders Subfolder Next End Sub
なるほど。
コードを見ると、たしかにexdファイルがありそうなフォルダを順番に見て行って、exdファイルがあればそれを削除する、という処理を行っています。
こういった形で未だにVBScriptは使われているのだなー、とちょっと感慨深くなりました。
VBS、未だ死なず。
ただ、今回の一連のトラブルに関しては、
- 「無効なオブジェクトライブラリーです・・」 のメッセージが出てコマンドボタンのVBAが作動しなくなった。
- http://answers.microsoft.com/thread/a5d829f7-5d1e-4254-bdd4-e97e1921aefa
- Form Controls stop working after December 2014 Updates
- http://blogs.technet.com/b/the_microsoft_excel_support_team_blog/archive/2014/12/11/forms-controls-stop-working-after-december-2014-updates-.aspx
にもあるように、“コマンドボタンの名前が変わってしまう”、といった問題が生じることもあるようです。
2015/02/10 時点では、この問題については「This issue is also being reviewed.」となっているので、対処法はまだ出ていないようですが、何か進展があり次第また追記します。
お世話になります。にしうらと申します。
今回のMicrosoft による、WindowsUpdate 絡みで大変苦労しております。(現在も進行形です)
貴殿がまとめておられる情報は豊富でとてもありがたいです。
当方。Excel-VBAで中小企業さんや、公立小・中学校の校務支援システムを開発しております。
使用Excelは、2010です。WindowsUpdateは、最新状態です。
昨年12月のUpdateを通過した際、自分が開発用に使っている
Panasonic Let’snote CF-W8/Win7/Office2010 Professional Plus では正常に動作しますが。
ここで作成したExcel-VBAで組んだシステムをファイルコピーして他のPCで動かそうとすると
同じ、WIn7/Office2010 Professional Plusでもボタンが効かないものが現れました。
Msform.exd の削除や、更新ファイルのアンインストールをやってそれで動くものもあればダメなモノもあります。
実行時エラーの出るPCや、「オブジェクトが無効」と出て削除はできるも新しいボタンなどのオブジェクトが置けなかったり。ActiveXのボタンが置けないかわりに「マクロ」ボタンが置けるのでこのボタンにプログラムを書けば動いたり。あるいは、すんなり動くPCもあり・・・もう何が何か分かりません。
今だに翻弄されています。どうにかならないですかねぇ~、と情報を求めて右往左往しております。
また情報がありましたら、教えて下さい。よろしくお願い致します。
にしうら
> Masasumi Nishiura 様
当ブログ管理人のきぬあさです。
> 実行時エラーの出るPCや、「オブジェクトが無効」と出て削除はできるも新しいボタンなどのオブジェクトが置けなかったり。ActiveXのボタンが置けないかわりに「マクロ」ボタンが置けるのでこのボタンにプログラムを書けば動いたり。あるいは、すんなり動くPCもあり・・・もう何が何か分かりません。
「run-time error ‘32809’」( https://social.msdn.microsoft.com/Forums/en-US/exceldev/thread/84762af5-9120-470a-9206-086a83a3813c )によると、
1.該当パッチ(Office 2007:KB2596927、Office 2010:KB2553154、Office 2013:KB2726958)を一度アンインストールして再起動する。
2.該当パッチをインストールして再起動する。
3. http://support2.microsoft.com/kb/3025036/ja にあるFixitを実行して再起動する。
といった手順で動くようになった方もいるようです。
———
I fixed Runt-time error ‘32809’ appearing on Windows 7 Ent with SP1 x64 with Office 2010 with SP2 32bit with all updates and deleted all *.exd files this way:
1.uninstall kb2553154, restart
2.install kb2553154, restart
3.MicrosoftFixit51029.msi
4.MicrosoftFixit51031, restart
My previously working worksheet is working again ;-)
———
今回のUpdate関連のトラブルは環境によって色々な問題が発生しているようで、「これだ!」という解決方法は私の方でも把握できておりません。
あとは、 http://blogs.technet.com/b/the_microsoft_excel_support_team_blog/archive/2014/12/11/forms-controls-stop-working-after-december-2014-updates-.aspx にも記載してある、VBAプロジェクトの再コンパイルを試してみるのも良いかと思います。
———
If the steps above do not resolve your issue, another step that can be tested (see warning below):
1. On a fully updated machine and after removing the .exd files, open the file in Excel with edit permissions.
2. Open Visual Basic for Applications > modify the project by adding a comment or edit of some kind to any code module > Debug > Compile VBAProject.
3. Save and reopen the file. Test for resolution.
If resolved, provide this updated project to additional users.
Warning: If this step resolves your issue, be aware that after deploying this updated project to the other users, these users will also need to have the updates applied on their systems and .exd files removed as well.
If this does not resolve your issue, it may be a different issue and further troubleshooting may be necessary. Please open a support ticket to report the issue.———