Ошибка времени выполнения '438' -только иногда - PullRequest
0 голосов
/ 15 мая 2018

Я получаю это сообщение об ошибке, но только при первом запуске кода VBA. Если я запускаю его снова после ошибки, это работает. Этот код редактируется в соответствии с тем, что я понял из первого ответа Любая помощь будет принята с благодарностью.


Новый код

Sheets("Sheet1").Copy
Dim wb As Workbook
Set wb = ActiveWorkbook.Sheets("Sheet1").Add

'this creates the "Save as". Change sheets as to your sheet. The new
'workbook is now the active one
strFileName = "C:\Users\" & Sheets("Sheet1").Name & ".xls"
ActiveWorkbook.SaveAs Filename:=Range("B4").Value & Range("E6").Value & " vs " _
& Range("E7").Value & " - " & Format(Date, "dd-mm-yyyy")
wb.Close

Оригинальный код вопроса:

strFileName = "C:\Users\" & Sheets("Sheet1").Name & ".xls"
If strFileName = "False" Then Exit Sub
ActiveWorkbook.SaveAs Filename:=Range("B4").Value & Range("E6").Value & " vs " _
& Range("E7").Value & " - " & Format(Date, "dd-mm-yyyy")
ActiveWorkbook.Close0

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Что вы пытаетесь сделать с этим? Set wb = ActiveWorkbook.Sheets("Sheet1").Add? У объекта Sheet нет метода Add. Это ошибка 438.

Чтобы создать новую книгу во время выполнения, вы можете использовать метод Workbooks.Add

Set wb = Workbooks.Add

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

Dim ws as Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Copy   ' If Destination isn't specified, this creates a new workbook
Dim wb As Workbook
Set wb = ActiveWorkbook ' The newly created workbook is Active now

strFileName = "C:\Users\" & ws.Name & ".xls" '<~~ this variable is never used, it doesn't do anything. You may want to remove it to avoid ambiguity.

wb.SaveAs Filename:=Range("B4").Value & Range("E6").Value & " vs " _
& Range("E7").Value & " - " & Format(Date, "dd-mm-yyyy")
wb.Close

ПРИМЕЧАНИЕ : если значения, которые вы используете для получения Filename, не существуют на листе 1, это может вызвать ошибку или сохранить как-нибудь другое, неожиданное имя файла. Рекомендуется всегда полностью квалифицировать объекты диапазона , в противном случае в Excel по умолчанию предполагается, что они находятся на том рабочем листе, который активен во время выполнения.

0 голосов
/ 15 мая 2018

Для объектов книги нет .Close0.

Эта строка:

ActiveWorkbook.Close0

должна быть:

ActiveWorkbook.Close

Примечания:

  • У вас есть возможность указать, хотите ли вы сохранить изменения с помощью ActiveWorkbook.Close SaveChanges:=True или ActiveWorkbook.Close SaveChanges:=False

  • Если у вас открыто более одной рабочей книгиОдновременно использование ActiveWorkbook.Close может привести к закрытию книги, отличной от ожидаемой.Обычно лучше использовать один из следующих вариантов:

    1. ThisWorkbook.Close - Если закрываемая книга - это та, в которой содержится код
    2. Workbooks("Name").Close - Если вы нене иметь рабочую книгу в качестве переменной И закрытая рабочая книга - это не та, с кодом.Однако этот метод не рекомендуется, так как он включает в себя жесткое кодирование имени книги в коде.Это может привести к сбою кода в случае изменения имени.
    3. wbk.Close - Где wbk - это объект книги, ссылающийся на / содержащий книгу, которую вы хотите закрыть

  • Если рабочая книга уже существует, для нее можно задать такую ​​переменную, как:

this

Dim wkb as Workbook
Set wkb = Workbooks("Name")

или

Dim wkb as Workbook
Set wkb = Workbooks.Open("FileName")

  • Если рабочая книга была создана недавно, для нее можно задать такую ​​переменную, как:

this

Dim wkb as Workbook
Set wkb = Workbooks.Add

или

' Although the previous method is preferred
Dim wkb as Workbook
Workbooks.Add
Set wkb = ActiveWorkbook

Редактировать:

Понял, что вы пытались использовать ActiveWorkbook.Close 0 для обозначения True/Falseдля SaveChanges, но, вероятно, было бы лучше использовать True/False вместо -1,0,1 и т. д.

...