Произошло исключение. Метод сохранения в Microsoft Excel из класса рабочей книги выполнен неправильно
Обновлено: 21.11.2024
Я пытаюсь сохранить книгу Excel с поддержкой макросов в виде CSV-файла, перезаписав старый (ниже мне пришлось изменить имя папки и листа, но, похоже, это не проблема) .
Иногда это не удается
Ошибка выполнения 1004: сбой метода сохранения объекта _workbook**)
Отладчик указывает:
- Указание каталога в виде строки
- Избегайте использования специальных символов в имени файла или папки (см. здесь)
- Скопируйте и вставьте рабочий лист как значение, прежде чем сохранять его в формате .csv (см. здесь)
- Указание формата файла с кодовым номером .csv (см. здесь)
- Отключение/повторное включение некоторых оповещений
- Добавление других полей в строку ActiveWorkbook.SaveAs, касающихся паролей, создания резервных копий и т. д.
Тем не менее, он может работать правильно до 50-60 раз подряд, а затем в какой-то момент снова дать сбой.
Есть какие-либо предложения, кроме прекращения использования VBA/Excel для этой задачи, что произойдет в ближайшее время, но пока я не могу этого сделать.
EDIT: Решено благодаря предложению Дегустафа. Я внес только два изменения в код, предложенный Degustaf:
- ThisWorkbook.Sheets вместо CurrentWorkbook.Sheets
- FileFormat:=6 вместо FileFormat:=xlCSV (по-видимому, более устойчив к различным версиям Excel)
Ребята, спасибо вам обоим за ответы. У меня нет времени пытаться сделать это прямо сейчас, сделаю это завтра и свяжусь с вами.
Я не могу проголосовать за вас обоих из-за моего уровня репутации, в любом случае спасибо за вашу помощь. Решение Degustaf выглядит так, как будто оно помогло! Я тестировал его более 100 раз, и он не терпит неудачу. Я добавил к вопросу выше отредактированный и повторно адаптированный код из ответа Дегустафа. По какой-то причине JMMach все еще вызывал проблему.
5 ответов 5
Обычно я считаю, что в таких случаях проблема заключается в ActiveWorkbook. Под этим я подразумеваю, что у вас почему-то не выбрана эта книга (или любая другая), и Excel не знает, что делать. К сожалению, поскольку копирование ничего не возвращает (хорошо было бы скопировать лист), это стандартный способ решения этой проблемы.
Итак, мы можем решить, как скопировать этот лист в новую книгу и получить ссылку на эту книгу. Что мы можем сделать, так это создать новую книгу, а затем скопировать лист:
Или в такой ситуации есть еще лучший подход: WorkSheet поддерживает метод Сохранить как. Копировать не нужно.
Я предупрежу вас, чтобы вы впоследствии пересохранили книгу под ее исходным именем, если она остается открытой, но это уже есть в вашем коде.
Это год, но я добавлю кое-что для будущих читателей
Вы не найдете много документации в справке Excel по ошибке выполнения 1004, поскольку Microsoft не считает ее ошибкой Excel.
Ответы выше на 100 % верны, но иногда полезно узнать причину проблемы, чтобы избежать ее, исправить раньше или устранить проще.
Тот факт, что это периодически возникающая ошибка, которая устраняется путем сохранения с указанием полного пути и имени файла, говорит мне о том, что ваш макрос может пытаться сохранить файл .xlsb в каталоге автоматического восстановления после автоматического восстановления файла.
Кроме того, вы могли изменить путь или имя файла самостоятельно.
Вы можете проверить путь и имя файла с помощью:- MsgBox ThisWorkbook.FullName
Вы должны увидеть что-то подобное в окне сообщения.
Если это так, решение (как указано выше другими) состоит в том, чтобы сохранить файл по правильному пути и имени файла. Это можно сделать с помощью VBA или вручную.
Теперь у меня есть привычка вручную сохранять файл с его правильным путем и именем файла, как само собой разумеющееся, после любого действия по автовосстановлению, поскольку это занимает секунды, и я нахожу его быстрее (если это не происходит ежедневно). Таким образом, макрос не столкнется с этой ошибкой, которую вы запустите. Помните, что моя привычка вручную сохранять файлы .xlxb в файлы .xlsm сразу после восстановления не поможет новичку, которому вы даете рабочий лист.
Примечание о гиперссылках
После этой ошибки: если у вас есть гиперссылки на вашем листе, созданные с помощью Ctrl + k, по всей вероятности, у вас будет что-то вроде "AppData\Roaming\Microsoft\", "\AppData\Roaming\", "../. ./AppData/Roaming/" или ".\Мои документы\Мои документы\" в нескольких гиперссылках после восстановления файла. Вы можете избежать этого, прикрепив свои гиперссылки к текстовому полю или сгенерировав их с помощью функции HYPERLINK.
Выявить и исправить их немного сложнее
Сначала проверьте гиперссылки и определите ошибочные строки и правильную строку для каждой ошибки. Со временем я нашел несколько.
Excel не предоставляет средства в меню "Перейти к специальному" для поиска гиперссылок, созданных с помощью Ctrl + k .
Вы можете автоматизировать идентификацию ошибочных гиперссылок во вспомогательном столбце, например столбце Z, и использовать формулу
где Link2Text — это пользовательская функция
Функция Link2Text(rng As Range) As String ' НЕ деактивировать. ' Находит гиперссылки, содержащие слово "роуминг" в столбце Z.
Мой VBA для исправления ошибок выглядит следующим образом
' Выберите правильный лист Sheets("DIARY"). Выберите
Я также рекомендую вам выработать привычку регулярно делать резервные копии, а не полагаться только на автоматическое восстановление. В случае сбоя у вас ничего не осталось с момента последней полной резервной копии.
Несмотря на то, что рабочая таблица часто подвергается хрупкому резервному копированию, например, каждый час или после значительного импорта новых данных.
Следующие сочетания клавиш создадут резервную копию вашего рабочего листа за считанные секунды: Ctrl + O , [выделите имя файла], Ctrl + C , Ctrl + V , [ X ]. Регулярные резервные копии позволяют вам немедленно перейти к самой последней резервной копии без необходимости восстановления из файла резервной копии прошлой ночи, особенно если вам нужно сделать запрос на это другому человеку.
Версию этой статьи для Microsoft Excel 2000 см. в разделе 230164.
Важно! В этой статье содержится информация о том, как изменить реестр. Убедитесь, что вы создали резервную копию реестра, прежде чем изменять его. Убедитесь, что вы знаете, как восстановить реестр в случае возникновения проблемы. Для получения дополнительных сведений о резервном копировании, восстановлении и изменении реестра щелкните следующий номер статьи базы знаний Майкрософт:
256986 Описание реестра Microsoft Windows
Симптомы
При попытке сохранить книгу появляется следующее сообщение об ошибке:
Microsoft Excel не может получить доступ к файлу «Сетевой путь». Вы можете получить это сообщение об ошибке по следующим причинам:
Имя файла или путь не существуют.
Файл, который вы пытаетесь открыть, используется другой программой. Закройте документ в другой программе и повторите попытку.
Имя книги, которую вы пытаетесь сохранить, совпадает с именем другого документа, доступного только для чтения. Попробуйте сохранить книгу под другим именем.
В этом сообщении сетевой путь – это сетевое расположение, в котором вы пытаетесь сохранить файл.
При попытке сохранить файл в другом месте появляется следующее сообщение об ошибке:
Документ не сохранен
Причина
Эта проблема может возникнуть, если выполняются следующие условия:
Вы сохраняете файл на сетевой диск.
Соединение с сетевым диском потеряно.
Ваша книга содержит любой из следующих элементов:
Модули Visual Basic для приложений
Встроенные объекты (например, картинки)
Временное решение
Чтобы предотвратить возникновение этой проблемы, можно добавить в реестр подразделы
NetworkResiliency и
PivotTableNetworkResiliency. Для этого выполните следующие действия.
Предупреждение. Если вы неправильно измените реестр с помощью редактора реестра или другим способом, могут возникнуть серьезные проблемы. Эти проблемы могут потребовать переустановки операционной системы. Майкрософт не может гарантировать, что эти проблемы могут быть решены. Вносите изменения в реестр на свой страх и риск.
Нажмите "Пуск", а затем "Выполнить".
В поле "Открыть" введите regedit и нажмите "ОК".
На левой панели разверните следующие элементы в том порядке, в котором они появляются, в соответствии с используемой версией Excel.
Майкрософт Эксель 2002
HKEY_CURRENT_USER
Программное обеспечение
Microsoft
Office
10.0
ExcelMicrosoft Office Excel 2003
HKEY_CURRENT_USER
Программное обеспечение
Microsoft
Office
11.0
ExcelMicrosoft Office Excel 2007
На левой панели щелкните папку «Параметры».
В меню "Правка" выберите "Создать" и нажмите "Значение DWORD".
Введите NetworkResiliency и нажмите клавишу ВВОД.
Дважды щелкните значок NetworkResiliency.
В поле "Значение" введите
1 и нажмите "ОК".
В меню "Правка" выберите "Создать" и нажмите "Значение DWORD".
Введите PivotTableNetworkResiliency и нажмите клавишу ВВОД.
Дважды щелкните значок PivotTableNetworkResiliency.
В поле "Значение" введите 1 и нажмите "ОК".
Эти изменения вступят в силу при следующем запуске Excel. Для обоих разделов реестра установка ключа на 0 отключает настройку, а 1 включает настройку. Единственная разница между двумя разделами реестра заключается в том, что значение по умолчанию при отсутствии разделов реестра — «Вкл.» для VBA и OLE и «Выкл.» для кэша сводных таблиц.
Дополнительная информация
Эта функция была представлена в Microsoft Excel 2000 как отдельный раздел реестра.
Для получения дополнительной информации о том, как решить эту проблему в Excel 2000, щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:
230164 Вы можете получить сообщение об ошибке при попытке сохранить файлы в Excel 2000
Начиная с Excel 2002, функция сетевой устойчивости подразделяется на две категории, чтобы обеспечить лучший контроль и, кроме того, убедиться, что вы можете восстановиться после потери сетевого подключения. Эти два подразделения следующие:
Отказоустойчивость объектов VBA и объектов OLE
Отказоустойчивость кэшей сводных таблиц Microsoft
По умолчанию отказоустойчивость для VBA и OLE включена, а отказоустойчивость кэшей сводных таблиц отключена. Кэш сводной таблицы отключен, потому что вы можете сохранить сводную таблицу, даже если кеш недоступен. Сводная таблица не создает угрозы того, что файл не будет сохранен при потере сетевого подключения.
Настройки устойчивости сети не имеют пользовательского интерфейса. Они контролируются записями реестра и настраиваются только путем редактирования реестра вручную или с помощью политики.
Во время выполнения кода, использующего автоматизацию для управления Microsoft Excel, может возникнуть одна из следующих ошибок:
В Microsoft Excel 97 и более поздних версиях Excel появляется одно из следующих сообщений об ошибке:
Сообщение об ошибке 1
Ошибка выполнения '1004':
Сбой метода ' ' объекта '_Global'
Сообщение об ошибке 2
Ошибка, определяемая приложением или объектом
В Microsoft Excel 95 появляется одно из следующих сообщений об ошибке:
Сообщение об ошибке 1
Ошибка выполнения '-2147023174'
Ошибка OLE-автоматизации
Сообщение об ошибке 2
Ошибка выполнения "462":
Удаленный сервер не существует или недоступен.
Причина
Visual Basic установил ссылку на Excel из-за строки кода, которая вызывает объект, метод или свойство Excel без уточнения элемента с помощью объектной переменной Excel. Visual Basic не освобождает эту ссылку, пока вы не завершите программу. Эта ошибочная ссылка мешает коду автоматизации, когда код запускается более одного раза.
Разрешение
Чтобы решить эту проблему, измените код таким образом, чтобы каждый вызов объекта, метода или свойства Excel сопровождался соответствующей объектной переменной.
Статус
Такое поведение предусмотрено дизайном.
Дополнительная информация
Чтобы автоматизировать Microsoft Excel, вы устанавливаете объектную переменную, которая обычно ссылается на объект приложения Excel или объект книги Excel. Затем можно настроить другие объектные переменные для ссылки на рабочий лист, диапазон или другие объекты в объектной модели Microsoft Excel. Когда вы пишете код для использования объекта, метода или свойства Excel, перед вызовом всегда следует указывать соответствующую объектную переменную. Если этого не сделать, Visual Basic создаст собственную ссылку на Excel. Эта ссылка может вызвать проблемы при попытке запуска кода автоматизации несколько раз. Обратите внимание, что даже если строка кода начинается с объектной переменной, вызов объекта, метода или свойства Excel может быть сделан в середине строки кода, которой не предшествует объектная переменная.
Следующие шаги иллюстрируют, как воспроизвести эту проблему и как ее исправить.
Шаги для воспроизведения поведения
Запустите новый проект Standard EXE в Visual Basic. Форма Form1 создается по умолчанию.
В меню "Проект" нажмите "Ссылки", а затем проверьте в библиотеке объектов версию Excel, которую вы собираетесь автоматизировать.
Поместите элемент управления CommandButton на форму Form1.
Скопируйте следующий пример кода в окно кода формы Form1.
В меню "Выполнить" нажмите "Пуск" или нажмите клавишу F5, чтобы запустить программу.
Нажмите элемент управления CommandButton. Ошибка не возникает. Однако ссылка на Excel была создана и не выпущена.
Снова нажмите элемент управления CommandButton. Обратите внимание, что вы получаете одно из сообщений об ошибке, описанных в разделе "Проблема".
Примечание. Сообщение об ошибке возникает из-за того, что код ссылается на метод ячейки без предшествующего вызова объектной переменной
xlSheet.
Остановите проект и измените следующую строку кода:
Измените строку кода, чтобы она напоминала следующую строку кода.
Запустите программу еще раз. Обратите внимание, что вы можете запускать код несколько раз, не получая сообщения об ошибке.
Ссылки
Для получения дополнительной информации щелкните следующие номера статей, чтобы просмотреть статьи в базе знаний Майкрософт:
167223 Доступен файл справки по автоматизации Microsoft Office 97
189618 Вы можете получить сообщение об ошибке "Ошибка времени выполнения "-2147023174" (800706ba)" или "Ошибка времени выполнения "462"" при запуске кода Visual Basic, который использует автоматизацию для управления Word
Заинтересованы в разработке решений, расширяющих возможности Office на различных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любые технологии веб-программирования, такие как HTML5, JavaScript, CSS3 и XML.
Синтаксис
выражение.Сохранить как (Имя файла, Формат файла, Пароль, ПарольWriteResPassword, Рекомендуется только для чтения, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout , Местный)
выражение Переменная, представляющая объект Workbook.
Параметры
Имя | Обязательный/Необязательный | Тип данных | Описание |
---|---|---|---|
Имя файла | Необязательно | Вариант | Строка, указывающая имя сохраняемого файла. Вы можете указать полный путь; если этого не сделать, Microsoft Excel сохранит файл в текущей папке. |
Формат файла td> | Необязательно | Вариант | Формат файла для использования при сохранении файла. Список допустимых вариантов см. в перечислении XlFileFormat. Форматом по умолчанию для существующего файла является последний указанный формат файла; для нового файла по умолчанию используется формат используемой версии Excel. |
Пароль | Необязательно | Вариант | Строка с учетом регистра (не более 15 символов), указывающая пароль защиты, который будет присвоен файлу. |
WriteResPassword | Необязательно | Вариант | < td style="text-align: left;">Строка, указывающая пароль резервирования записи для этого файла. Если файл сохранен с паролем, а пароль не указан при открытии файла, файл открывается только для чтения.|
Рекомендуется только для чтения | Необязательно | Вариант td> | True, чтобы отображать сообщение при открытии файла с рекомендацией открыть файл только для чтения. |
Создать резервную копию | Необязательно | Вариант | True для создания файла резервной копии. |
Режим доступа | Необязательно | XlSaveAsAccessMode | Режим доступа к книге. |
ConflictResolution< /em> | Необязательно | Значение XlSaveConflictResolution, которое определяет, как метод разрешает конфликт при сохранении книги. Если установлено значение xlUserResolution, отображается диалоговое окно разрешения конфликтов. |
Если установлено значение xlLocalSessionChanges, изменения локального пользователя принимаются автоматически.
Если установлено значение xlOtherSessionChanges, изменения из других сеансов автоматически принимаются вместо изменений локального пользователя.
Примечания
Используйте надежные пароли, в которых сочетаются прописные и строчные буквы, цифры и символы. Слабые пароли не смешивают эти элементы.
- Надежный пароль: Y6dh!et5
- Слабый пароль: House27
Используйте надежный пароль, который вы сможете запомнить, чтобы вам не пришлось его записывать.
Пример
В этом примере создается новая книга, пользователю предлагается ввести имя файла, а затем книга сохраняется.
Поддержка и обратная связь
Есть вопросы или отзывы об Office VBA или этой документации? См. раздел Поддержка и отзывы об Office VBA, чтобы узнать, как получить поддержку и оставить отзыв.
Читайте также: