Buscar..


Libros de aplicación

En muchas aplicaciones de Excel, el código VBA realiza acciones dirigidas al libro de trabajo en el que está contenido. Guarda ese libro de trabajo con una extensión ".xlsm" y las macros de VBA solo se centran en las hojas de cálculo y los datos que contiene. Sin embargo, a menudo hay ocasiones en las que necesita combinar o combinar datos de otros libros, o escribir algunos de sus datos en un libro separado. Abrir, cerrar, guardar, crear y eliminar otros libros de trabajo es una necesidad común para muchas aplicaciones VBA.

En cualquier momento en el Editor de VBA, puede ver y acceder a todos y cada uno de los libros de trabajo abiertos actualmente por esa instancia de Excel utilizando la propiedad Workbooks de trabajo del objeto Application . La documentación de MSDN lo explica con referencias.

Cuándo usar ActiveWorkbook y ThisWorkbook

Es una buena práctica de VBA especificar siempre a qué libro de trabajo se refiere su código de VBA. Si se omite esta especificación, entonces VBA asume que el código está dirigido al libro activo actual ( ActiveWorkbook ).

'--- the currently active workbook (and worksheet) is implied
Range("A1").value = 3.1415
Cells(1, 1).value = 3.1415

Sin embargo, cuando se abren varios libros al mismo tiempo, especialmente cuando se ejecuta el código VBA desde un complemento de Excel, las referencias al ActiveWorkbook pueden ser confusas o mal dirigidas. Por ejemplo, un complemento con un UDF que verifica la hora del día y lo compara con un valor almacenado en una de las hojas de trabajo del complemento (que normalmente no son fácilmente visibles para el usuario) tendrá que identificar explícitamente qué libro es siendo referenciado. En nuestro ejemplo, nuestro libro abierto (y activo) tiene una fórmula en la celda A1 =EarlyOrLate() y NO tiene ningún VBA escrito para ese libro activo. En nuestro complemento, tenemos la siguiente función definida por el usuario (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

El código para el UDF se escribe y almacena en el complemento de Excel instalado. Utiliza datos almacenados en una hoja de cálculo en el complemento llamado "WatchTime". Si el UDF hubiera utilizado ActiveWorkbook lugar de ThisWorkbook , entonces nunca podría garantizar qué libro estaba destinado.

Abriendo un libro de trabajo (nuevo), incluso si ya está abierto

Si desea acceder a un libro de trabajo que ya está abierto, obtener la asignación de la colección de Workbooks es sencillo:

dim myWB as Workbook
Set myWB = Workbooks("UsuallyFullPathnameOfWorkbook.xlsx")

Si desea crear un nuevo libro, a continuación, utilizar el Workbooks objeto de la colección de Add una nueva entrada.

Dim myNewWB as Workbook
Set myNewWB = Workbooks.Add

Hay ocasiones en las que no puede o (o le importa) si el libro que necesita ya está abierto o no, o es posible que no exista. La función de ejemplo muestra cómo devolver siempre un objeto de libro válido.

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

Guardando un libro de ejercicios sin preguntar al usuario

A menudo, guardar nuevos datos en un libro de trabajo usando VBA causará una pregunta emergente que indica que el archivo ya existe.

Para evitar esta pregunta emergente, debe suprimir este tipo de alertas.

Application.DisplayAlerts = False        'disable user prompt to overwrite file
myWB.SaveAs FileName:="NewOrExistingFilename.xlsx"
Application.DisplayAlerts = True         're-enable user prompt to overwrite file

Cambiar el número predeterminado de hojas de trabajo en un nuevo libro de trabajo

El número "predeterminado de fábrica" ​​de hojas de trabajo creadas en un nuevo libro de Excel generalmente se establece en tres. Su código VBA puede establecer explícitamente la cantidad de hojas de trabajo en un nuevo libro.

'--- 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow