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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow