Получение ошибки «метод saveas of object _workbook failed» при попытке сохранить XLSM как CSV

Вопрос: Я пытаюсь сохранить книгу Excel с макросами в виде файла csv, перезаписывая старую (ниже мне пришлось изменить имя папки и листа, но это не проблема). Sub SaveWorksheetsAsCsv() Dim SaveToDirectory As String Dim CurrentWorkbook As String Dim CurrentFormat As Long CurrentWorkbook = ThisWorkbook.FullName CurrentFormat = ThisWorkbook.FileFormat SaveToDirectory = "MyFolder" Application.DisplayAlerts = False Application.AlertBeforeOverwriting = False

Вопрос:

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

Sub SaveWorksheetsAsCsv() Dim SaveToDirectory As String Dim CurrentWorkbook As String Dim CurrentFormat As Long CurrentWorkbook = ThisWorkbook.FullName CurrentFormat = ThisWorkbook.FileFormat SaveToDirectory = «MyFolder» Application.DisplayAlerts = False Application.AlertBeforeOverwriting = False Sheets(«My_Sheet»).Copy ActiveWorkbook.SaveAs Filename:=SaveToDirectory & «My_Sheet» & «.csv», FileFormat:=xlCSV ActiveWorkbook.Close SaveChanges:=False ThisWorkbook.Activate ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat Application.DisplayAlerts = True Application.AlertBeforeOverwriting = True End Sub

Иногда это не с

Ошибка выполнения 1004: сбой метода метода объекта _workbook **)

Отладчик указывает:

ActiveWorkbook.SaveAs Filename:=SaveToDirectory & «My_Sheet» & «.csv», FileFormat:=xlCSV

Я погуглил, и некоторые из решений, которые я попробовал, были:

  • Указывая, что каталог является строкой
  • Избегайте каких-либо специальных символов в имени файла или папки (см. Здесь)
  • Скопируйте и вставьте лист в качестве значения перед сохранением его в формате .csv (см. Здесь)
  • Указание FileFormat с кодом .csv (см. Здесь)
  • Отключение/повторное включение некоторых оповещений
  • Добавление других полей в строку ActiveWorkbook.SaveAs, касающихся паролей, создание резервных копий и т.д.

Тем не менее, он может работать правильно до 50-60 раз подряд, а затем в какой-то момент снова произойдет сбой.

Любое предложение, кроме как прекратить использование VBA/Excel для этой задачи, которая скоро произойдет, но пока не могу.

РЕДАКТИРОВАТЬ: Решено благодаря предложению Degustaf. Я внес только два изменения в предложенный Дегустафом код:

  • ThisWorkbook.Sheets вместо CurrentWorkbook.Sheets
  • FileFormat:=6 вместо FileFormat:=xlCSV (очевидно, более устойчив к различным версиям Excel)

Sub SaveWorksheetsAsCsv() Dim SaveToDirectory As String Dim CurrentWorkbook As String Dim CurrentFormat As Long Dim TempWB As Workbook Set TempWB = Workbooks.Add CurrentWorkbook = ThisWorkbook.FullName CurrentFormat = ThisWorkbook.FileFormat SaveToDirectory = «\MyFolder» Application.DisplayAlerts = False Application.AlertBeforeOverwriting = False ThisWorkbook.Sheets(«My_Sheet»).Copy Before:=TempWB.Sheets(1) ThisWorkbook.Sheets(«My_Sheet»).SaveAs Filename:=SaveToDirectory & «My_Sheet» & «.csv», FileFormat:=6 TempWB.Close SaveChanges:=False ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat ActiveWorkbook.Close SaveChanges:=False Application.DisplayAlerts = True Application.AlertBeforeOverwriting = True End Sub Лучший ответ:

Я обычно нахожу, что ActiveWorkbook является проблемой в этих случаях. Под этим я подразумеваю, что каким-то образом у вас не выбрана эта книга (или любая другая), а Excel не знает, что делать. К сожалению, поскольку copy ничего не возвращает (было бы неплохо скопировать лист), это стандартный способ решения этой проблемы.

Таким образом, мы можем подойти к этому как к тому, как мы можем скопировать этот лист в новую рабочую книгу и получить ссылку на эту рабочую книгу. Что мы можем сделать, это создать новую рабочую книгу, а затем скопировать лист:

Dim wkbk as Workbook Set Wkbk = Workbooks.Add CurrentWorkbook.Sheets(«My_Sheet»).Copy Before:=Wkbk.Sheets(1) Wkbk.SaveAs Filename:=SaveToDirectory & «My_Sheet» & «.csv», FileFormat:=xlCSV Wkbk.Close SaveChanges:=False

Или есть еще лучший подход в такой ситуации: WorkSheet поддерживает SaveAs метод. Копия не требуется.

CurrentWorkbook.Sheets(«My_Sheet»).SaveAs Filename:=SaveToDirectory & «My_Sheet» & «.csv», FileFormat:=xlCSV

Я предупрежу вас о том, чтобы впоследствии восстановить реальное имя книги, если она остается открытой, но она уже есть в вашем коде.

Ответ №1

Это год, но я добавлю что-то для будущих читателей.

Вы не найдете много документации в справочной системе Excel для ошибки времени выполнения 1004, поскольку Microsoft не считает ее ошибкой Excel.

