2014-09-11 4 views
1

Я пытаюсь открыть файлы excel в событии 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) 
+1

Попробуйте открыть его вручную, чтобы получить представление о том, что в этом файле отличается. Могут быть некоторые нечитаемые элементы, или файл может быть поврежден. – L42

+0

Что такое тип файла, не имеет значения, попробовать сначала файл проблемы, все ли файлы в одном месте? – pnuts

+0

Тип @pnuts - это рабочий лист Microsoft Excel 97-2003 (.xls) и да, все файлы имеют одинаковый тип и одно и то же местоположение. Сначала я попытался поставить файл проблемы, но это не имеет никакого значения. Ошибка времени выполнения все еще отображается. – danielle

ответ

3

Возможные резолюции

Microsoft Support - Error message in Office when a file is blocked by registry policy settings дает несколько механизмов, как возможно обойти эту ошибку, если вы доверяете содержание документа.

Некоторые ключевые Примечания:

For Excel 2010 or 2013

Change the File Block settings to disable the restriction of certain file types through File -> Options -> Trust Center -> Trust Settings

For Excel 2003 or 2007

You have to change the value of the FileOpenBlock registry subkey to disable the restriction of certain file types. This is located at

For Excel 2007:

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

For Excel 2003:

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

Subkeys should be as follows:

FileOpenBlock registry subkeys

Почему это происходит

От Microsoft Support:

SYMPTOMS

You perform one of the following actions in a Microsoft Office 2010 application:

•Open an embedded object

•Perform a mail merge

•Open a file from a viewer

In this situation, you receive the following error message:

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

CAUSE

This problem occurs because Office File Validation detects a problem with the file that may pose a security risk. You receive the error message for a malicious file or for a damaged file.

Оказывается, что Управление обнаруживает что-то, возможно, злонамеренный с файлом, например, вируса или другого вредоносного ПО, или просто возможно, что файл поврежден. Если вы доверяете этому документу, приступайте к его открытию. В противном случае будьте предельно осторожны, чтобы избежать заражения каким-либо вирусом.

+0

О, так OP мог бы открыть файл XLSM? Excel не доверяет файлам с включенными макросами. – StorymasterQ

5

У меня была та же проблема. Файл был поврежден, и 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 

Просто в качестве меры предосторожности, прежде чем открыть файл ... если что не забудьте отменить его перед вашей Macro отделки как (это мои стандартные настройки, использовать свои собственные, вы можете найти их с помощью Debug.Print в окне Immediate!):

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

Будьте осторожны, что ваши настройки безопасности на самом деле и не слепо копировать эти изменения settings ... Также лучше всего ловить ошибки («On Error ...») и завершаться сбросом предыдущих настроек.

+0

set CorruptLoad: = xlExtractData в порядке. и у вас есть другое решение, см. https://stackoverflow.com/questions/11970265/c-sharp-excel-2010-workbook-open-error, установить msoFileValidationSkip в excel app –

2

Я пробовал строку кода выше с моим «поврежденным» файлом. Результат был катастрофическим (но оригинал был скопирован). Все листы Excel (13) теперь имеют текст и Все около 93 страниц кода VBA исчезли. Стили = 17: Размер файла: < 2000kb.

Одна ячейка с измененным форматом ячейки вызывает печально известный текст ошибки M/S. Я не думаю, что это испорчено, но может быть слишком много программирования для Excel (ов).

+0

Я пробовал то же самое решение, что и выше, и это вынудило скрипт для чтения в плохом файле, и данные становятся мусором. Не совсем уверен, когда этот параметр corruptload пригодится, если данные, которые он извлекает, не используются. – user2025696

+0

Если вы попытаетесь восстановить файл по какой-либо причине, не перезаписывайте исходный файл, поэтому вы можете попробовать другие методы. Если файл поврежден, существует высокая вероятность потери данных. И о x страницах кода VBA: я обычно делаю резервные копии своего кода VBA в текстовом редакторе и сохраняю его с окончанием «.vb», поэтому мой редактор (блокнот ++) правильно подбирает подсветку синтаксиса ... Часто я также просто напишите код прямо там, а затем скопируйте его в Excel в конце для отладки. Я потерял работу раньше из-за поврежденных файлов Excel, поэтому я всегда работаю с резервными копиями. – blablubbb

+0

@ user2025696: Вам может понадобиться этот код, если вы хотите открыть большое количество файлов и извлечь данные из них, если это возможно. Вы не хотите, чтобы ваш Macro останавливался между ними для разграбленного файла и по возможности извлекал данные. Сделайте несколько проверок здравомыслия, чтобы предотвратить загрузку мусора, и вы можете эффективно извлекать данные из сотен или более файлов одним прогоном макроса. – blablubbb

1

Возможно, файл, похоже, загружен/скопирован с внешнего источника, например, в Интернет. На следующей странице обсуждалось, как «разблокировать» такие файлы программно через VBA. https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-msoffice_custom/how-to-unblock-file-using-vba/bed82938-6a57-403c-afcf-fa76a26a1ac6

См. Решение Андреаса Киллера. он отметил, что то, что вы очищаете, не является атрибутом файла, вы удаляете альтернативный поток данных «Zone.Identifier» из файла. И дает следующие ссылки: - ссылку вики ... en.wikipedia.org/wiki/NTFS#Alternate_data_streams_.28ADS.29 http://vb.mvps.org/samples/Streams/

Выше 2 ссылка на сайт Карла Е. Петерсона обеспечивает Streams.zip файл, который содержит класс CStreams, который необходимо импортировать в ваш проект и использовать функцию KillStream.

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 

-Credit к Andreas Киллер

Надеется, что это помогает.

Смежные вопросы