Не удалось сохранить метод ошибки времени выполнения VBA объекта _workbook

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

Я попробовал приведенный ниже код. Если у меня уже есть папка с названием текущий год, макрос работает как положено. Однако, если папка не существует, макрос создает папку, открывает новую книгу, вставляет скопированные данные, сохраняет файл, но не переходит к следующему шагу закрытия файла, вместо этого показывает ошибку времени выполнения " 1004 метод сохранения объекта _workbook не удалось". Кто-нибудь может мне помочь?

Sub Copy_Data()

Dim ThisYear As String
Dim fdObj As Object
Dim wbO As Workbook

ThisYear = Format(Date, "YYYY")

Set fdObj = CreateObject("Scripting.FileSystemObject")

If fdObj.FolderExists("C:\Temp\" & ThisYear) Then GoTo DataCopy:
fdObj.CreateFolder ("C:\Temp\" & ThisYear)

DataCopy:

Sheet1.UsedRange.Copy

Set wbO = Workbooks.Add
Range("A1").PasteSpecial xlPasteAll

wbO.SaveAs Filename: = "C:\Temp\" & ThisYear & "\Data_New_" & Format(Now(), "ddmmyyyy"), FileFormat:=51     'Stops here

Windows("Data_New_" & Format(Now(), "ddmmyyyy") & ".xlsx").Close

End Sub

После предложений я отредактировал код, как показано ниже. Я все еще сталкиваюсь с той же проблемой. Код работает нормально, если я делаю шаг с помощью F8, но показывает ошибку времени выполнения, если я запускаю макрос.

Sub Copy_Data()

Dim ThisYear As String
Dim fdObj As Object
Dim wbO As Workbook

ThisYear = Format(Date, "YYYY")

Set fdObj = CreateObject("Scripting.FileSystemObject")

If Not fdObj.FolderExists("C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear) Then
fdObj.CreateFolder ("C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear)
End If

Sheet1.UsedRange.Copy

Set wbO = Workbooks.Add
Range("A1").PasteSpecial xlPasteAll

wbO.SaveAs Filename: = "C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear & "\Data_New_" & Format(Now(), "ddmmyyyy"), FileFormat:=51      'Stop here

wbO.Close

End Sub

Не имеет отношения к вашему вопросу, но использование GoTo таким образом обычно не одобряется. Вместо этого используйте If Not fdObj.FolderExists("C:\Temp\" & ThisYear) Then, fdObj.CreateFolder "C:\Temp\" & ThisYear, End If.

BigBen 22.03.2022 15:43

используйте wb0.close вместо ссылки на окно файла ... более того: нет смысла использовать now() дважды - это может быть по-другому!

Ike 22.03.2022 15:44

У вас есть доступ для записи в C:\Temp? Папка C:\Temp\2022 существует? Файл с таким именем не существует (и защищен от записи)?

FunThomas 22.03.2022 16:10

@FunThomas, спасибо! Фактически, я использую другой путь к папке в коде макроса, который я пытаюсь использовать. Поскольку путь к папке показывал название компании, я просто решил удалить его из пути к папке, прежде чем публиковать код здесь. Не думал, что это может вызвать путаницу. Извинения. Я изменю код и сделаю репост.

Seema 23.03.2022 11:25

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

FunThomas 23.03.2022 11:34

Я разместил отредактированные коды после предложений. Путь к папке по-прежнему выглядит немного странно, потому что между ними отображается «abcd». Мне пришлось скрыть имя пользователя и название компании из соображений соответствия. При пошаговом выполнении макрос работает нормально, но если я его запускаю, я получаю ошибку времени выполнения. Не могли бы вы предложить что-нибудь?

Seema 23.03.2022 11:35

@FunThomas, если папка не существует, код создает папку. Успешно это делает. И у меня есть доступ на запись в папку.

Seema 23.03.2022 11:38
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
7
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Путем проб и ошибок и поиска в Google я понял, что эта ошибка времени выполнения «сбой метода сохранения объекта _workbook» возникает при попытке сохранить файл как xlsx. Если выбран формат файла xls, макрос работает отлично. Но я предпочитаю, чтобы файл сохранялся в формате xlsx.

https://techcommunity.microsoft.com/t5/excel/solved-quot-method-saveas-of-object-workbook-failed-quot-1004/m-p/3249728

https://support.microsoft.com/en-us/topic/error-message-when-you-run-a-visual-basic-for-applications-macro-in-excel-method-saveas-of-object- рабочий лист-сбой-376fcbb2-9941-f34d-1aba-ca602903245f

Поскольку мой макрос создает папку, если она не существует, а также сохраняет файл с указанным именем, я просто решил пропустить это сообщение об ошибке, используя On Error Resume Next Теперь макрос работает должным образом. Ниже приведен код, который я использовал.

Sub Copy_Data()

Dim ThisYear As String
Dim fdObj As Object
Dim wbO As Workbook

ThisYear = Format(Date, "YYYY")

Application.DisplayAlerts = False
Application.ScreenUpdating = False

Set fdObj = CreateObject("Scripting.FileSystemObject")

If Not fdObj.FolderExists("C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear) Then
fdObj.CreateFolder ("C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear)
End If

Sheet1.UsedRange.Copy

Set wbO = Workbooks.Add
Range("A1").PasteSpecial xlPasteAll

On Error Resume Next

wbO.SaveAs Filename: = "C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear & "\Data_New_" & Format(Now(), "ddmmyyyy"), FileFormat:=51

wbO.Close

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

Другие вопросы по теме