【问题标题】:Run-time error upon opening excel file打开excel文件时出现运行时错误
【发布时间】:2017-11-10 23:31:29
【问题描述】:

我正在尝试在 button_click 事件中打开 excel 文件。我打开的前四个 excel 文件没有遇到任何错误,但是当我的宏打开第五个时,它停止并显示此运行时错误:

Run-time error '-2147021892 (80070bbc)':

office has detected a problem with this file. 
To help protect your computer this file cannot be opened.

这是我打开 excel 文件的代码:

    Set wb = Workbooks.Open(fileName:=fileName, UpdateLinks:=True)

【问题讨论】:

  • 尝试手动打开它以了解该文件的不同之处。可能有一些不可读的项目或文件可能已损坏。
  • @pnuts 类型是 Microsoft Excel 97-2003 工作表 (.xls),是的,所有文件都具有相同的类型和相同的位置。我尝试将问题文件放在首位,但没有任何区别。运行时错误仍然显示。
  • 如@l42 建议的那样,您可以手动打开文件吗?你得到同样的信息吗?如果是,那么您的文件已损坏。尝试重新创建文件。
  • @SiddharthRout 我可以手动打开文件,但由于同样的错误,它会自动在受保护的视图中。
  • 这意味着您的文件已损坏。尝试重新创建文件

标签: vba excel


【解决方案1】:

我遇到了同样的问题。文件已损坏,VBA 打开引发了该错误。作为一种可能的解决方案,我发现了这个(faname 是带有路径的字符串):

Workbooks.Open FileName:= fname, UpdateLinks:=False, ReadOnly:=True, _
   IgnoreReadOnlyRecommended:=True, Password:="", Editable:=FALSE, _
   CorruptLoad:= xlExtractData

重要的部分是“CorruptLoad:= xlExtractData”,它可以从损坏的文件中加载数据而不会引发此错误。其他的东西只是为了防止文件做某事......连同

Application.DisplayAlerts = False
Application.AskToUpdateLinks = False
Application.EnableEvents = False
Application.AutomationSecurity = msoAutomationSecurityForceDisable
Application.Calculation = xlCalculationManual

作为打开文件之前的预防措施...如果您这样做,请不要忘记在宏完成之前撤消它(这些是我的标准设置,请使用您自己的!您可以使用 Debug.Print 找到它们立即窗口):

Application.DisplayAlerts = True
Application.AskToUpdateLinks = True
Application.EnableEvents = True
Application.Calculation = xlNormal
Application.AutomationSecurity = msoAutomationSecurityLow

请注意您的安全设置实际上是什么,不要盲目复制这些设置更改... 也最好捕获错误(“On Error ...”)并通过重置您之前的设置来终止。

【讨论】:

【解决方案2】:

可能的解决方案

Microsoft Support - Error message in Office when a file is blocked by registry policy settings 提供了几种机制,如果您信任文档内容,如何可能绕过此错误。

一些关键说明:

适用于 Excel 2010 或 2013

通过文件 -> 选项 -> 信任中心 -> 信任设置更改文件阻止设置以禁用某些文件类型的限制

适用于 Excel 2003 或 2007

您必须更改 FileOpenBlock 注册表子项的值才能禁用对某些文件类型的限制。它位于

对于 Excel 2007:

HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\12.0\Excel\Security\FileOpenBlock

对于 Excel 2003:

HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\11.0\Excel\Security\FileOpenBlock

子键应该如下:

为什么会这样

来自Microsoft Support

症状

您在 Microsoft Office 2010 应用程序中执行以下操作之一:

•打开一个嵌入的对象

•执行邮件合并

•从查看器打开文件

在这种情况下,您会收到以下错误消息:

Office 检测到此文件存在问题。为帮助保护您的计算机,无法打开此文件。

原因

出现此问题是因为 Office 文件验证检测到问题 与可能构成安全风险的文件。您收到错误 恶意文件或损坏文件的消息。

Office 似乎检测到文件可能存在恶意内容,例如病毒或其他恶意软件,或者文件可能已损坏。如果您信任此文档,请继续打开它。否则要格外小心,以避免某种类型的恶意软件感染。

【讨论】:

  • 哦,所以 OP 可能正在打开一个 XLSM 文件? Excel 非常不信任启用了宏的文件。
【解决方案3】:

我用“损坏”的文件尝试了上面的代码行。 结果是灾难性的,(但原件被备份)。 所有 Excel 工作表 (13) 现在都有文本,并且 所有大约 93 页的 VBA 代码都消失了。 Styles=17:文件大小

单元格格式更改的单元格会导致臭名昭著的 M/S 错误文本。 我不认为这是损坏的,但它可能对 Excel 编程太多。

【讨论】:

  • 我尝试了与上述相同的解决方案,它强制脚本读取错误文件并且数据变成垃圾。如果它检索的数据不可用,则不确定该损坏加载选项何时会派上用场。
  • 如果您出于某种原因尝试恢复文件,请不要覆盖原始文件,这样您仍然可以尝试其他方法。如果文件损坏,则数据丢失的可能性很高。关于 VBA 代码的 x 页:我通常在文本编辑器中备份我的 VBA 代码并以结尾“.vb”保存它,所以我的编辑器(记事本++)正确地选择了语法突出显示......通常我也只需直接在那里编写代码,然后将其复制到最后的 Excel 中进行调试。我之前因为 Excel 文件损坏而丢失了工作,所以我总是使用备份。
  • @user2025696:如果可能的话,如果您想打开大量文件并从中提取数据,您可能需要该代码。如果可能的话,您不希望您的宏在损坏的文件之间停止并仍然获取数据。进行一些完整性检查,以防止加载垃圾,并且您可以通过一次宏运行有效地从数百或更多文件中提取数据。
【解决方案4】:

该文件可能是从外部来源(如互联网)下载/复制的。 以下页面讨论了如何通过 VBA 以编程方式“取消阻止”此类文件。 https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-msoffice_custom/how-to-unblock-file-using-vba/bed82938-6a57-403c-afcf-fa76a26a1ac6

查看 Andreas Killer 的解决方案。他提到您清除的不是文件属性,而是从文件中删除了备用数据流“Zone.Identifier”。 并提供以下链接:- 维基链接... en.wikipedia.org/wiki/NTFS#Alternate_data_streams_.28ADS.29 http://vb.mvps.org/samples/Streams/

Karl E. Peterson 网站的第二个链接提供了一个 Streams.zip 文件,其中包含需要导入到您的项目中并使用 KillStream 函数的 CStreams 类。

Sub Test()
  Dim C As New CStreams
  Dim i As Integer
With C
  .FileName = "C:\test.txt"
  For i = 1 To .Count - 1
    Debug.Print .KillStream(i)
  Next
End With
End Sub

-归功于 Andreas Killer

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多