Vergelijking datum in bestandsnaam en huidig jaar werkt niet

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Mijn vraag stel ik nu volledig anders daar de draad volledig kwijt is in een vorig topic waarvan ik de webmaster vriendelijk heb verzocht deze te verwijderen.

Het is de bedoeling dat als het boekjaar in de bestandsnaam lager is dan het huidige jaar, de msgbox verschijnt. Als het boekjaar het huidige is dan mag de msgbox niet verschijnen en moet het bestand gewoon direct worden geopend.

Ik zie het even niet terwijl ik 1000% zeker ben dat het antwoord gewoon voor mijn neus ligt in de code. Mijn idee is dat ik het jaartal uit de bestandsnaam een format moet geven, maar hier heb ik verschillende pogingen gedaan: Bijvoorbeeld: If Format(Mid(ThisWorkbook.Name, 12, 5), Year(Date)) < Year(Date) Then.

Kenners zullen zien dat dit niet werkt.

Ik heb de code teruggebracht naar hoe ik deze in eerste had gemaakt. Graag uw medewerking.

Alvast bedankt.

Code:
    If Mid(ThisWorkbook.Name, 12, 5) <> Year(Date) Then
    
    Select Case MsgBox("Let op U wilt boekjaar " & Mid(ThisWorkbook.Name, 12, 5) & " openen." & vbNewLine & vbNewLine & "Dit betreft een oud      boekjaar. Wilt u deze openen?", vbYesNo + vbInformation, "Oud Boekjaar")
        Case Is = vbYes
            Call Vervolg
        Case Is = vbNo
            Call Afsluiten
    End Select
    End If 

Private sub Vervolg()
    Frm_005.CheckBox1.Value = False
    Frm_001.Show

End sub
 
Laatst bewerkt:
Misschien handig om er ook even een voorbeeld van een bestandsnaam bij te doen want een jaartal met een lengte van 5 zitten we voolopig nog niet aan.
 
Laatst bewerkt:
Sorry Edmoor. Je hebt gelijk. Ik heb dit stukje geknipt vanuit het topic wat ik heb laten verwijderen of nog verwijderd moet worden, hier geplakt en een beetje aangepast. Kennelijk te ver, want het stukje bestandsnaam staat er inderdaad niet bij. Had ik even niet in de gaten.

De volledige bestandsnaam is als volgt:

Boekhouding 2014.xlsm

Als dit goed is dan moet middels de code hier enkel 2014 gebruikt worden. Waar mijn vermoeden is, is dat het ene tekst is en het andere een getal. In dit geval een datum. Dit zou mijn inzien problemen kunnen geven.
 
Laatst bewerkt:
Na veel puzzelen kom ik uit op het volgende. Echter Year(Date) heb ik als test zijnde even veranderd in 2015. Op deze wijze werkt het wel, maar zo wil ik het niet hebben. Ik wil gewoon een code hebben die gewoon op het huidige jaar reageert. Dit omdat het bestand over meerdere jaren gebruikt wordt en ook omdat ik dan niet telkens de code handmatig wil wijzigen.

Voor het gemak heb ik de volledige code uit ThisWorkbook hieronder geplaatst. Ook heb ik de bestandsnamen veranderd in Boekhouding_2014.xlsm

Ik heb de spatie hierin verwijderd en vervangen door een underlayment. Nu weet ik niet of Mid(ThisWorkbook.Name, 13, 4) kan omgaan met spaties, maar volgens mij maakte het totaal niets uit en kreeg ik de code pas werkend toen ik direct het huidige jaar in de code plaatste.

Ik hoor het wel, maar mijn idee is dat het in de format of iets dergelijks zit.

Code:
Private Sub WorkBook_Open()
    Sheets("Wachtwoord").Select
    
    With Application
        .ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
        .DisplayFormulaBar = False
        .DisplayStatusBar = False
        .OnKey "%{F8}", ""
        .OnKey "%{F11}", ""
    End With

    With ActiveWindow
        .DisplayWorkbookTabs = False
        .DisplayHeadings = False 'Speciaal enkel voor het eerste opstarten van sheets("Wachtwoord")
    End With
    
    MsgBox Mid(ThisWorkbook.Name, 13, 4)
    
    If Mid(ThisWorkbook.Name, 13, 4) <> 2015 Then
        Select Case MsgBox("Let op U wilt boekjaar " & Mid(ThisWorkbook.Name, 13, 4) & " openen." & vbNewLine & vbNewLine & "Dit betreft een oud boekjaar. Wilt u deze openen?", vbYesNo + vbInformation, "Oud Boekjaar")
            Case Is = vbYes
                Call Openen
            Case Is = vbNo
                With Application
                    .DisplayAlerts = False
                    .Quit
                End With
        End Select
    Else
        Call Openen
    End If
        
End Sub

Private Sub Openen()
    Frm_005.CheckBox1.Value = False
    frm_001.Show
        
End Sub
 
Laatst bewerkt:
Maak er eens dit van:
If Mid(ThisWorkbook.Name, 13, 4) <> Cstr(Year(Date)) Then

De functie Mid(ThisWorkbook.Name, 13, 4) levert namelijk een String op en Year(Date) levert een Long Integer op. Die kan je dus niet direct met elkaar vergelijken. De functie Cstr(Year(Date)) zorgt ervoor dat je het huidige jaar als String terug krijgt.

Tevens nog even je code bekeken wat structuur betreft. Dat heb je precies gedaan zoals hier altijd wordt geadviseerd wat betreft inspringpunten en het gebruik van de With constructie. Prima dus. Toch zou ik het qua leesbaarheid nog net iets anders doen:

Code:
Private Sub WorkBook_Open()
    Dim DocumentJaar As Integer
    Dim HuidigJaar As Integer
    Dim Antwoord As Long
    
    Sheets("Wachtwoord").Select
    
    With Application
        .ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
        .DisplayFormulaBar = False
        .DisplayStatusBar = False
        .OnKey "%{F8}", ""
        .OnKey "%{F11}", ""
    End With

    With ActiveWindow
        .DisplayWorkbookTabs = False
        .DisplayHeadings = False 'Speciaal enkel voor het eerste opstarten van sheets("Wachtwoord")
    End With
    
    HuidigJaar = Year(Date)
    DocumentJaar = CInt(Mid(ThisWorkbook.Name, 13, 4))

    If DocumentJaar <> HuidigJaar Then
        Antwoord = MsgBox("Let op U wilt boekjaar " & _
                DocumentJaar & " openen." & _
                vbNewLine & vbNewLine & _
                "Dit betreft een oud boekjaar. Wilt u deze openen?", _
                vbYesNo + vbInformation, "Oud Boekjaar")
                
        If Antwoord = vbNo Then
            With Application
                .DisplayAlerts = False
                .Quit
            End With
        End If
    End If
    
    Frm_005.CheckBox1.Value = False
    frm_001.Show
End Sub
 
Laatst bewerkt:
Getallen kun je beter als getallen vergelijken dan als tekst, zou ik zeggen;
Code:
CInt(Mid(ThisWorkbook.Name, 13, 4)) <> Year(Date) Then
 
Afhankelijk van wat er met het resultaat moet gebeuren heb je daar helemaal gelijk in en is het beter om dat inderdaad direct zo te doen.
 
Het jaartal uit de bestandsnaam moet gewoon vergeleken worden met het huidige jaartal. Meer niet. Zodra het jaartal van de bestandsnaam lager is dan dient het bericht te verschijnen.
 
En dat is precies wat er nu gebeurt.
 
Dus antwoord Octafish vind jij beter?

Wat mij trouwens opvalt. 2 Zaken.

Op de 1 of andere manier staat Year(Date nu geschreven als year(Date). Year staat met kleine letter en ik krijg dit niet verandert. In andere projecten staat deze wel met hoofdletter. Ik weet niet of dit wat uitmaakt of waardoor dit komt. Ik heb er in ieder geval geen problemen mee gezien. Toch vraag ik mij dit af. Tevens geldt dit ook voor Frm_001. Deze staat ook bij mij als frm_001.

Als 2e en laatste. Ik heb het al eens vaker geprobeerd. Die underscore die je gebruikte om coderegels af te breken. Ik heb dit vaker geprobeerd, ook om het hier leesbaar te krijgen en voor mij zelf makkelijker op 1 scherm, maar waarom lukt dit niet altijd.
 
Omdat het om een getal gaat is die van Octafish inderdaad beter. Dat heb ik dan ook verwerkt in mijn versie van jouw code. Het afbreken van regels doe je niet met een underscore alleen, maar met Spatie en Underscore. Die hoofdletters of kleine letters hoef je je geen zorgen om te maken als het goed werkt. VBA doet dat soms. Ik weet niet waarom.
 
Aha spatie en underscore :o Nooit te oud om te leren.

Toch nog snel een andere vraag. Wat mij opvalt is jouw manier van het gebruik messegerbox. Nu gebruik ik bij meerdere knoppen Select Case MsgBox. Ik zie dat jij de naam Antwoord hebt gegeven en dat je deze koppelt aan vbNo. Is dit een betere manier of maakt mijn wijze niet uit? Ik heb dit namelijk al eens vaker voorbij zien komen. Wellicht dat ik weer een oude gebruik uit negentien Noach.
 
Dat is afhankelijk van wat er moet gebeuren. Doordat je VbYes gebruikte moest je een extra call naar de functie Openen doen. Nu er VbNo wordt gebruikt is dat niet meer nodig. Zo hou je de code korter omdat het hele Select Case statement eruit kon.

Overigens heb ik net de code in #5 nog iets aangepast omdat hij op een verkeerd moment de vraag ging stellen.
Tevens kan je die 2 regeltjes uit de Sub Openen nu daar zetten waar Call Openen staat en kan de Sub Openen helemaal verdwijnen.
 
Laatst bewerkt:
Aha 2 knoppen waarvan er eigenlijk maar 1 een echte functie heeft, omdat dat stukje wordt ondervangen in de vervolgcode als je in dit geval vbYes aanklikt. Hierdoor is de select case dus onzin. Mooi dat ik dat ook weer weet, want ik heb bij in andere msgbox een zelfde iets. Alleen hierin benoemde ik nooit wat er moest gebeuren. Sterker nog deze kwam dan helemaal niet in mijn Case verhaal voor.

Ik had inderdaad al een paar problemen met de code. Ik was er al mee bezig. Als het nodig is dan plak ik jouw aangepaste code er gewoon overheen.
 
Ze hebben beide een echte functie maar je hoeft maar bij 1 van de 2 daadwerkelijk iets te doen. Dat is de achterliggende gedachte.
 
Dat bedoel ik. Mooi ook weer opgelost. Kan ik weer ademhalen en mij druk maken om een ander stuk. Het is niets, maar omdat je in VBS steeds meer handigheid krijgt, al is het nog niet vergelijkbaar met jullie. Sta je gewoon met samenvoegen van een aantal bestanden meteen oude bestanden uit bijvoorbeeld 2013 aan te passen.
 
Duidelijkheid is alles in dit soort dingen, vandaar ook even de volgende opmerking m.b.t. je tekst in #16:
VBS = Visual Basic Script
VBA = Visual Basic for Applications

;)
 
Foutje. Heb je wel eens met blind typen en niet controleren.

Bedankt weer Edmoor.

Case Is = Closed
Application.Quit
 
Sub ReOpen()

Beste Edmoor, toch nog even iets aangepast. In jouw code stond nog een klein "foutje".

In de oude opzet werd bij de Antwoord = vbNo na Application.Quit alsnog Sub Openen gecalled. Je zag Frm_001 even opkomen waarna het bestand snel werd afgesloten. Dit doorlopen heb ik opgevangen door Sub Afsluiten te callen waarin ook Application.Quit enzo staat en onder deze regel heb ik Exit Sub toegevoegd.

Tevens heb ik de onnodige Sub Openen verwijderd en de code die hierin stond onderaan de eerste Sub te plaatsen. Nu zie ik Frm_001 niet meer opkomen.

Aangepaste code:

Code:
Private Sub WorkBook_Open()
    Dim DocumentJaar As Integer
    Dim HuidigJaar As Integer
    Dim Antwoord As Long
    
    Sheets("Wachtwoord").Select
    
    With Application
        .ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
        .DisplayFormulaBar = False
        .DisplayStatusBar = False
        .OnKey "%{F8}", ""
        .OnKey "%{F11}", ""
    End With

    With ActiveWindow
        .DisplayWorkbookTabs = False
        .DisplayHeadings = False 'Speciaal enkel voor het eerste opstarten van sheets("Wachtwoord")
    End With
    
    HuidigJaar = year(Date)
    DocumentJaar = CInt(Mid(ThisWorkbook.Name, 12, 5))
                
    If DocumentJaar <> HuidigJaar Then
        Antwoord = MsgBox("Let op U wilt boekjaar " & DocumentJaar & " openen." & vbNewLine & vbNewLine & _
                "Dit betreft een oud boekjaar. Wilt u deze openen?", _
                vbYesNo + vbInformation + vbDefaultButton2, "Oud Boekjaar")
        If Antwoord = vbNo Then
            Call Afsluiten 'Module 3
            Exit Sub
        End If
    End If

    Frm_005.CheckBox1.Value = False
    frm_001.Show
    
End Sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan