excel-vba
Le cartelle di lavoro
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