2014/12/11 追記:
当記事で紹介しているのは更新プログラムをアンインストールするスクリプトです。
下でも書いていますが、「更新プログラムを消すのはちょっと・・・」という方は、下記Webページの方法をご参照ください。
・山市良のえぬなんとかわーるど: 2014 年 12 月の Office の更新後に VBA が使えなくなったら…
http://yamanxworld.blogspot.jp/2014/12/2014-12-office-vba.html
2014/12/12 追記:
今回の問題は国外でも話題になっているようで、対応策としては主に、この記事でも紹介されているexdファイルの削除が紹介されているようです。
ただ、「本日実施した Windows Update 後から Excel 2010 の VBA が動作しなくなった – マイクロソフト コミュニティ」の投稿者の中には、“MSForms.exdファイルの削除だけでは治らず、Office Onlineからインストールしなおしたら治った(クイック実行版)”という方もいるようなので、環境によってはOfficeの再インストールが必要になるのかもしれません。
いずれにせよ、これだけの規模の問題となると、MicrosoftからFix itなり、公式の対応策なりが公開されるだろうと思います。
「一刻も早く問題を解決したい!」という場合でなければ、Microsoftの情報を待つのも有りでしょう。
2014/12/15 追記:
Microsoftのサポートサイトで当問題への解決方法が公開されました。
・ActiveX カスタム Office ソリューションで MS14 082 セキュリティ更新プログラムをインストールした後、「オブジェクトを挿入できません」エラー
http://support2.microsoft.com/kb/3025036/ja
機械翻訳なので分かりづらいところもありますが、要するにHDD内にある MSForms.exd ファイルを検索してすべて削除する、ということのようです。
2014/12/12 追記:
Fix itの中身が気になったので調べてみました。
・「2014年12月のWindows Update以降コマンドボタンが使えなくなった」トラブルへのFix it
//www.ka-net.org/blog/?p=5251
2014年12月の定例Windows Update以降、「ExcelでActiveX コントロールのボタンが押せなくなった。」「ActiveX コントロールのボタンを挿入しようとするとエラーが発生するようになった。」といったトラブルが発生しているようです。
・本日実施した Windows Update 後から Excel 2010 の VBA が動作しなくなった
http://answers.microsoft.com/thread/5886d5cb-2449-46e9-a396-2e8142784b5e
・office 2007 suites (KB2596927)のセキュリティ更新プログラムをインストールすると、ActiveXコントロールのコマンドボタンが押せなくなった。
http://answers.microsoft.com/thread/2d66db87-3c93-43be-937d-bb00e0d911b7
・OfficeのUPDATEでExcel2010のボタンが押せなくなった
http://answers.microsoft.com/thread/0c5bbfc2-3594-49d1-bc1c-5e1a3d28b414
手元の環境(Windows 7 + Office 2010(32ビット版))で確認してみると、たしかにActiveX コントロールのボタンをクリックすることができず、ActiveX コントロールを挿入しようとすると「オブジェクトを挿入できません。」といったエラーが発生して、コントロールを挿入することができません。
原因はセキュリティ更新プログラム「マイクロソフト セキュリティ情報 MS14-082 – 重要」のようで、それぞれのOfficeのバージョンに合ったKB番号の更新プログラムを、PCからアンインストールすれば解決します。
- Office 2007:KB2596927
- Office 2010:KB2553154
- Office 2013:KB2726958
手順としては、
- 管理者権限でコントロール パネルを開きます。
- 「プログラムと機能」を開きます。
- プログラムと機能画面左側にある「インストールされた更新プログラムを表示」をクリックします。
- 上記KB番号のプログラム(Office 2010の場合は「KB2553154」)を探し、右クリックメニュー(あるいはアンインストールボタン)から「アンインストール」を実行します。
上記のようになるのですが、この手順をいちいち手作業で行うのは面倒なので、コマンドで実行することにしました。
KB番号を指定して、特定の更新プログラムをアンインストールする場合、「Windows の Windows Update スタンドアロン インストーラーについて」にあるように、wusa.exeに「/uninstall」オプションを付けて実行すれば良いので、今回も、
wusa.exe /uninstall /kb:2553154 /norestart
としたのですが、コマンドを実行しても「このコンピューターには、更新プログラム KB2553154 がインストールされていません。」といったメッセージが表示され、アンインストールすることができませんでした。
仕方がないので、「アプリケーションの追加と削除の一覧からプログラムを手動で削除する方法」にある通り、アプリケーションのアンインストールに使用されるプログラムを、レジストリにある「UninstallString」から取得することにしました。
私の環境で取得した値が下記になります。
"C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Oarpmany.exe" /removereleaseinpatch "{90140000-0012-0000-0000-0000000FF1CE}" "{D0D69BA5-4BD9-439E-804F-07DC80CF5408}" "1041" "0"
早速管理者権限でこのコマンドを実行してみると、下図の通り問題無くアンインストールすることができました。
更新プログラムKB2553154をアンインストールした後、実行できなかったマクロを再度実行してみると、今度は問題なくマクロを動かすことができました。
これで、問題のある更新プログラムのアンインストール手順が確認できたので、過去に作成したマクロ「JavaのGUIDを取得するVBAマクロ」を流用したスクリプトをざっくり書いてみました。
'**************************************************** ' 指定したKB番号の[UninstallString]をレジストリから ' 取得・実行するスクリプト(64ビット環境では動作未確認) ' ' ※ 要管理者権限 ' ' Author : kinuasa ' Date : 2014/12/11 '**************************************************** Option Explicit Dim cmd Const vbNormalFocus = 1 Const KBNo = "KB2553154" 'KB番号 cmd = "" '初期化 cmd = GetUninstallString(KBNo) If Len(Trim(cmd)) > 0 Then 'WScript.Echo cmd '確認用 CreateObject("WScript.Shell").Run cmd, vbNormalFocus, False Else WScript.Echo "指定したKB番号[" & KBNo & "]の[UninstallString]を取得できませんでした。" End If Public Function GetUninstallString(ByVal KBNo) '指定したKB番号の[UninstallString]をレジストリから取得 Dim ret Dim reg Dim names Dim display_name Dim uninstall_string Dim i Const HKEY_LOCAL_MACHINE = &H80000002 Const SubKeyName = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" ret = "" '初期化 Set reg = CreateObject("WbemScripting.SWbemLocator") _ .ConnectServer(, "root\default") _ .Get("StdRegProv") reg.EnumKey HKEY_LOCAL_MACHINE, SubKeyName, names If Not IsNull(names) Then On Error Resume Next For i = LBound(names) To UBound(names) display_name = "" reg.GetStringValue HKEY_LOCAL_MACHINE, _ SubKeyName & ChrW(92) & names(i), _ "DisplayName", _ display_name '[DisplayName]にKB番号が含まれているか判別 If InStr(LCase(display_name), LCase(KBNo)) Then uninstall_string = "" reg.GetStringValue HKEY_LOCAL_MACHINE, _ SubKeyName & ChrW(92) & names(i) & ChrW(92), _ "UninstallString", _ uninstall_string ret = uninstall_string Exit For End If Next On Error GoTo 0 End If GetUninstallString = ret End Function
冗長なコードになってしまいましたが、とりあえずはこれでアンインストール作業を楽に進めることができます。
なお、上記コードは、更新プログラムのアンインストールを行う = システムへの影響を伴うスクリプトとなっていますので、自己責任で実行してくださいますよう、よろしくお願いいたします。
ちなみに、更新プログラムをアンインストールしなくても解決できる方法がすでに公開されていますので、そちらも是非ご参照ください。
・山市良のえぬなんとかわーるど: 2014 年 12 月の Office の更新後に VBA が使えなくなったら…
http://yamanxworld.blogspot.jp/2014/12/2014-12-office-vba.html
この更新プログラムの削除は、非常に便利でした。
32bitはこれでOKでしたが、64bitは以下のパスで動作しました。
64bit
SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
KB3085604
KB3085522
KB3055041
上記3つの更新プログラムが、Outlook2010の複数添付ファイルの場合
悪さをするので困ったもんですね。
http://blogs.technet.com/b/outlooksupportjp/archive/2015/09/01/outlook-2010.aspx
このプログラムで簡単に削除できました。
ありがとうございました。