Поиск…
Приложения
Во многих приложениях Excel код VBA выполняет действия, направленные на книгу, в которой он содержится. Вы сохраняете эту книгу с расширением «.xlsm», а макросы VBA фокусируются только на рабочих листах и данных внутри. Однако часто бывает, когда вам нужно объединять или объединять данные из других книг или записывать некоторые данные в отдельную книгу. Открытие, закрытие, сохранение, создание и удаление других книг является общей потребностью для многих приложений VBA.
В любое время в редакторе VBA вы можете просматривать и получать доступ к любым и всем рабочим книгам, которые в настоящее время открываются этим экземпляром Excel, с использованием свойства Workbooks
объекта Application
. Документация MSDN объясняет это ссылками.
Когда использовать ActiveWorkbook и эту книгу
Это лучшая практика VBA, чтобы всегда указывать ту книгу, на которую ссылается ваш код VBA. Если эта спецификация опущена, то VBA предполагает, что код направлен на ActiveWorkbook
рабочую книгу ( ActiveWorkbook
).
'--- the currently active workbook (and worksheet) is implied
Range("A1").value = 3.1415
Cells(1, 1).value = 3.1415
Однако, когда несколько книг одновременно открыты - особенно, особенно, когда код VBA запущен из надстройки Excel, ссылки на ActiveWorkbook
могут быть сбиты с толку или неправильно направлены. Например, надстройка с UDF, которая проверяет время суток и сравнивает ее со значением, хранящимся на одном из рабочих листов надстройки (которые обычно не видны пользователю), должно будет явно определить, какая книга ссылаясь. В нашем примере наша открытая (и активная) рабочая тетрадь имеет формулу в ячейке A1 =EarlyOrLate()
и не имеет никакого VBA, написанного для этой активной книги. В нашей надстройке мы имеем следующую пользовательскую функцию (UDF):
Public Function EarlyOrLate() As String
If Hour(Now) > ThisWorkbook.Sheets("WatchTime").Range("A1") Then
EarlyOrLate = "It's Late!"
Else
EarlyOrLate = "It's Early!"
End If
End Function
Код для UDF записывается и сохраняется в установленной надстройке Excel. Он использует данные, хранящиеся на листе в надстройке под названием «WatchTime». Если UDF использовал ActiveWorkbook
вместо ThisWorkbook
, тогда он никогда не сможет гарантировать, какая книга была предназначена.
Открытие книги (новая), даже если она уже открыта
Если вы хотите открыть книгу, которая уже открыта, то получение задания из коллекции Workbooks
является простым:
dim myWB as Workbook
Set myWB = Workbooks("UsuallyFullPathnameOfWorkbook.xlsx")
Если вы хотите создать новую книгу, а затем использовать Workbooks
объект коллекции , чтобы Add
новую запись.
Dim myNewWB as Workbook
Set myNewWB = Workbooks.Add
Бывают случаи, когда вы не можете или (или не заботитесь), если рабочая книга, которая вам нужна, уже открыта или нет, или возможно, не существует. Примерная функция показывает, как всегда возвращать действительный объект рабочей книги.
Option Explicit
Function GetWorkbook(ByVal wbFilename As String) As Workbook
'--- returns a workbook object for the given filename, including checks
' for when the workbook is already open, exists but not open, or
' does not yet exist (and must be created)
' *** wbFilename must be a fully specified pathname
Dim folderFile As String
Dim returnedWB As Workbook
'--- check if the file exists in the directory location
folderFile = File(wbFilename)
If folderFile = "" Then
'--- the workbook doesn't exist, so create it
Dim pos1 As Integer
Dim fileExt As String
Dim fileFormatNum As Long
'--- in order to save the workbook correctly, we need to infer which workbook
' type the user intended from the file extension
pos1 = InStrRev(sFullName, ".", , vbTextCompare)
fileExt = Right(sFullName, Len(sFullName) - pos1)
Select Case fileExt
Case "xlsx"
fileFormatNum = 51
Case "xlsm"
fileFormatNum = 52
Case "xls"
fileFormatNum = 56
Case "xlsb"
fileFormatNum = 50
Case Else
Err.Raise vbObjectError + 1000, "GetWorkbook function", _
"The file type you've requested (file extension) is not recognized. " & _
"Please use a known extension: xlsx, xlsm, xls, or xlsb."
End Select
Set returnedWB = Workbooks.Add
Application.DisplayAlerts = False
returnedWB.SaveAs filename:=wbFilename, FileFormat:=fileFormatNum
Application.DisplayAlerts = True
Set GetWorkbook = returnedWB
Else
'--- the workbook exists in the directory, so check to see if
' it's already open or not
On Error Resume Next
Set returnedWB = Workbooks(sFile)
If returnedWB Is Nothing Then
Set returnedWB = Workbooks.Open(sFullName)
End If
End If
End Function
Сохранение книги без запроса пользователя
Зачастую сохранение новых данных в существующей книге с помощью VBA вызовет всплывающий вопрос, отметив, что файл уже существует.
Чтобы предотвратить этот всплывающий вопрос, вам необходимо подавить эти типы предупреждений.
Application.DisplayAlerts = False 'disable user prompt to overwrite file
myWB.SaveAs FileName:="NewOrExistingFilename.xlsx"
Application.DisplayAlerts = True 're-enable user prompt to overwrite file
Изменение стандартного количества рабочих листов в новой рабочей книге
Заданное по умолчанию количество рабочих листов, созданных в новой книге Excel, обычно равно трем. Ваш код VBA может явно указывать количество рабочих листов в новой книге.
'--- save the current Excel global setting
With Application
Dim oldSheetsCount As Integer
oldSheetsCount = .SheetsInNewWorkbook
Dim myNewWB As Workbook
.SheetsInNewWorkbook = 1
Set myNewWB = .Workbooks.Add
'--- restore the previous setting
.SheetsInNewWorkbook = oldsheetcount
End With