После сохранения xlsm как xlsx, почему открытие нового файла закрывает старый? - PullRequest
0 голосов
/ 12 февраля 2019

Фон:
Я пытаюсь и не могу сохранить и изменить файл с кодом в формате «без кода».Я экспериментировал, и я могу открыть файл, который уже существует из .xlsm, и он работает как положено.Сценарий продолжает выполняться, и я могу изменить и закрыть второй файл из сценария первого файла:

Sub testExistingWorkbook()

    Dim wbkName As String
        wbkName = "WorkWithWorkbookTest.xlsx"

    Workbooks.Open (wbkName)
    '~~>...code to modify goes here
    Workbooks(wbkName).Close

End Sub

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

Я перепробовал много разных конфигураций, но в каждом случае скрипт останавливается, когда я открываю следующий файл.Например, приведенный ниже пример кода останавливается после «Workbooks.Open (wbkName)».В этот момент он одновременно закрывает .xlsm, действие, которое мой код, по-видимому, не запрашивает (но я думаю, должно быть неявным в коде).Первоначально я закодировал его для создания объекта при его открытии: «Set wbk2 = Workbooks.Open (wbkName)», но обнаружил, что это не работает ни в одном из сценариев.Тогда я подумал, что, возможно, это была функция «Рабочих книг», представляющих собой коллекцию всех открытых рабочих книг, поэтому, если я открою файл, который еще не был открыт, он по сути выбьет другую книгу из коллекции (глупо, Я знаю).Но эта возможность устраняется приведенным выше примером кода.Какое-то время я думал, что это может быть потому, что имя было одинаковым и каким-то образом не различало .xlsx и .xlsm, но в приведенном ниже коде используется другое имя, что приводит к одной и той же проблеме, так что это не имеет значения.

Sub testSaveAsWorkbook()

    Dim wbkName As String
        wbkName = "SuperSecretWorbookTest.xlsx"

    ThisWorkbook.SaveAs Filename:=wbkName, FileFormat:=61
    Workbooks.Open (wbkName)
    '~~>Code would go here, but the original file has closed and only
    '   the new SuperSecretWorkbookTest.xlsx is open
    Workbooks(wbkName).Close

End Sub

Вопрос:
Подумав и написав этот вопрос, я понял, что проблема действительно начинается в тот момент, когда я выполняю 'ThisWorkbook.SaveAs Имя файла: = wbkName, FileFormat: = 61 'потому что тогда первая рабочая книга закрывается, а новая рабочая книга занимает ее место.IDE просто еще не знает об этом, поэтому даже пошагово просматривая код, он понимает, что файл .xlsm больше не активен, когда пытается выполнить следующую строку кода.

Так что мой вопрос - почемуWorkbooks.Save, как закрыть первый файл, как это?И что еще более важно, что я могу сделать, чтобы сохранить мой файл открытым и завершить сценарий?

1 Ответ

0 голосов
/ 12 февраля 2019

Если вам нужно было сделать это вручную, перейдите к Файл > SaveAs , чтобы сохранить xlsm как xlsx , и нажмите«Да», чтобы продолжить сохранение в виде книги без макросов, вы увидите, что xlsm «больше не открыт» - только новая xlsx .Как и должно быть, вы сохранили его как таковой.Вызов Workbooks.Open не закрывает оригинал xlsm ;это уже прошло

Другими словами, в ответ на ваше наблюдение:

Размышляя и написав этот вопрос, я понял, что проблема действительно начинается в тот момент, когда я выполняю ThisWorkbook.SaveAs Filename:=wbkName, FileFormat:=61, потому что этоэто когда первая рабочая книга закрыта, и новая рабочая книга занимает ее место.

Это именно то, что делает SaveAs.

Workbook.SaveCopyAs "не изменяет открытую книгу в памяти. "Возможно, вы можете сначала сохранить копию, открыть ее, а затем сохранить как xlsx в конце и удалить копию xlsm .

Sub testSaveAsWorkbook1()

    Dim wbkName As String, wbkExtension As String
    wbkName = "SuperSecretWorbookTest"
    wbkExtension = ".xlsm"

    ThisWorkbook.SaveCopyAs Filename:=wbkName & wbkExtension

    Dim copyWbk As Workbook
    Set copyWbk = Workbooks.Open(wbkName)

    ' Do whatever you want with the copy

    copyWbk.SaveAs Filename:=wbkName, FileFormat:=61
    Kill copyWbk.Path & "\" & wbkName & wbkExtension
    copyWbk.Close SaveChanges:=False

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...