Avatar billede Laugesen1 Mester
13. september 2016 - 00:06 Der er 5 kommentarer og
1 løsning

Sorter i array med offset

Med en makro skal jeg kopiere rækker i et range ud fra et søgekriterie i rækken ovenover.

Jeg indlæser data til et array, og de rækker jeg efterfølgende skal bruge, bliver sorteret ud fra søgekriterier i flere af kolonnerne. Det virker fint, når søgekriterierne er i samme række.
Men nu er jeg stødt på det problem, at jeg skal udvide søgekriteriet, til at omfatte værdien der er i rækken lige ovenover.

Altså i selve arrayet, skal der både søges i selve rækken, og i en kolonne skal der søges efter en bestemt celleværdi i rækken lige ovenover.
Hvordan gør man det?

Jeg har prøvet med at sætte Offset ind som i nedenstående eksemplet, men der kommer en fejl.
Der skal søges efter celleværdien Gul i kolonne 5 og celleværdien 222 i kolonne 6, men i rækken lige op over.

Uddrag af makro:
        If MyArray(x, 5) = "gul" And MyArray(x, 6).Offset(-1, 0) = "222" Then
            For y = LBound(MyArray, 2) To UBound(MyArray, 2)
                NewArray(K, y) = MyArray(x, y)
                    Next
                        K = K + 1
        End If
        Next

Er der nogen der har et godt bud på, hvordan man skriver det ind i makroen?

På forhånd tak
Laugesen
Avatar billede kabbak Professor
13. september 2016 - 04:40 #1
If MyArray(x, 5) = "gul" And MyArray(x-1, 6) = "222" Then


NB husk at starte løkken ved den anden række i arrayet, ellers får du fejl
Avatar billede Max_P_Larsen Seniormester
13. september 2016 - 10:11 #2
Man kan ikke bruge Offset uden et objekt som f.eks. Range.
Derfor er kabbak's løsning også den rigtige.
Avatar billede Laugesen1 Mester
13. september 2016 - 12:22 #3
Hej kabbak
Tak for dit svar.

Jeg er i tvivl om, hvordan jeg sætter løkken til at starte i 2. række i arrayet?

Hele makroen:
Public Sub TestArrayOffset()

Dim MyArray As Variant
Dim NewArray As Variant       
Dim x As Integer
Dim y As Integer
Dim K As Integer

    MyArray = Sheets("Ark1").Range("A1:F27")
        K = 1
        ReDim NewArray(1 To UBound(MyArray, 1), 1 To UBound(MyArray, 2))
        For x = LBound(MyArray, 1) To UBound(MyArray, 1)


        If MyArray(x, 5) = "gul" And MyArray(x, 6) = "222" Then
            For y = LBound(MyArray, 2) To UBound(MyArray, 2)
                NewArray(K, y) = MyArray(x, y)
                    Next
                        K = K + 1
        End If
        Next
   
        Range("H1").Resize(UBound(NewArray, 1), UBound(NewArray, 2)) = NewArray
        Erase NewArray
End Sub
Avatar billede Max_P_Larsen Seniormester
13. september 2016 - 12:41 #4
Du skal lægge én til MyArray's lower bound, hvor loop'et startes:

For x = LBound(MyArray, 1) + 1 To UBound(MyArray, 1)
Avatar billede Laugesen1 Mester
13. september 2016 - 12:55 #5
Hej Max_P_Larsen

Så virker mit array som det skal, når jeg lægger én til MyArray's lower bound.
Avatar billede Laugesen1 Mester
13. september 2016 - 15:39 #6
Tak for hjælpen til kabbak og Max_P_Larsen
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