Avatar billede hubertus Seniormester
13. juli 2006 - 10:49 Der er 31 kommentarer og
2 løsninger

søgning i et array

jeg har brug for lidt experthjælp til følgende i en userform

Jeg har et array i kolonne b. Heri laver jeg en søgning som udvælger f.eks. 4 elementer. I kolonne D, står nogle datoer, som hører til de 4 elementer. Jeg vil gerne have de 4 datoer i kolonne D sorteret, således at den nyeste dato står først og gemt i en variabel.
Håber der er nogle der kan hjælpe.

mvh.
Hubertus
Avatar billede Slettet bruger
13. juli 2006 - 12:15 #1
Med userform mener du så et dialog sheet eller en userform der ligger som en form i visual basic editoren?

Hvordan indsætter du data til din listbox (det er en listbox du bruger?) - Refererer du med en range eller bruger du additem?

/1.
Avatar billede hubertus Seniormester
14. juli 2006 - 07:55 #2
Det er en userform lavet i VBA. Der er ikke tale om en listebox, men om en textbox. Jeg har et range i kolonne B. hvor jeg gennemsøger for et reg. nummer Det nummer kan forekomme flere gange i mit range. Når jeg trykker på søgeknappen fremkommer det første match. trykkes igen kommer det næste match osv. Min opgave er så at det første match jeg får i søgningen skal være det match med den nyeste dato. og dernæst den næst nyeste osv.
håber det kastede lys over opgaven.
mvh/Hubertus
Avatar billede Slettet bruger
14. juli 2006 - 10:22 #3
Læg dette ind i din userforms sourcecode.

Jeg går ud fra, du selv kan konfigurere således outputtet bliver indsat hvor du vil have det..

Private date_index As Integer

Private Sub CommandButton1_Click()

    Dim row As Integer, date_string As String, tmp_arr() As Date, count As Integer

    ReDim tmp_arr(Sheets("sheet1").Range("B65536").End(xlUp).row - 1)



    'Loads all dates in D row if seach string (textbox1 input) is in column B.
    If Range("B1") <> "" Then

        For row = 1 To Sheets("sheet1").Range("B65536").End(xlUp).row

            If InStr(1, UCase(Sheets("sheet1").Range("B" & row)), UCase(Me.TextBox1)) Then

                tmp_arr(count) = Sheets("sheet1").Range("D" & row)

                count = count + 1

            End If

        Next

    End If

   

    Dim date_arr As Variant, t As Integer, i As Integer, latest_date_index As Integer

   

    'Sorts the tmp_arr into the date_arr
    ReDim date_arr(count - 1)

    For t = 0 To count - 1

        latest_date_index = 0

        For i = 0 To count - 1

            If tmp_arr(latest_date_index) <> Empty Then

                If tmp_arr(i) > tmp_arr(latest_date_index) Then

                    latest_date_index = i

                End If

            End If

        Next

        date_arr(t) = tmp_arr(latest_date_index)

        tmp_arr(latest_date_index) = Empty

    Next

   

    'Outputs the [n] newest date where [n] increases for each search.
    MsgBox (date_arr(date_index))

    If date_index <> count - 1 Then

        date_index = date_index + 1

    Else

        date_index = 0

        MsgBox ("You have seen all matches")

    End If

End Sub



Private Sub TextBox1_Change()

    date_index = 0

End Sub

/1.
Avatar billede hubertus Seniormester
14. juli 2006 - 10:50 #4
Hej igen
Jeg har forsøgt at få din rutin til at virker, uden held indtil videre. Det går galt i linien:  ReDim date_arr(count - 1) hvor count er 0 og derfor giver en: Type mismatch. Mit spørgsmål udspringer af et andet spørgsmål her på eksperten, som hedder søgerutine. her kan du se en del af den kode som rutinen skal bruges sammen med.

mvh. Hubertus
ps. tak for hurtigt svar :-)
Avatar billede Slettet bruger
14. juli 2006 - 11:30 #5
Prøv den her, hvor jeg har added dette:

    if Me.TextBox1 = "" then
        msgbox("No search string specified")
        exit sub
    end if

    if count = 0 then
        msgbox("No match found")
        exit sub
    end if

Jeg må indrømme jeg ikke har nærlæst det andet spm..


Private date_index As Integer

Private Sub CommandButton1_Click()

    if Me.TextBox1 = "" then
        msgbox("No search string specified")
        exit sub
    end if

    Dim row As Integer, date_string As String, tmp_arr() As Date, count As Integer

    ReDim tmp_arr(Sheets("sheet1").Range("B65536").End(xlUp).row - 1)



    'Loads all dates in D row if seach string (textbox1 input) is in column B.
    If Range("B1") <> "" Then

        For row = 1 To Sheets("sheet1").Range("B65536").End(xlUp).row

            If InStr(1, UCase(Sheets("sheet1").Range("B" & row)), UCase(Me.TextBox1)) Then

                tmp_arr(count) = Sheets("sheet1").Range("D" & row)

                count = count + 1

            End If

        Next

    End If

    if count = 0 then
        msgbox("No match found")
        exit sub
    end if

    Dim date_arr As Variant, t As Integer, i As Integer, latest_date_index As Integer

 

    'Sorts the tmp_arr into the date_arr
    ReDim date_arr(count - 1)

    For t = 0 To count - 1

        latest_date_index = 0

        For i = 0 To count - 1

            If tmp_arr(latest_date_index) <> Empty Then

                If tmp_arr(i) > tmp_arr(latest_date_index) Then

                    latest_date_index = i

                End If

            End If

        Next

        date_arr(t) = tmp_arr(latest_date_index)

        tmp_arr(latest_date_index) = Empty

    Next

 

    'Outputs the [n] newest date where [n] increases for each search.
    MsgBox (date_arr(date_index))

    If date_index <> count - 1 Then

        date_index = date_index + 1

    Else

        date_index = 0

        MsgBox ("You have seen all matches")

    End If

End Sub



Private Sub TextBox1_Change()

    date_index = 0

End Sub



/1.
Avatar billede hubertus Seniormester
14. juli 2006 - 13:34 #6
hej igen
Det ser ud til at den sortere datoerne fint og ender op med nyeste dato, men den mangler den facilitet at jeg ved gentagene tryk på søgeknappen vil komme igennem rækken af match. Det var derfor jeg gerne ville have den bygget sammen med rutinen fra mit tidligere spørgsmål, som opfylder den ønsket om at kunne gennemløbe de match der var. Hvordan kan de to bygges sammen?

mvh.
Hubertus
Avatar billede hubertus Seniormester
14. juli 2006 - 13:37 #7
ups det jeg havde lavet en fejl, den gennemløber alle match nu. Det som står tilbage er, kan de to rutiner sammenføjes?

mvh.
Hubertus
Avatar billede Slettet bruger
14. juli 2006 - 14:14 #8
Ja det kan sammenføjes.. Jeg har ikke testet dette, men jeg tror det er hvad du søger..


Private date_index As Integer

Private Sub cmdSøg_Click()

    if Me.txttrailer_reg = "" then
        MsgBox "Ugyldigt Reg. nr."
        txttrailer_reg.SetFocus
        exit sub
    end if

    Dim row As Integer, date_string As String, tmp_arr As integer, count As Integer

    ReDim tmp_arr(Sheets("ark1").Range("B65536").End(xlUp).row - 1)



    'Loads all dates in D row if seach string (txttrailer_reg input) is in column B.
    If Range("B1") <> "" Then

        For row = 1 To Sheets("ark1").Range("B65536").End(xlUp).row

            If InStr(1, UCase(Sheets("ark1").Range("B" & row)), UCase(Me.txttrailer_reg)) Then

                tmp_arr(count) = row

                count = count + 1

            End If

        Next

    End If

    if count = 0 then
        msgbox("No match found")
        exit sub
    end if

    Dim row_arr As integer t As Integer, i As Integer, latest_date_index As Integer



    'Sorts the tmp_arr into the row_arr
    ReDim row_arr(count - 1)

    For t = 0 To count - 1

        latest_date_index = 0

        For i = 0 To count - 1

            If tmp_arr(latest_date_index) <> Empty Then

                If Sheets("ark1").Range("D" & tmp_arr(i)) >  Sheets("ark1").Range("D" & tmp_arr(latest_date_index)) Then

                    latest_date_index = i

                End If

            End If

        Next

        row_arr(t) = tmp_arr(latest_date_index)

        tmp_arr(latest_date_index) = Empty

    Next



    'Outputs the [n] newest date where [n] increases for each search.
    sheets("ark1").activate
    Range("D" & date_arr(date_index)).select
    read_data(date_arr(date_index))
   
    If date_index <> count - 1 Then

        date_index = date_index + 1

    Else

        date_index = 0

        MsgBox ("You have seen all matches")

    End If