Ответы выше 100% действительны, но иногда это помогает узнать, что вызывает проблему, поэтому вы можете избежать этого, исправить его раньше или исправить его легче.

Тот факт, что это прерывистая ошибка, и фиксируется путем сохранения с полным путем, и имя файла говорит мне, что либо ваш макрос может пытаться сохранить файл .xlsb в каталог автозавершения после автоматического восстановления файлов.

В качестве альтернативы вы можете сами отредактировать путь к файлу или имя файла.

Вы можете проверить путь и имя файла с помощью: –
MsgBox ThisWorkbook.FullName

В окне сообщения вы должны увидеть что-то подобное.

C:UsersMikeAppDataРоумингMicrosoftExcelDIARY (версия 1).xlxb

Если это решение (как указано выше другими), чтобы сохранить файл в правильном пути и имени файла. Это можно сделать с помощью VBA или вручную.

Теперь я привык вручную сохранять файл с правильным путем и именем файла, как само собой разумеющееся после любого действия по автообнаружению, так как он занимает несколько секунд, и я нахожу его быстрее (если это не ежедневное появление). Таким образом, макросы не будут сталкиваться с этой ошибкой, которую вы запускаете. Помните, что, хотя моя привычка вручную сохранять файлы .xlxb в .xlsm файлах сразу после восстановления не поможет новичку, которому вы даете рабочий лист.

Заметка о гиперссылках

После этой ошибки: если у вас есть гиперссылки на рабочем листе, созданные с помощью Ctrl + k, у вас будет что-то вроде “AppDataRoamingMicrosoft ”, “ AppDataRoaming”,.. /../AppData/Roaming/ “or”….Мои документыМои документы ” в нескольких гиперссылках после восстановления файла. Вы можете избежать этого, добавив свои гиперссылки в текстовое поле или создав их с помощью функции HYPERLINK.

Идентификация и восстановление их немного сложнее

Сначала рассмотрите гиперссылки и определите ошибочные строки и правильную строку для каждой ошибки. Со временем я нашел несколько.

Excel не предоставляет средства в меню “Перейти к специальному” для поиска гиперссылок, созданных с помощью Ctrl + k.

Вы можете автоматизировать идентификацию ошибочных гиперссылок в столбце помощника, например, столбец Z и используя формулу

=OR(ISNUMBER(SEARCH(«Roaming», Link2Text($C2),1)),ISNUMBER(SEARCH(«Roaming», Link2Text($D2),1)))

где Link2Text – это UDF

Функция Link2Text (rng As Range) As String    “НЕ деактивируйте.   ‘Определяет гиперссылки, содержащие” роуминг” в столбце Z.

‘ Identify affected hyperlinks If rng(1).Hyperlinks.Count Then Link2Text = rng.Hyperlinks(1).Address End If End Function

Мой VBA для исправления ошибок выглядит следующим образом

Sub Replace_roaming()

‘Выберите правильный лист   Листы ( “ДНЕВНИК” ). Выберите

Dim hl As Hyperlink For Each hl In ActiveSheet.Hyperlinks hl.Address = Replace(hl.Address, «AppDataRoamingMicrosoft», «») Next For Each hl In ActiveSheet.Hyperlinks hl.Address = Replace(hl.Address, «AppDataRoaming», «») Next For Each hl In ActiveSheet.Hyperlinks hl.Address = Replace(hl.Address, «../../AppData/Roaming/», «….My documents») Next For Each hl In ActiveSheet.Hyperlinks hl.Address = Replace(hl.Address, «….My documentsMy documents», «….My documents») Next Application.Run «Recalc_BT» ‘ Move down one active row to get off the heading ActiveCell.Offset(1, 0).Select ‘ Check active row location If ActiveCell.Row = 1 Then ActiveCell.Offset(1, 0).Select End If ‘ Recalc active row ActiveCell.EntireRow.Calculate ‘ Notify MsgBox «Replace roaming is now complete.» End Sub

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

Хотя рабочий лист часто является хрупкой резервной копией, как каждый час или после значительного импорта новых данных.

Следующие ярлыки будут делать резервные копии рабочего листа в секундах: Ctrl + O, [выделить имя файла], Ctrl + C, Ctrl + V, [X]. Обычные резервные копии позволяют сразу перейти к самой последней резервной копии без необходимости восстановления из файла резервной копии прошлой ночью, особенно если вам нужно сделать запрос другого человека, чтобы сделать это.

Ответ №2

Попробуйте комбинировать путь и имя файла CSV в строковой переменной и отбросить .csv; который обрабатывается FileFormat. Путь должен быть абсолютным, начиная с буквы диска или имени сервера:   Dim strFullFileName as String  strFullFileName = «C:My FolderMy_Sheet»
Если на сервере он будет выглядеть примерно так:   strFullFileName = «\ServerNameShareNameMy FolderMy_Sheet»
Substiture ServerName с именем вашего сервера и замените ShareName на свою сеть. \data101AccountingMy FolderMy_Sheet  ActiveWorkbook.SaveAs Filename:=strFullFileName,FileFormat:=xlCSVMSDOS, CreateBackup:=False

Оцените статью
Добавить комментарий