При открытии двух книг в visual basic переменные книги не назначаются правильно


При выполнении кода ниже я получаю различные результаты в зависимости от того, какие книги открыты. Sub находится в модуле, связанном с Master Sheet.xlsm

  1. Если просто Master Sheet.xlsm открыть, то код выполняется правильно, т. е. в окнах сообщений говорится (где запятая разделяет первое и второе окна сообщений): мастер-лист, переданные случаи 03-09-18

  2. Если оба Master Sheet.xlsm и transferred cases 03-09-18.xlsx открыты, но transferred cases 03-09-18.xlsx был открыт второй, то окна сообщений говорят: перенесенные случаи 03-09-18, переданные дела 03-09-18

  3. Если оба Master Sheet.xlsm и transferred cases 03-09-18.xlsx открыты, но Master Sheet.xlsm был открыт второй, то окна сообщений говорят: мастер-лист, мастер-лист


Sub foo()
    Dim x As Workbook
    Dim y As Workbook

   '## Open both workbooks first:
   Set x = Workbooks.Open("C:UsersownerDocumentsExelatecOutputMaster Sheet.xlsm")
   Set y = Workbooks.Open("C:UsersownerDocumentsExelatecOutputtransferred cases 03-09-18.xlsx")

   'Now, copy what you want from x:
   MsgBox x.Name
   MsgBox y.Name

End Sub

Почему переменные x и y не назначаются правильно.

3 2

3 ответа:

Workbooks.Open всегда возвращайте последний открытый файл (даже если он не является переданным в параметре). Это либо плохая документация, либо ошибка в excel IMO.

Вам не нужно проверять, открыт ли файл, так как открытие уже открытого файла не вызывает ошибки, но вам нужно установить переменную позже:

Workbooks.Open "C:\Users\owner\Documents\ExelatecOutput\Master Sheet.xlsm": Set x = Workbooks("Master Sheet.xlsm") ' or Set x = ActiveWorkbook since Open will activate it
Workbooks.Open "C:\Users\owner\Documents\ExelatecOutput\transferred cases 03-09-18.xlsx": Set y = Workbooks("transferred cases 03-09-18.xlsx") ' or Set y = ActiveWorkbook since Open will activate it

Просто заметьте, что вы можете проверить, открыты ли книги с помощью такой функции, как эта, где вы передаете имя книги.

Public Function BookOpen(strBookName As String) As Boolean

    Dim oBk As Workbook
    On Error Resume Next
    Set oBk = Workbooks(strBookName)
    On Error GoTo 0
    If oBk Is Nothing Then
        BookOpen = False
    Else
        BookOpen = True
    End If

End Function

Если он возвращает true, Вы можете set x = Workbooks("your workbook name")

При присвоении переменной Workbook значения Workbooks.Open() подразумевается, что книга, которая должна быть открыта, закрыта. В противном случае он берет либо последнюю открытую книгу с Workbooks.Open(), либо книгу, в которой находится код, если все книги уже открыты.

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

Если есть открытая рабочая книга, затем закройте ее:


Другой более быстрый вариант состоит в том, чтобы назначить переменную явно, как упоминалось Винсентом G , который быстрее , потому что вы не собираетесь закрывать уже открытый файл Excel:

Sub TestMe()

    Dim x As Workbook
    Dim y As Workbook
    Dim xPath As String: xPath = "C:\Book1.xlsx"
    Dim yPath As String: yPath = "C:\Book2.xlsx"

    Workbooks.Open xPath
    Set x = Workbooks(Split(xPath, "\")(UBound(Split(xPath, "\"))))
    Workbooks.Open yPath
    Set y = Workbooks(Split(yPath, "\")(UBound(Split(yPath, "\"))))

    Debug.Print x.Name
    Debug.Print y.Name

End Sub

Часть кода Split(xPath, "\")(UBound(Split(xPath, "\"))) принимает последний элемент разбитого массива на \.