End Sub



Private Sub txttrailer_reg_Change()

    date_index = 0

End Sub
Avatar billede hubertus Seniormester
14. juli 2006 - 17:54 #9
hejsa
Rutinen virker fint hvis jeg afprøver det i et regneark, men ikke i mit sammenhæng. Det hænger formentlig sammen med, at min kolonne B ikke starter i række 1, men først i række 3. Men den skal jeg nok få styr på, når jeg har gennemarbejdet rutinen. Et afklarende spørgsmål: hvorfor sætter du ændre du txttrailer_reg til Me.txttrailer_reg? hvilken betyning har det?
mvh
Hubertus
Avatar billede hubertus Seniormester
14. juli 2006 - 18:52 #10
Hej igen
Jeg kan ikke få den sidste rutine til at fungere. Den stopper hele tiden ved linien  ReDim tmp_arr(Sheets("ark1").Range("B65536").End(xlUp).row - 1). jeg for en meddelelse om at der forventes et array. Hvis jeg har forstået Redim korrekt, så er det en måde at reservere et antal pladser - her til antal rækker i kolonne B. Er det korrekt opfattet?
Kan du gennemskue problemet?
Avatar billede Slettet bruger
24. juli 2006 - 11:54 #11
Me kan åbenbart udelades i Me.txttrailer_reg - det var jeg ikke klar over.

Angående ReDim skal der være () efter Dim af variable for at platformen genkender den som array:

Dim tmp_arr as Integer -> Dim tmp_arr() as Integer

Jeg har rettet det her - desuden har jeg sat start_row til 3.


Private date_index As Integer
Private Sub cmdSøg_Click()
    If Me.txttrailer_reg = "" Then
        MsgBox "Ugyldigt Reg. nr."
        txttrailer_reg.SetFocus
        Exit Sub
    End If

    Dim row As Integer, date_string As String, tmp_arr() As Integer, count As Integer, start_row As Integer
    start_row = 3
   
    ReDim tmp_arr(Sheets("ark1").Range("B65536").End(xlUp).row - 1) As Integer

    'Loads all dates in D row if seach string (txttrailer_reg input) is in column B.
    If Range("B" & start_row) <> "" Then
        For row = start_row To Sheets("ark1").Range("B65536").End(xlUp).row
            If InStr(1, UCase(Sheets("ark1").Range("B" & row)), UCase(Me.txttrailer_reg)) Then
                tmp_arr(count) = row
                count = count + 1
            End If
        Next
    End If

    If count = 0 Then
        MsgBox ("No match found")
        Exit Sub
    End If

    Dim row_arr() As Integer, t As Integer, i As Integer, latest_date_index As Integer

    'Sorts the tmp_arr into the row_arr
    ReDim row_arr(count - 1)
    For t = 0 To count - 1
        latest_date_index = 0
        For i = 0 To count - 1
            If tmp_arr(i) <> 0 Then
                If tmp_arr(latest_date_index) = 0 Then
                    latest_date_index = i
                End If
                If Sheets("ark1").Range("D" & tmp_arr(i)) > Sheets("ark1").Range("D" & tmp_arr(latest_date_index)) Then
                    latest_date_index = i
                End If
            End If
        Next
        row_arr(t) = tmp_arr(latest_date_index)
        tmp_arr(latest_date_index) = 0
    Next

    'Outputs the [n] newest date where [n] increases for each search.
    Sheets("ark1").Activate
    Range("D" & row_arr(date_index)).Select
    'read_data (row_arr(date_index))
   
    If date_index <> count - 1 Then
        date_index = date_index + 1
    Else
        date_index = 0
        MsgBox ("You have seen all matches")
    End If
End Sub
Private Sub txttrailer_reg_Change()
    date_index = 0
End Sub

/1.
Avatar billede hubertus Seniormester
27. juli 2006 - 09:34 #12
Hej igen
Dit forslag virker helt efter hensigten. Det var præcis det jeg søgte.  - det tog mig blot lidt tid at gennemskue den. :-) - det har været lærerigt for mig - tak for det.

Kan du kaste lidt lys over forskellen på Me.txttrailer_reg  og txttrailer_reg. hvilke betydning har Me?
Avatar billede hubertus Seniormester
27. juli 2006 - 10:29 #13
jeg var vist lidt hurtig før.  Den finder ganskevist den række med det højeste nummer, men det jeg gerne ville var at der søges på indholdet i cellen som er en dato. Den søgning der skal komme frem først er den nyeste dato osv. 
Kan du fikse det? så smider jeg gerne nogle point ovenpå.
mvh / hubertus
Avatar billede Slettet bruger
27. juli 2006 - 16:00 #14
Først må jeg lige være helt sikker på, hvad der skal laves.

Hvad skal der søges efter i formen? er det på en serial eller en dato?
Hvad skal vises serial eller dato eller noget helt tredje?
Og hvilke kolonner er dataen gemt i?

/1..
Avatar billede hubertus Seniormester
27. juli 2006 - 20:30 #15
Der søges på col B, som indeholder trailer_reg nr. helt som hidtil. en trailer_reg kan være registreret flere gange på forskellige datoer, som står i kolonne E.  Når matchene (col B), skal vises så skal den nyeste dato (col E) vises først. Mao, først findes matchene, dernæst sorteres de fundne matcht efter dato, så den nyeste fremkommer først. Håber det kastede lidt lys over sagen

mvh. / hubertus
Avatar billede hubertus Seniormester
27. juli 2006 - 20:34 #16
Der må kunne arbejds med row_arr() som peger på de rækker med et match. her er rækkerne sorteret således at den række med højeste nummer vises først. Kunne man fokucere på celleindholdet i col E og sortere dem?
Avatar billede Slettet bruger
28. juli 2006 - 10:18 #17
Jeg har rettet col "D" til col "E".. måske det er derfor du ikke får, hvad du vil have?! - ellers må du beskrive mere detaljeret, hvilken data du vil have og med hvilke kriterier..

Private date_index As Integer
Private Sub cmdSøg_Click()
    If txttrailer_reg = "" Then
        MsgBox "Ugyldigt Reg. nr."
        txttrailer_reg.SetFocus
        Exit Sub
    End If

    Dim row As Integer, date_string As String, tmp_arr() As Integer, count As Integer, start_row As Integer
    start_row = 3
   
    ReDim tmp_arr(Sheets("ark1").Range("B65536").End(xlUp).row - 1) As Integer

    'Loads all dates in E row if seach string (txttrailer_reg input) is in column B.
    If Range("B" & start_row) <> "" Then
        For row = start_row To Sheets("ark1").Range("B65536").End(xlUp).row
            If InStr(1, UCase(Sheets("ark1").Range("B" & row)), UCase(txttrailer_reg)) Then
                tmp_arr(count) = row
                count = count + 1
            End If
        Next
    End If
   
    If count = 0 Then
        MsgBox ("No match found")
        Exit Sub
    End If

    Dim row_arr() As Integer, t As Integer, i As Integer, latest_date_index As Integer

    'Sorts the tmp_arr into the row_arr
    ReDim row_arr(count - 1)
    For t = 0 To count - 1
        latest_date_index = 0
        For i = 0 To count - 1
            If tmp_arr(i) <> 0 Then
                If tmp_arr(latest_date_index) = 0 Then
                    latest_date_index = i
                End If
                If Sheets("ark1").Range("E" & tmp_arr(i)) > Sheets("ark1").Range("E" & tmp_arr(latest_date_index)) Then
                    latest_date_index = i
                End If
            End If
        Next
        row_arr(t) = tmp_arr(latest_date_index)
        tmp_arr(latest_date_index) = 0
    Next

    'Outputs the [n] newest date where [n] increases for each search.
    Sheets("ark1").Activate
    Range("E" & row_arr(date_index)).Select
    'read_data (row_arr(date_index))
   
    If date_index <> count - 1 Then
        date_index = date_index + 1
    Else
        date_index = 0
        MsgBox ("You have seen all matches")
    End If
End Sub
Private Sub txttrailer_reg_Change()
    date_index = 0
End Sub
Avatar billede hubertus Seniormester
28. juli 2006 - 12:09 #18
hej igen.
Jeg havde selv rettet D til E, så det er ikke problemet. du skal forestille dig at du har et registreringsnummer på en bil i kolonne B og den dato hvor bilen er lejet i kolonne E. Søgningen går så på den enkelt bil. Den kan f.eks. give 4 match på 4 forskellige dage. Det jeg har brug for er, at når matchene er fundet, så skal de fremvises i formen, således at den nyeste dag, hvor bile er lejet skal vises først, og dernæst den næstnyeste indtil alle datoerne er vist. Mao. først skal registreringsnumrene findes, dernæst skal datoerne sorteres, så den nyest dato vises først.

Som rutinen er nu, så viser den det registreringsnummer, der står i den række med højeste rækkenummer, som den første. Den sortere ikke på celleindholdet i kolonne E.
mvh. / hubertus
Avatar billede Slettet bruger
28. juli 2006 - 14:27 #19
Ok.. så kan det se nogenlunde sådan her ud (jeg har added label til formen, hvor outputtet bliver vist). Jeg har også ændret det så det skal matche 100% (før søgte man efter en del af registreringsnummeret - dvs. ved '1' blev der fundet alle numre indeholdende '1').

Koden kan nok optimeres noget, for jeg har taget udgangpunkt i det, jeg allerede har lavet.

Option Explicit
Private Sub cmdSøg_Click()
    If txttrailer_reg = "" Then
        Label1 = "Ugyldigt Reg. nr."
        txttrailer_reg.SetFocus
        Exit Sub
    End If
   
    Dim row As Integer, date_string As String, tmp_arr() As Integer, count As Integer, start_row As Integer
    start_row = 3
   
    ReDim tmp_arr(Sheets("ark1").Range("B65536").End(xlUp).row - 1) As Integer

    'Loads all dates in E row if seach string (txttrailer_reg input) is in column B.
    If Range("B" & start_row) <> "" Then
        For row = start_row To Sheets("ark1").Range("B65536").End(xlUp).row
            If Trim(UCase(Sheets("ark1").Range("B" & row))) = Trim(UCase(txttrailer_reg)) Then
                tmp_arr(count) = row
                count = count + 1
            End If
        Next
    End If
   
    If count = 0 Then
        Label1 = "Reg. nr. ikke fundet"
        Exit Sub
    End If
   
    Dim t As Integer, i As Integer, latest_date_index As Integer
   
    Label1 = "Søgning efter Reg. nr. " & txttrailer_reg
   
    'Sorts the tmp_arr into the row_arr
    For t = 0 To count - 1
        latest_date_index = 0
        For i = 0 To count - 1
            If tmp_arr(i) <> 0 Then
                If tmp_arr(latest_date_index) = 0 Then
                    latest_date_index = i
                End If
                If Sheets("ark1").Range("E" & tmp_arr(i)) > Sheets("ark1").Range("E" & tmp_arr(latest_date_index)) Then
                    latest_date_index = i
                End If
            End If
        Next
        Label1 = Label1 & Chr(10) & Range("B" & tmp_arr(latest_date_index)) & " - " & Range("E" & tmp_arr(latest_date_index))
        tmp_arr(latest_date_index) = 0
    Next
End Sub
Avatar billede hubertus Seniormester
28. juli 2006 - 15:01 #20
det var et stykke af vejen :-) men den lister stadig efter række nummer og ikke efter datoen. Den første dato der gemmes i label1 er den dato der står i den rækken med det største rækkenummer, dernæst datoen med den næsthøjeste osv. Kan du sortere de datoer der gemmes i label1?

mvh / hubertus
Avatar billede Slettet bruger
29. juli 2006 - 08:54 #21
Hvilket format er datoerne på??

Måske ser excel dem ikke som datoer.. Hvis det er teksstrenge med et bestemt format, kan jeg bare lave dem om til dato..

/1.
Avatar billede hubertus Seniormester
29. juli 2006 - 09:26 #22
Jeg har pt. formateret dem som dato, men vil helst have at formatet sættes via vba koden. Jeg ved ikke om jeg helt har forstået den sidste del af koden, men når jeg ser på indholdet af label1, så er indholdet listet efter rækkenummeret angivet med den bil der står i den række med det højeste nummer først. Mao, når du organisere rækkefølgen så sker det som en følge af rækkenummeret og ikke som en sortering af cellernes indhold. Er det korrekt opfattet?

mvh / hubertus
Avatar billede hubertus Seniormester
29. juli 2006 - 09:30 #23
Strengen som skriver datoen i regnearket ser således ud:
Cells(mlrowdisplayed, 5) = UCase(Left(txtStartDato.Text, 1)) & LCase(Mid(txtStartDato.Text, 2))
Avatar billede Slettet bruger
30. juli 2006 - 21:58 #24
Hvilket format er datoen (hvad indeholder txtStartDato.Text)?

Er det DD-MM-YYYY eller er det tekst (som January 2nd 2006) eller noget i den stil?

Sorteringen er ikke baseret på rækkenummeret..

tmp_arr indeholder rækkenumre, men der bliver søgt på Sheets("ark1").Range("E" & tmp_arr(i)) - dvs. rækkenummeret bare er index for dato er reg. nr. værdierne..
Avatar billede hubertus Seniormester
30. juli 2006 - 23:24 #25
Cellerne er formateret som en dato: af typen DD-MM-YYYY eks. 12-03-2006. Reelt indtaster brugeren blot en tekststreng, som formatet derefter tilretter. Det optimale ville havde været at der var en maske som styrede indtastningen af datoen.

mvh. Hubertus.
Avatar billede hubertus Seniormester
30. juli 2006 - 23:28 #26
Jeg har prøvet at se på indholdet af label1 med en msgbox. Her ses det tydeligt at celleindholdet ikke opfattes som en dato. da jeg får linierne udskrevet med det højeste rækkenummer først.
mvh. Hubertus
Avatar billede Slettet bruger
31. juli 2006 - 10:54 #27
Prøv med dette - create_date_from_string skal være i et modul for sig.

Option Explicit
Private Sub cmdSøg_Click()
    If txttrailer_reg = "" Then
        Label1 = "Ugyldigt Reg. nr."
        txttrailer_reg.SetFocus
        Exit Sub
    End If
   
    Dim row As Integer, date_string As String, tmp_arr() As Integer, count As Integer, start_row As Integer
    start_row = 3
   
    ReDim tmp_arr(Sheets("ark1").Range("B65536").End(xlUp).row - 1) As Integer

    'Loads all dates in E row if seach string (txttrailer_reg input) is in column B.
    If Range("B" & start_row) <> "" Then
        For row = start_row To Sheets("ark1").Range("B65536").End(xlUp).row
            If Trim(UCase(Sheets("ark1").Range("B" & row))) = Trim(UCase(txttrailer_reg)) And create_date_from_string(Sheets("ark1").Range("E" & row)) <> False Then
                tmp_arr(count) = row
                count = count + 1
            End If
        Next
    End If
   
    If count = 0 Then
        Label1 = "Reg. nr. ikke fundet"
        Exit Sub
    End If
   
    Dim t As Integer, i As Integer, latest_date_index As Integer
   
    Label1 = "Søgning efter Reg. nr. " & txttrailer_reg
   
    'Sorts the tmp_arr into the row_arr
    For t = 0 To count - 1
        latest_date_index = 0
        For i = 0 To count - 1
            If tmp_arr(i) <> 0 Then
                If tmp_arr(latest_date_index) = 0 Then
                    latest_date_index = i
                End If
                If create_date_from_string(Sheets("ark1").Range("E" & tmp_arr(i))) > create_date_from_string(Sheets("ark1").Range("E" & tmp_arr(latest_date_index))) Then
                    latest_date_index = i
                End If
            End If
        Next
        Label1 = Label1 & Chr(10) & Range("B" & tmp_arr(latest_date_index)) & " - " & Range("E" & tmp_arr(latest_date_index))
        tmp_arr(latest_date_index) = 0
    Next
End Sub

Function create_date_from_string(date_String) As Variant
    date_String = Trim(date_String)
   
    create_date_from_string = True
    If Len(Trim(date_String)) <> 10 Then
        create_date_from_string = False
    End If
   
    'Days
    If IsNumeric(Mid(Trim(date_String), 1, 2)) Then
        If Mid(Trim(date_String), 1, 2) < 0 Or Mid(Trim(date_String), 1, 2) > 31 Then
            create_date_from_string = False
        End If
    Else
        create_date_from_string = False
    End If
   
    'Months
    If IsNumeric(Mid(Trim(date_String), 4, 2)) Then
        If Mid(Trim(date_String), 4, 2) < 0 Or Mid(Trim(date_String), 4, 2) > 12 Then
            create_date_from_string = False
        End If
    Else
        create_date_from_string = False
    End If
   
    'Years
    If Not IsNumeric(Mid(Trim(date_String), 7, 4)) Then
        create_date_from_string = False
    End If
   
    If create_date_from_string Then
        create_date_from_string = Mid(Trim(date_String), 7, 4) & "-" & Mid(Trim(date_String), 4, 2) & "-" & Mid(Trim(date_String), 1, 2)
    End If
End Function
Avatar billede hubertus Seniormester
31. juli 2006 - 14:05 #28
Well done - din funktion ser ud til at gøre arbejdet. Når jeg udskriver label1 i en msgbox, så kommer datoen i den rigtige rækkefølge. Nu mangler jeg blot at få den til at udskrive søgeresultatet i formen. Har du et forslag til hvorledes man kan gøre det? Det skal helst være således at hvergang man trykker søg, så kommer en ny dato, når den har nået den ældste dato,  så skal den starte forfra - dvs. køre i ring.

mvh. / Hubertus
Avatar billede Slettet bruger
03. august 2006 - 14:48 #29
Hej igen..

Prøv med dette her - undskyld den lange svartid..

/1.

Private date_index As Integer
Private Sub cmdSøg_Click()
    If txttrailer_reg = "" Then
        Label1 = "Ugyldigt Reg. nr."
        txttrailer_reg.SetFocus
        Exit Sub
    End If

    Dim row As Integer, date_String As String, tmp_arr() As Integer, count As Integer, start_row As Integer
    start_row = 3
   
    ReDim tmp_arr(Sheets("ark1").Range("B65536").End(xlUp).row - 1) As Integer

    'Loads all dates in E row if seach string (txttrailer_reg input) is in column B.
    If Range("B" & start_row) <> "" Then
        For row = start_row To Sheets("ark1").Range("B65536").End(xlUp).row
            If Trim(UCase(Sheets("ark1").Range("B" & row))) = Trim(UCase(txttrailer_reg)) Then
                If create_date_from_string(Sheets("ark1").Range("E" & row)) <> False Then
                    tmp_arr(count) = row
                    count = count + 1
                End If
            End If
        Next
    End If
   
    If count = 0 Then
        Label1 = "Reg. nr. ikke fundet"
        Exit Sub
    End If

    Dim row_arr() As Integer, t As Integer, i As Integer, latest_date_index As Integer

    'Sorts the tmp_arr into the row_arr
    ReDim row_arr(count - 1)
    For t = 0 To count - 1
        latest_date_index = 0
        For i = 0 To count - 1
            If tmp_arr(i) <> 0 Then
                If tmp_arr(latest_date_index) = 0 Then
                    latest_date_index = i
                End If
                If create_date_from_string(Sheets("ark1").Range("E" & tmp_arr(i))) > create_date_from_string(Sheets("ark1").Range("E" & tmp_arr(latest_date_index))) Then
                    latest_date_index = i
                End If
            End If
        Next
        row_arr(t) = tmp_arr(latest_date_index)
        tmp_arr(latest_date_index) = 0
    Next

    'Outputs the [n] newest date where [n] increases for each search.
    Label1 = Sheets("ark1").Range("E" & row_arr(date_index))
   
    If date_index <> count - 1 Then
        date_index = date_index + 1
    Else
        date_index = 0
    End If
End Sub
Private Sub txttrailer_reg_Change()
    date_index = 0
End Sub
Avatar billede hubertus Seniormester
03. august 2006 - 18:48 #30
Hejsa
Jeg kan ikke få dine ændringer til at virke. Hvis jeg sætter en msgbox på label1, så kan jeg se, at den indeholder datoerne i den korrekte rækkefølge. Men jeg skulle gerne have et rækkenummer på de linier, hvor datoerne står (altså i sorteret rækkefølge) så jeg kan få resultatet af søgningen ind i min userform. jeg har en rutine
Sub read_data(mlrowdisplayed)
  txtModtaget_i_by.Text = Cells(mlrowdisplayed, 3) ' row,col
  TxtVognmand.Text = Cells(mlrowdisplayed, 4)
  txtStartDato.Text = Cells(mlrowdisplayed, 5)
  txtLevering_i_by.Text = Cells(mlrowdisplayed, 6)
  txtSlutdato.Text = Cells(mlrowdisplayed, 7)
  TxtBemærkninger.Text = Cells(mlrowdisplayed, 8)
End Sub

som jeg bruger til at indlæse de søgte data i userformen. Denne rutine bruger en variabel: mlrowdisplayed, som er rækkenummeret for den linie hvor det søgte bilnummer står.
kan du få rækkenummert lagt ind i denne variabel, således at jeg får den nyeste dato først osv.

mvh. / hubertus
Avatar billede Slettet bruger
04. august 2006 - 08:43 #31
Dette skulle gøre det
/1.

Private date_index As Integer
Private Sub cmdSøg_Click()
    If txttrailer_reg = "" Then
        Label1 = "Ugyldigt Reg. nr."
        txttrailer_reg.SetFocus
        Exit Sub
    End If

    Dim row As Integer, date_String As String, tmp_arr() As Integer, count As Integer, start_row As Integer
    start_row = 3
   
    ReDim tmp_arr(Sheets("ark1").Range("B65536").End(xlUp).row - 1) As Integer

    'Loads all dates in E row if seach string (txttrailer_reg input) is in column B.
    If Range("B" & start_row) <> "" Then
        For row = start_row To Sheets("ark1").Range("B65536").End(xlUp).row
            If Trim(UCase(Sheets("ark1").Range("B" & row))) = Trim(UCase(txttrailer_reg)) Then
                If create_date_from_string(Sheets("ark1").Range("E" & row)) <> False Then
                    tmp_arr(count) = row
                    count = count + 1
                End If
            End If
        Next
    End If
   
    If count = 0 Then
        Label1 = "Reg. nr. ikke fundet"
        Exit Sub
    End If

    Dim row_arr() As Integer, t As Integer, i As Integer, latest_date_index As Integer

    'Sorts the tmp_arr into the row_arr
    ReDim row_arr(count - 1)
    For t = 0 To count - 1
        latest_date_index = 0
        For i = 0 To count - 1
            If tmp_arr(i) <> 0 Then
                If tmp_arr(latest_date_index) = 0 Then
                    latest_date_index = i
                End If
                If create_date_from_string(Sheets("ark1").Range("E" & tmp_arr(i))) > create_date_from_string(Sheets("ark1").Range("E" & tmp_arr(latest_date_index))) Then
                    latest_date_index = i
                End If
            End If
        Next
        row_arr(t) = tmp_arr(latest_date_index)
        tmp_arr(latest_date_index) = 0
    Next

    'Outputs the [n] newest date where [n] increases for each search.
    Label1 = Sheets("ark1").Range("E" & row_arr(date_index))
    read_data(row_arr(date_index))
   
    If date_index <> count - 1 Then
        date_index = date_index + 1
    Else
        date_index = 0
    End If
End Sub
Private Sub txttrailer_reg_Change()
    date_index = 0
End Sub
Avatar billede hubertus Seniormester
05. august 2006 - 08:19 #32
Du har ret - din ændring løste problemet :-) Det var præcis det jeg havde brug for.

smider du et svar, så du kan få dine point.

mvh. Hubertus

ps. tusinde tak for hjælpen. Det har været et godt forløb, hvor jeg har lært en del om måden at håndtere et array på - tak for det.
Avatar billede Slettet bruger
06. august 2006 - 10:43 #33
Velbekommen. og her er et svar.
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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