donderdag, 23 mei 2013 19:17

Dynamisch Filter op datum m.b.v macro geeft problemen?

Geschreven door
Beoordeel dit item
(1 Stem)
Als je met een macro en een variabele een dynamisch filter wilt maken waarbij je steeds de datum opgeeft waarop je wilt filteren heb je grote kans dat, hoewel je macro er goed uit ziet, deze als je hem draait niets 
laat zien waar je wel resultaten verwacht.
Dit wordt waarschijnlijk veroorzaakt omdat je macro in de US datum notatie gaat zoeken (MM/dd/YYYY) waar wij de datum in dd/MM/YYYY hebben staan..

Download het voorbeeldbestand hier

Hieronder 2 voorbeelden van een dynamisch filter m.b.v. VBA, in het eerste filter gebruiken we een 'gewone' string als datum om de range
$A$1:$J$30" te filteren. Je zult zien dat de resultaten hiervan niet altijd zijn zoals je verwacht:

'Deze werkt alleen als je bijvoorbeeld 05-18-13 gebruikt als datum veld
Sub FoutiefFilterOpDatum()
'

Dim tmpdate As String
tmpdate = InputBox("Datum:", "Datum", "18-05-2013")
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$J$30").AutoFilter Field:=1, Operator:= _
        xlFilterValues, Criteria2:=Array(2, tmpdate)
End Sub



Met de volgende VBA code zetten we de datum m.b.v. een eigen functie eerst om naar een seriële datum. Waarbij we Jaar, Maand en Dag uit de datum halen zodat deze altijd op de juiste volgorde vertaald worden!

'Dit filter op datum werkt altijd
Public Sub MaakDynamischFilter()

    Dim nklantnaam As String
    Dim ntmpdate As Long
    Dim ntmpdatestring As String
              

    nklantnaam = InputBox("Geef het klantnummer:", "Klantnummer", "29704")
    ntmpdatestring = InputBox("Datum:", "Datum", "1-7-2013")

    ntmpdate = CreateSerialDate(CDate(ntmpdatestring))

    Cells.Select

    Selection.AutoFilter
    Selection.AutoFilter Field:=3, Criteria1:=nklantnaam
    Selection.AutoFilter Field:=1, Criteria1:="<" & ntmpdate
    Cells.Select
End Sub

'Functie om van een gewone datum een seriële datum te maken
Function CreateSerialDate(ndate As Date) As Long

Dim dDate As Date
Dim strDate As String
Dim lDate As Long


    dDate = DateSerial(Year(ndate), Month(ndate), Day(ndate))
    lDate = dDate
    CreateSerialDate = lDate

End Function

Download het voorbeeldbestand hier



Aanvullende informatie

  • Versies: Alle versies
Lees 7440 keer Laatst aangepast op zaterdag, 25 mei 2013 07:57
Log in om reacties te plaatsen

Excel Software Shop

Web Analytics