这是上次遇到MSExcel.ToDole宏病毒的后续,不知道为什么有的excel文档在经过专杀处理后,病毒模块已经删除了,但是在打开文档时仍然提示“该工作簿中包含一种无法禁用的宏(Microsoft Excel 4.0版的宏)”,一定要启用宏后才能打开,而在文档里却找不到任何宏,VBA编辑器里也没有多余的代码,也再查不出任何病毒,在C:\Program Files\Microsoft Office\OFFICE11\XLSTART和C:\Documents and Settings\Administrator\Application Data\Microsoft\Excel\XLSTART下也没有任何可疑的启动文件。
再次查对病毒的代码,原来还有一个隐藏的宏表存在,只是一度相信专杀工具的能力,认为它已经清除病毒了,没想到竟然还有遗留(也有可能是因为该文档加过密吧)。要显示隐藏的宏表,先从工具-宏-Visual Basic编辑器,右键点击任一工作表(就是sheet那些),点击“查看代码”,把下面代码粘贴到代码窗口:
Sub test()
Dim sh As Worksheet
For Each sh In Excel4MacroSheets
If Not sh.Visible Then sh.Visible = 1
Next
End Sub
将光标定位到代码段内,按F5运行。然后回到工作表的界面(Visual Basic编辑器可以关掉了,上面输入的代码也可以删除,不需要了),就可以看到被隐藏的工作表(注意,通过VBA代码隐藏的工作表是不能通过菜单中的“格式”-工作表-“取消隐藏”来解除隐藏状态的),在我这里出现的原先隐藏工作表是Macro1(如下图),这是一个保护宏的机制,如果禁用宏将不能打开excel文档,被病毒利用来保护自己。
删除此工作表,但事情并没有结束,然后切换到该excel工作簿其它每一个正常的工作表时就会出现“找不到#REF!$A$2”,虽然不影响具体操作,但很烦人,原来这个病毒为每个表都添加工作表级别的名称“Auto_Activate”,并将引用都指向宏表“Macro1”的A2单元格,“Auto_Activate”是一个自动宏,表被激活时自动执行,(病毒代码: wb.Names.Add sht.Name & "!Auto_Activate", "=Macro1!$A$2", False ......),而且这个工作表级别的名称是隐藏的,所以想在菜单中的“插入”-“名称”-“定义”中发现它是不可能的。不过虽然是隐藏的,但删除还是可以的,进入 “插入”-“名称”-“定义”, 在最上面的框中输入要删除的名称,如本例中的Auto_Activate,然后点击删除,就把这个隐藏的工作表级别名称删除掉了,整个excel工作簿中所有的工作表都要这样删除一遍,这样才能把这个引用宏的影响彻底消除。顺便说一下,如果打开excel文档出现找不到宏的提示,也可以到这里来查查看是否有什么名称要删除。
最后,保存excel,再次打开就不会出现“无法禁用宏”的提示了,当然这个excel文档本身原来就没有宏的。
关于显示隐藏的宏表可参考:1、http://club.excelhome.net/thread-294584-1-1.html 2、http://club.excelhome.net/thread-198460-1-93.html
关于保护宏可参考:1、http://blog.163.com/a_teacher/blog/static/41721254201111991716601/ 2、http://blog.csdn.net/czmao1985/article/details/5969710
>> 除非说明均为原创,如转载请注明来源于http://www.stormcn.cn/post/1257.html