Вопрос:
Я пытаюсь сохранить книгу 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