Zoeken…
Toepassingswerkboeken
In veel Excel-toepassingen onderneemt de VBA-code acties die zijn gericht op de werkmap waarin deze is opgenomen. U slaat die werkmap op met een ".xlsm" -extensie en de VBA-macro's richten zich alleen op de werkbladen en gegevens daarin. Er zijn echter vaak momenten waarop u gegevens uit andere werkmappen moet combineren of samenvoegen of sommige van uw gegevens naar een afzonderlijke werkmap moet schrijven. Het openen, sluiten, opslaan, maken en verwijderen van andere werkmappen is een veel voorkomende behoefte voor veel VBA-toepassingen.
U kunt op elk gewenst moment in de VBA-editor alle werkmappen bekijken en openen die momenteel door dat exemplaar van Excel worden geopend met behulp van de eigenschap Workbooks
van het Application
. De MSDN-documentatie legt het uit met referenties.
Wanneer ActiveWorkbook en ThisWorkbook gebruiken
Het is een VBA Best Practice om altijd op te geven naar welke werkmap uw VBA-code verwijst. Als deze specificatie wordt weggelaten, gaat VBA ervan uit dat de code is gericht op de momenteel actieve werkmap ( ActiveWorkbook
).
'--- the currently active workbook (and worksheet) is implied
Range("A1").value = 3.1415
Cells(1, 1).value = 3.1415
Wanneer echter meerdere werkmappen tegelijkertijd zijn geopend - met name en vooral wanneer VBA-code wordt uitgevoerd vanuit een Excel-invoegtoepassing - kunnen verwijzingen naar het ActiveWorkbook
worden verward of verkeerd worden geleid. Een invoegtoepassing met een UDF die de tijd van de dag controleert en deze vergelijkt met een waarde die is opgeslagen op een van de werkbladen van de invoegtoepassing (die meestal niet goed zichtbaar is voor de gebruiker), moet expliciet identificeren welke werkmap is waarnaar wordt verwezen. In ons voorbeeld heeft onze open (en actieve) werkmap een formule in cel A1 =EarlyOrLate()
en heeft er GEEN VBA geschreven voor die actieve werkmap. In onze invoegtoepassing hebben we de volgende User Defined Function (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
De code voor de UDF wordt geschreven en opgeslagen in de geïnstalleerde Excel-invoegtoepassing. Het maakt gebruik van gegevens die zijn opgeslagen op een werkblad in de invoegtoepassing "WatchTime". Als de UDF ActiveWorkbook
plaats van ThisWorkbook
had gebruikt, zou het nooit kunnen garanderen welke werkmap was bedoeld.
Een (nieuw) werkboek openen, ook al is het al geopend
Als u toegang wilt krijgen tot een werkmap die al open is, is het verkrijgen van de opdracht uit de verzameling Workbooks
eenvoudig:
dim myWB as Workbook
Set myWB = Workbooks("UsuallyFullPathnameOfWorkbook.xlsx")
Als u een nieuwe werkmap wilt maken, gebruikt u het verzamelobject Workbooks
om een nieuw item toe te Add
.
Dim myNewWB as Workbook
Set myNewWB = Workbooks.Add
Er zijn momenten waarop u het niet of (of de zorg) kunt doen als de werkmap die u nodig hebt al open is of niet, of mogelijk niet bestaat. De voorbeeldfunctie laat zien hoe u altijd een geldig werkmapobject retourneert.
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
Een werkboek opslaan zonder de gebruiker te vragen
Vaak zal het opslaan van nieuwe gegevens in een bestaande werkmap met behulp van VBA een pop-upvraag veroorzaken die aangeeft dat het bestand al bestaat.
Om deze pop-upvraag te voorkomen, moet u dit soort waarschuwingen onderdrukken.
Application.DisplayAlerts = False 'disable user prompt to overwrite file
myWB.SaveAs FileName:="NewOrExistingFilename.xlsx"
Application.DisplayAlerts = True 're-enable user prompt to overwrite file
Het standaardaantal werkbladen in een nieuwe werkmap wijzigen
Het "fabrieksstandaard" aantal werkbladen dat in een nieuwe Excel-werkmap is gemaakt, is meestal ingesteld op drie. Uw VBA-code kan het aantal werkbladen in een nieuwe werkmap expliciet instellen.
'--- 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