VBA extraheren

In dit artikel wordt uitgelegd hoe een datum uit een bestandsnaam gehaald kan worden met behulp van VBA. Dit proces wordt ook wel extraheren genoemd.

Voorbeeld 1

De bestandsnamen kunnen er als volgt uit zien:

• IMG-20170213-WA0000.jpg
20170722_220815.jpg

Om de datum te extraheren uit deze bestandsnamen kunnen de onderstaande twee oplossingen gebruikt worden.

Oplossing 1

Een manier om de datum uit de bestandsnaam te extraheren is om een herhaling te maken die telkens vanaf een ophogende startpositie controleert of de aansluitende gegevensreeks van 8 karakters numeriek is en de daarop volgende karakter niet.

Function datumStandaard(Bestandsnaam)

    For i = 1 To Len(Bestandsnaam)

        If IsNumeric(Mid(Bestandsnaam, i, 8)) = True And Not IsNumeric(Right(Mid(Bestandsnaam, i + 1, 8), 1)) Then
        
            datumStandaard = Mid(Bestandsnaam, i, 8)
            Exit For
        
        End If
    
    Next i
    
End Function

Oplossing 2

Om in de plaats van zelf een algoritme te bedenken, zoals bij oplossing 1, kan er gebruik gemaakt worden van de functie Regular Expression. Hierbij hoeft alleen een patroon opgegeven te worden. In dit voorbeeld bestaat het patroon uit 8 getallen, oftewel 8 digits: "\d{8}". Deze patronen kunnen via deze website worden gegenereerd.

Function datumRegEx(Bestandsnaam, Patroon)

    Dim RegEx As Object
    Dim Overeenkomst, Overeenkomsten
    
    Set RegEx = CreateObject("VBScript.RegExp")
    
    RegEx.Pattern = Patroon
    
    Set Overeenkomsten = RegEx.Execute(Bestandsnaam)
    
    For Each Overeenkomst In Overeenkomsten
  
        datumRegEx = Overeenkomst.Value
        Exit For
    
    Next Overeenkomst
    
End Function

Voorbeeld 2

Het eerste voorbeeld is relatief simpel. Het onderstaande voorbeeld is een stuk complexer:

  • 23423_5 aug 2017-idz
  • 23423_06 aug 2017-idz
  • date created: 7 september 2017 -end
  • datum: 21-10-2017 afgeleverd
  • gereed gemaakt op 08.08.2017
  • 9-8-2017

Om conform de eerste oplossing van het eerste voorbeeld zelf een algoritme te bedenken is uitermate ingewikkeld.

Het (laten) samenstellen van het patroon voor de Regular Expression is velen malen simpeler. Het patroon in dit voorbeeld is
"\d{1,2} [a-zA-Z]+ \d{4}|\d{1,2}([-.])\d{1,2}\1\d{4}" en kan als volgt worden uitgelegd.

Reg Exp Onderdeel Toelichting
\d{1,2} dag 1 of 2 getallen (digits)
[a-zA-Z]+ maand woord + spatie
\d{4} jaar 4 getallen (digits)
| OF
\d{1,2} dag 1 of 2 getallen (digits)
([-.]) - of een .
\d{1,2} maand 1 of 2 getallen (digits)
\1 komt overeen met de 1e vergelijking
\d{4} jaar 4 getallen (digits)

Download hier de toepassing.