Ricerca…


Cartelle di lavoro dell'applicazione

In molte applicazioni Excel, il codice VBA accetta azioni dirette alla cartella di lavoro in cui è contenuta. Si salva quella cartella di lavoro con un'estensione ".xlsm" e le macro VBA si concentrano solo sui fogli di lavoro e sui dati all'interno. Tuttavia, spesso è necessario combinare o unire i dati di altre cartelle di lavoro o scrivere alcuni dei tuoi dati in una cartella di lavoro separata. Aprire, chiudere, salvare, creare e cancellare altre cartelle di lavoro è una necessità comune per molte applicazioni VBA.

In qualsiasi momento nell'Editor VBA, è possibile visualizzare e accedere a qualsiasi cartella di lavoro attualmente aperta da tale istanza di Excel utilizzando la proprietà Workbooks dell'oggetto Application . La documentazione MSDN la spiega con riferimenti.

Quando utilizzare ActiveWorkbook e ThisWorkbook

È una best practice VBA per specificare sempre quale cartella di lavoro si riferisce al codice VBA. Se questa specifica viene omessa, VBA assume che il codice sia indirizzato alla cartella di lavoro attualmente attiva ( ActiveWorkbook ).

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

Tuttavia, quando più cartelle di lavoro sono aperte contemporaneamente - in particolare e in particolare quando il codice VBA è in esecuzione da un componente aggiuntivo di Excel - i riferimenti a ActiveWorkbook potrebbero essere confusi o indirizzati male. Ad esempio, un componente aggiuntivo con una UDF che controlla l'ora del giorno e lo confronta con un valore memorizzato su uno dei fogli di lavoro del componente aggiuntivo (che in genere non sono facilmente visibili all'utente) dovrà identificare esplicitamente quale cartella di lavoro è essere referenziato. Nel nostro esempio, la nostra cartella di lavoro aperta (e attiva) ha una formula nella cella A1 =EarlyOrLate() e NON ha alcun VBA scritto per quella cartella di lavoro attiva. Nel nostro componente aggiuntivo, abbiamo la seguente funzione definita dall'utente (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

Il codice per l'UDF viene scritto e memorizzato nel componente aggiuntivo di Excel installato. Usa i dati memorizzati su un foglio di lavoro nel componente aggiuntivo chiamato "WatchTime". Se l'UDF avesse utilizzato ActiveWorkbook invece di ThisWorkbook , non sarebbe mai stato in grado di garantire quale cartella di lavoro era destinata.

Aprire una (nuova) cartella di lavoro, anche se è già aperta

Se desideri accedere a una cartella di lavoro che è già aperta, ottenere il compito dall'insieme di Workbooks è semplice:

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

Se si desidera creare una nuova cartella di lavoro, utilizzare l'oggetto di raccolta Workbooks per Add una nuova voce.

Dim myNewWB as Workbook
Set myNewWB = Workbooks.Add

Ci sono momenti in cui non puoi o (o ti importi) se la cartella di lavoro che ti serve è già aperta o no, o se non esiste. La funzione di esempio mostra come restituire sempre un oggetto di cartella di lavoro valido.

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

Salvataggio di una cartella di lavoro senza chiedere l'utente

Salvare spesso nuovi dati in una cartella di lavoro esistente utilizzando VBA causerà una domanda a comparsa che informa che il file esiste già.

Per evitare questa domanda pop-up, devi sopprimere questi tipi di avvisi.

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

Modifica del numero predefinito di fogli di lavoro in una nuova cartella di lavoro

Il numero "factory default" di fogli di lavoro creati in una nuova cartella di lavoro di Excel è generalmente impostato su tre. Il tuo codice VBA può impostare esplicitamente il numero di fogli di lavoro in una nuova cartella di lavoro.

'--- 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow