Avatar billede gafi Nybegynder
28. september 2010 - 08:52 Der er 7 kommentarer og
1 løsning

Fejl ved søgning efter dato

Jeg har oprettet 52 ark, en for hver uge i året. (Excel 2007)
Nu er det jo ikke til at huske hvilke datoer der høre til de forskellige uger ;o)
Jeg har derfor lavet følgende kode til at søge efter en bestemt dato, men den vil af en eller anden grund ikke søge på en dato før d. 1/4,
ved søgning på f.eks. 21/3 kan den ikke finde datoen.
Men alle datoer efter d. 1/4 kan sagtens findes.
Alle ark er ens, undtaget datoerne selvfølgelig.

Sub FindDato()
    Dim vsheet As Worksheet
    Dim nyDato As String
    Dim c As Range
    månedÅr = Array "NON", "januar", "februar", "marts", "april", _
                    "maj", "juni", "juli", "august", "september", _
                    "oktober", "november", "december")
'=========
    inputDato = InputBox("Indtast dato - Format d/m", DATO)
    længde = Len(inputDato)
    If længde > 5 Or længde < 3 Then GoTo TxtFejl
'=========
    For n = 1 To længde          'Konverter dato til tekst
        If Mid(inputDato, n, 1) = "/" Then
            nyDato = Left(inputDato, n - 1)
            nyDato = nyDato & ". " & månedÅr(Right(inputDato, _
                                                        længde - n))
        End If
    Next
'=========
For Each vsheet In Sheets              'Søg efter dato i alle ark
    With vsheet.Range("c1:c103")  'Datoerne findes i kolonne C
        Set c = .Find(What:=nyDato, LookIn:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
        End If
    End With
    If firstAddress <> "" Then GoTo Fundet
Next
    If firstAddress = "" Then
        GoTo IkkeFundet
    End If
'======================
    GoTo Slut
'>> MEDDELELSER <<
Fundet:
    vsheet.Activate          'Aktiver den fundne dato
    Range(firstAddress).Select
    GoTo Slut
TxtFejl:
    MsgBox "Den indtastede dato er forkert"
    GoTo Slut
IkkeFundet:
    MsgBox "Datoen " & nyDato & " blev ikke fundet" & Chr(10) & _
            "Det er måske en lørdag eller søndag"   
                            'Der er ikke lør eller søn med i arkene
    GoTo Slut
'======================
Slut:
End Sub
Avatar billede supertekst Ekspert
28. september 2010 - 09:02 #1
Var det muligt at få en kopi? - så skal jeg forsøge at finde en løsning. @-adresse under min profil.
Avatar billede supertekst Ekspert
28. september 2010 - 09:38 #2
Har prøvet din kode på en mindre model - ingen problemer.

Kunne der forskel på, hvordan datoerne er opbygget i 1. kvartal sammenlignet med de øvrige?
Avatar billede gafi Nybegynder
28. september 2010 - 09:42 #3
Nej det tror jeg ikke.
Jeg har sendt en kopi til dig!
Avatar billede tjacob Juniormester
28. september 2010 - 09:46 #4
Din kode er umiddelbart OK (undtagen strukturen), så det er muligvis fordi nyDato får forkert værdi. Den kan for i øvrigt findes meget nemmere end du gør.
Mht strukturen i din kode: GoTo er dårlig kodepraksis. Det gør koden uoverskuelig at læse/forstå.
Jeg har tilladt mig at genskrive din kode uden GoTo, med en ændring ved nyDato. Prøv om den giver samme fejl:


Sub FindDato()
    Dim vsheet As Worksheet
    Dim nyDato As String
    Dim c As Range
'=========
    inputdato = InputBox("Indtast dato - Format d/m", DATO)
    længde = Len(inputdato)
    If længde > 5 Or længde < 3 Then
        MsgBox "Den indtastede dato er forkert"
        Exit Sub
    End If
'=========
    nyDato = Format(inputdato, "d.mmmm")
'=========
    For Each vsheet In Sheets              'Søg efter dato i alle ark
        With vsheet.Range("c1:c103")  'Datoerne findes i kolonne C
            Set c = .Find(What:=nyDato, LookIn:=xlValues)
            If Not c Is Nothing Then
                firstAddress = c.Address
            End If
        End With
        If firstAddress <> "" Then
            vsheet.Activate          'Aktiver den fundne dato
            Range(firstAddress).Select
            Exit Sub
        End If
    Next
'======================
    MsgBox "Datoen " & nyDato & " blev ikke fundet" & Chr(10) & _
            "Det er måske en lørdag eller søndag"
                            'Der er ikke lør eller søn med i arkene
End Sub
Avatar billede gafi Nybegynder
28. september 2010 - 10:09 #5
Hej tjacob

Jeg ved godt at det var dårlig programmering, det var pga. at jeg havde rodet rundt i koden over længere tid, men en dårlig undskyldning aligevel ;o)

