Поиск…


Приложения

Во многих приложениях 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow