Avatar billede Laugesen1 Mester
15. juli 2014 - 00:33 Der er 5 kommentarer og
1 løsning

Kopier rækker fra et array til et andet array hvis kriterier er opfyldt.

Jeg skal hver uge fortage en sortering af data fra et ark som kan variere i størrelse på 50 -300 rækker. Rækker der opfylder kriterier i 3 kolonner, skal kopieres til et andet område eller til et andet ark.

For at forøge hastigheden af processen, har jeg indlæst alle data i et array (MyArray), og har prøvet at lave en makro der skal kopiere de enkelte rækker fra arrayet - hvis kriterierne er opfyldt - og sætte dem ind i et nyt array(NewArray).
Sortering skal ske efter 3 kriterier i kolonnerne 3 - 4 - 5 i det indlæste array(MyArray).

Rækkerne der bliver kopieret over i det nye array, skal til sidst kopieres tilbage til arket.

Men jeg kan ikke få det til at fungere !
Er der nogen der kan give et bud på hvad der er galt med koden ?

På Forhånd tak.

Laugesen



Koden:

Public Sub KopierFraArray()
Dim MyArray As Variant
Dim NewArray As Variant
Dim x As Integer
Dim Y As Integer
Dim k As Integer

k = 1
'Range indlæses i MyArray - antal rækker kan variere fra 50 - 300. Antal kolonner vil stort set være det samme hver gang.
MyArray = Range("AT15", Range("AT15").End(xlDown).End(xlToRight))

    For x = LBound(MyArray, 1) To UBound(MyArray, 1)
    For Y = LBound(MyArray, 2) To UBound(MyArray, 2)
   
    'Hvis en række har følgende værdier i 3 kolonner:
    'Værdien i kolonne 3 (i MyArray) er "Visa/dk", værdien i kolonne 4 er dato "23-06-14"
    'og værdien i kolonne 5 er "1234"
    'Så skal rækken kopieres til NewArray.
   
        If MyArray(x, 3) = "Visa/dk" And MyArray(x, 4) = "23-06-14" And MyArray(x, 5) = "1234" Then
            NewArray(k, Y) = MyArray(x, Y)
            k = 1 + 1
        End If
    Next
        Next
       
Range("V35").Resize(UBound(NewArray, 1), UBound(NewArray, 2)) = NewArray
Set NewArray = Nothing

End Sub
Avatar billede bak Seniormester
15. juli 2014 - 10:50 #1
Et par små ændringer og det buede virke :

Public Sub KopierFraArray()
    Dim MyArray As Variant
    Dim NewArray As Variant
    Dim x As Integer
    Dim Y As Integer
    Dim k As Integer

    k = 1
    'Range indlæses i MyArray - antal rækker kan variere fra 50 - 300. Antal kolonner vil stort set være det samme hver gang.
    MyArray = Ark1.Range("AT151", Ark1.Range("AT151").End(xlDown).End(xlToRight))
    'det nye array skal dimmmes
    ReDim NewArray(1 To UBound(MyArray, 1), 1 To UBound(MyArray, 2))
    For x = LBound(MyArray, 1) To UBound(MyArray, 1)


        'Hvis en række har følgende værdier i 3 kolonner:
        'Værdien i kolonne 3 (i MyArray) er "Visa/dk", værdien i kolonne 4 er dato "23-06-14"
        'og værdien i kolonne 5 er "1234"
        'Så skal rækken kopieres til NewArray.

        If MyArray(x, 3) = "Visa/dk" And MyArray(x, 4) = "23-06-14" And MyArray(x, 5) = "1234" Then
            For Y = LBound(MyArray, 2) To UBound(MyArray, 2)
                NewArray(k, Y) = MyArray(x, Y)
            Next
            k = k + 1
        End If

    Next

    Ark2.Range("V35").Resize(UBound(NewArray, 1), UBound(NewArray, 2)) = NewArray
    Set NewArray = Nothing

End Sub
Avatar billede bak Seniormester
15. juli 2014 - 10:59 #2
Ups, havde lige brugt egne arknavne

Public Sub KopierFraArray()
    Dim MyArray As Variant
    Dim NewArray As Variant
    Dim x As Integer
    Dim Y As Integer
    Dim k As Integer

    k = 1
    'Range indlæses i MyArray - antal rækker kan variere fra 50 - 300. Antal kolonner vil stort set være det samme hver gang.
    MyArray = Ark1.Range("AT151", Range("AT151").End(xlDown).End(xlToRight))
    'det nye array skal dimmmes
    ReDim NewArray(1 To UBound(MyArray, 1), 1 To UBound(MyArray, 2))
    For x = LBound(MyArray, 1) To UBound(MyArray, 1)


        'Hvis en række har følgende værdier i 3 kolonner:
        'Værdien i kolonne 3 (i MyArray) er "Visa/dk", værdien i kolonne 4 er dato "23-06-14"
        'og værdien i kolonne 5 er "1234"
        'Så skal rækken kopieres til NewArray.

        If MyArray(x, 3) = "Visa/dk" And MyArray(x, 4) = "23-06-14" And MyArray(x, 5) = "1234" Then
            For Y = LBound(MyArray, 2) To UBound(MyArray, 2)
                NewArray(k, Y) = MyArray(x, Y)
            Next
            k = k + 1
        End If

    Next

    Range("V35").Resize(UBound(NewArray, 1), UBound(NewArray, 2)) = NewArray
    Set NewArray = Nothing

End Sub
Avatar billede Laugesen1 Mester
15. juli 2014 - 13:56 #3
Hej Bak

Mange tak for dit svar.
Det fungerer helt efter hensigten:)

Men jeg har et lille problem mere, som jeg håber du kan hjælpe med.

Der skal sorteres efter et kriterium mere.
I en kolonne (5), skal der også sortere efter klokkeslæt, i start og slut af ugen.
Jeg har skrevet det ind i koden, men det fungerer ikke som det skal.

Det ser ud til, at der er problemer når klokkeslættet starter med "00" eller "01".
Er det måske et klokkeslæt-format der skal skrives ind i koden ?
Har du et bud på hvad der er galt ?

Bemærk ændringer i koden:
Range er ændret til "Range("AT15")
I MyArray er kolonne 5 nu "klokkeslæt" og kolonne 7 er "1234".



Public Sub KopierFraArray1()
    Dim MyArray As Variant
    Dim NewArray As Variant
    Dim x As Integer
    Dim Y As Integer
    Dim k As Integer

    k = 1
    'Range indlæses i MyArray - antal rækker kan variere fra 50 - 300. Antal kolonner vil stort set være det samme hver gang.
    MyArray = Ark1.Range("AT15", Range("AT15").End(xlDown).End(xlToRight))
    'det nye array skal dimmmes
    ReDim NewArray(1 To UBound(MyArray, 1), 1 To UBound(MyArray, 2))
    For x = LBound(MyArray, 1) To UBound(MyArray, 1)


        'Hvis en række har følgende værdier i 3 kolonner:
        'Værdien i kolonne 3 (i MyArray) er "Visa/dk", værdien i kolonne 4 er dato "23-06-14"
        'og værdien i kolonne 5 er "1234"
        'Så skal rækken kopieres til NewArray.

        If MyArray(x, 3) = "Visa/dk" And MyArray(x, 4) = "21-06-2014" And MyArray(x, 5) < "14:00:00" And MyArray(x, 7) = "1234" Then
            For Y = LBound(MyArray, 2) To UBound(MyArray, 2)
                NewArray(k, Y) = MyArray(x, Y)
            Next
            k = k + 1
        End If

    Next

    Range("V35").Resize(UBound(NewArray, 1), UBound(NewArray, 2)) = NewArray
    Set NewArray = Nothing

End Sub
Avatar billede Laugesen1 Mester
16. august 2014 - 22:40 #4
Hej bak

Det fungerer helt efter hensigten med den lille ændring i arrayet.
Og jeg har fundet ud af at indsætte kriterier for klokkeslæt og dato i array.

Sender du et svar? - så jeg kan give dig points :)

Laugesen
Avatar billede bak Seniormester
18. august 2014 - 18:52 #5
Her er så lige et svar :-)
Avatar billede Laugesen1 Mester
19. august 2014 - 01:03 #6
Mange tak for hjælpen :)

Laugesen
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

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