При открытии двух книг в visual basic переменные книги не назначаются правильно
При выполнении кода ниже я получаю различные результаты в зависимости от того, какие книги открыты. Sub находится в модуле, связанном с Master Sheet.xlsm
Если просто
Master Sheet.xlsm
открыть, то код выполняется правильно, т. е. в окнах сообщений говорится (где запятая разделяет первое и второе окна сообщений): мастер-лист, переданные случаи 03-09-18Если оба
Master Sheet.xlsm
иtransferred cases 03-09-18.xlsx
открыты, ноtransferred cases 03-09-18.xlsx
был открыт второй, то окна сообщений говорят: перенесенные случаи 03-09-18, переданные дела 03-09-18-
Если оба
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 ответа:
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, "\")))
принимает последний элемент разбитого массива на\
.