Den ny kode har samme fejl :o( øv

Har lige rettet
nyDato = Format(inputdato, "d.mmmm")
til
nyDato = Format(inputdato, "d. mmmm")

Ellers mange tak for koden, ja - den er mere overskuelig :o)
Avatar billede tjacob Juniormester
28. september 2010 - 10:17 #6
Så MÅ det næsten være fordi der er forskel på arkene, som Supertekst foreslår.

Men nu har han en kopi, så mon ikke han finder fejlen?
Avatar billede supertekst Ekspert
28. september 2010 - 13:04 #7
Sub FindDato()
    Dim vsheet As Worksheet
    Dim nyDato As String
    Dim c As Range
    Dim r As Integer, vd As String, vdt As String
   
    månedÅr = Array("NON", "januar", "februar", "marts", "april", "maj", "juni", "juli", _
                        "august", "september", "oktober", "november", "december")
'=========
    inputDato = InputBox("Indtast dato  Format d/m", dato)
    længde = Len(inputDato)
    If længde > 5 Or længde < 3 Then GoTo TxtFejl
    nyDato = ""
'=========
    For n = 1 To længde
        If Mid(inputDato, n, 1) = "/" Then
            nyDato = Left(inputDato, n - 1)
            nyDato = nyDato & ". " & månedÅr(Right(inputDato, længde - n))
        End If
    Next
'=========

For Each vsheet In ActiveWorkbook.Sheets
Rem Ændring.............................
    For r = 2 To 102 Step 25
        vd = vsheet.Range("C" & r).Value
        vdt = Format(vd, "d. mmmm")
       
        If vdt = nyDato Then
            firstaddress = "$C$" & CStr(r)
            Exit For
        End If
    Next r
Rem .....................................

    If firstaddress <> "" Then GoTo Fundet
Next

    If firstaddress = "" Then
        GoTo IkkeFundet
    End If
'======================
    GoTo Slut
'>> MEDDELELSER <<
Fundet:
    vsheet.Activate
    Range(firstaddress).Select
    GoTo Slut

TxtFejl:
    MsgBox "Den indtastede dato er forkert"
    GoTo Slut
   
IkkeFundet:
    MsgBox "Datoen " & nyDato & " blev ikke fundet" & Chr(10) & _
            "Det er måske en lørdag eller søndag"
    GoTo Slut
'======================
Slut:
End Sub
Avatar billede gafi Nybegynder
28. september 2010 - 15:40 #8
Det endelige program kom, med hjælp fra "tjacob" og løsningen fra "supertekst", til at se sådan ud
og det virker :o))

Sub FindDato()
    Dim vSheet As Worksheet
    Dim nyDato As String
    Dim inputDato As String
    Dim aktuelDato As String
    Dim raekke As Integer

    inputDato = InputBox("INDTAST DATO  >>> Format d/m", "SØG EN DATO")
    If inputDato = "" Then Exit Sub
    nyDato = Format(inputDato, "d. mmmm")

    For Each vSheet In Sheets
        For raekke = 2 To 102 Step 25        'Der er 25 rækker mellem de enkelte datoer
            aktuelDato = Format(vSheet.Range("C" & raekke).Value, "d. mmmm")
            If aktuelDato = nyDato Then
                firstAddress = "$A$" & CStr(raekke) + 2
                Exit For
            End If
        Next raekke
       
        If firstAddress <> "" Then
            vSheet.Activate
            Range(firstAddress).Select
            Exit Sub
        End If
    Next

    MsgBox "Datoen:  >" & nyDato & "<  blev ikke fundet"
End Sub
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester