Menu Sluiten

Bestand openen met een macro

Bestanden openen met een macro VBA

In eerdere artikelen heb ik al een beetje de basis uitgelegd van het onderwerp dat ik nu wil gaan behandelen. Simpelweg een bestand openen met een macro staat al beschreven in de eerste paragraaf van dit artikel. Nu wil ik in dit artikel iets meer de diepte in gaan. Stel dat je namelijk een bestand wilt openen waarvan je niet exact de naam weet. Door een Do Loop te combineren met string functies kom je al een heel eind. Of je wilt het bestand openen binnen een folder dat als laatste is aangemaakt.  Ik zal een aantal voorbeelden uitwerken van mogelijke situaties die ik in de praktijk ben tegengekomen. 

 

Open het laatst gewijzigde Excel bestand in een folder

Om het laatst gewijzigde Excel bestand in een folder te openen moeten wij een aantal stappen doorlopen. We beginnen met het vastleggen van de folder en de bestandsnaam. De folder is een vast gegeven dus daarvoor geven wij een string mee. De bestandsnaam weet je in dit geval nog niet. Je weet alleen dat de extensie de letters xl bevat, omdat het een Excel bestand betreft. We maken dan hier gebruik van de Dir functie i.c.m. wildcards (sterretjes) in de bestandsnaam. Indien er nu één of meer Excel bestanden in de betreffende folder zit zal de eerste bestandsnaam in de variabele ‘mijnBestand’ worden opgeslagen. Als hij niets vindt zal deze variabele leeg blijven.

Door middel van de functie FileDateTime halen we de datum plus tijdstip van de laatste wijziging in het bestand op. Deze voeren wij uit in een Do loop die door alle bestanden in de folder kijkt. Heeft het bestand de laatste wijziging gehad vergeleken met de bestanden die hij daarvoor gezien heeft dan slaat hij deze op, totdat de loop alle bestanden in de folder heeft behandeld. Indien er geen Excel bestand in de map zit zal de variabele ‘GevondenBestand’ na de loop leeg blijven. Vandaar dat wij er netjes een specifieke Error handling omheen plaatsen die het script doorzet naar een Msgbox. Zit er wel een bestandsnaam inclusief volledig pad dan is dat het laatst gewijzigde bestand uit de folder.

Sub OpenLaatstGewijzigdBestand()

    mijnFolder = "D:\Test"
    mijnBestand = Dir(mijnFolder & "\*.xl*")
    laatstGewijzigd = 0
    
    Do While Len(mijnBestand) > 0
        datumTijdGewijzigd = FileDateTime(mijnFolder & "\" & mijnBestand)
        If datumTijdGewijzigd > laatstGewijzigd Then
            laatstGewijzigd = datumTijdGewijzigd
            gevondenBestand = mijnFolder & "\" & mijnBestand
        End If
        mijnBestand = Dir
    Loop
    
    On Error GoTo GeenFileGevonden
    Set WbGevonden = Workbooks.Open(Filename:=gevondenBestand)
    On Error GoTo -1
    
    Exit Sub
    
GeenFileGevonden:
    
    MsgBox "Helaas hebben we geen bestand gevonden dat aan je voorwaarden voldoet."
    
End Sub

Open met een macro het laatst aangemaakte Excel bestand 

Voor deze actie gebruiken wij veel onderdelen uit het eerste voorbeeld. Om de aanmaakdatum op te halen maken wij nu eerst een FileSystemObject aan. Door daarna een Getfile functie te gebruiken haal je nu een serie eigenschappen op van het Excel bestand dat op dat moment wordt bekeken. Met de eigenschap datecreated heb je nu de aanmaakdatum te pakken. Verder is de code gelijk aan de code uit het eerste voorbeeld.

Sub OpenLaatstAangemaakteBestand()

    Set fso = CreateObject("Scripting.FileSystemObject")
    mijnFolder = "D:\Test"
    mijnBestand = Dir(mijnFolder & "\*.xl*")
    laatstAangemaakt = 0
    
    Do While Len(mijnBestand) > 0
        Set F = fso.GetFile(mijnFolder & "\" & mijnBestand)
        datumTijdAangemaakt = F.datecreated
        If datumTijdAangemaakt > laatstAangemaakt Then
            laatstAangemaakt = datumTijdAangemaakt
            gevondenBestand = mijnFolder & "\" & mijnBestand
        End If
        mijnBestand = Dir
    Loop
    
    On Error GoTo GeenFileGevonden
    Set WbGevonden = Workbooks.Open(Filename:=gevondenBestand)
    On Error GoTo -1
    
    Exit Sub
    
GeenFileGevonden:
    
    MsgBox "Helaas hebben we geen bestand gevonden dat aan je voorwaarden voldoet."
    
End Sub

Open het grootste Excel bestand met een macro

Net als bij het vorige voorbeeld maken wij hiervoor gebruik van het Filesystemobject om eigenschappen van het Excel bestand op te halen. Deze keer halen we de ‘size’ op. Dan vergelijken we in een loop of de ‘size’ groter is dan de het grootste formaat tot dat moment.

Sub OpenLaatstAangemaakteBestand()

    Set fso = CreateObject("Scripting.FileSystemObject")
    mijnFolder = "D:\Test"
    mijnBestand = Dir(mijnFolder & "\*.xl*")
    grootsteFormaat = 0
    
    Do While Len(mijnBestand) > 0
        Set F = fso.GetFile(mijnFolder & "\" & mijnBestand)
        FormaatBestand = F.Size
        If FormaatBestand > grootsteFormaat Then
            grootsteFormaat = FormaatBestand
            gevondenBestand = mijnFolder & "\" & mijnBestand
        End If
        mijnBestand = Dir
    Loop
    
    On Error GoTo GeenFileGevonden
    Set WbGevonden = Workbooks.Open(Filename:=gevondenBestand)
    On Error GoTo -1
    
    Exit Sub
    
GeenFileGevonden:
    
    MsgBox "Helaas hebben we geen bestand gevonden dat aan je voorwaarden voldoet."
    
End Sub

Ik heb nu meerdere opties getoond om een bepaald bestand te openen met een macro. Zit de oplossing voor jouw probleem hier toch niet bij? Laat het weten in de reacties!

Heeft dit artikel je geholpen?

2 reacties

  1. Henri Willems

    Goedemiddag,

    In een administratief moederstand zit een macro voor het omzetten van naam a in naam b. Die macro wil ik gebruiken in andere administratieve bestanden. Nu moet ik steeds de wijzigingen aanbrengen in het moederbestand en dan kopiëren naar het bestand waar ik dan mee bezig ben. Dit moet volgens mij makkelijker kunnen. Is hier een VBA regel voor te maken? Bijvoorbeeld met de functie Call? Moet de moedermacro dan in een apart bestand komen te staan?

    • MartinR

      Hoi Henri,

      Dit klinkt inderdaad omslachtig, maar om je te kunnen helpen heb ik denk ik iets meer informatie nodig? Wat voor wijzigingen breng je aan in het moederbestand? Bedoel je aan de macro of aan de data in het moederbestand? En als het alleen gaat om het omzetten van een naam, kun je die dan niet ergens wegschrijven of ophalen uit het bestand met behulp van VBA? Dit klinkt niet als een opdracht waar je telkens je code voor aan dient te passen.

      Mvg,

      Martin

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *