Avatar billede i865 Nybegynder
31. august 2007 - 11:23 Der er 10 kommentarer og
2 løsninger

Kopier et Array til et andet under betingelse

Hej er der nogen eksperter der kan give mig et bud på en VBA kode hvor jeg kopier et array til et nyt array såfremt en given betingelse er opfyldt på data, som ligger i det første array?

Fx. Array 1 indeholder Items og pris. Array 2 indeholder kun de Items hvis pris er = 500.

På forhånd tak.
Avatar billede excelent Ekspert
31. august 2007 - 16:56 #1
For t = 1 To UBound(x1)
If x1(t, 2) = 500 Then a = a + 1: x2(a, 1) = x1(t, 1): x2(a, 2) = x1(t, 2)
Next
Avatar billede i865 Nybegynder
03. september 2007 - 11:20 #2
Jeg har prøvet følgene, men får fejl (type mismatch).

Private Sub CopyArrayTest()

    Dim x1 As Variant, x2 As Variant
    Dim a As Integer, t As Integer

    x1 = Worksheets("Test").Range("A4:B7")

    For t = 1 To UBound(x1)
        If x1(t, 2) = 500 Then
            a = a + 1
            x2(a, 1) = x1(t, 1)
            x2(a, 2) = x1(t, 2)
        End If
    Next

    Worksheets("Test").Range("D4").Resize(UBound(x2, 1), UBound(x2, 2)) = x2

End Sub
Avatar billede kabbak Professor
03. september 2007 - 12:01 #3
Kan du ikke bruge advanseret filter

Du har data i A4 til B7, og vil gerne have de valgte over i D4 og videre.

Dine data starter så I A4 og til B7

Lav overskrifter på kolonnerne I A3 og B3

Lav Samme overskrift i C1 som du har i B3

I D3og E3, de samme overskrifter som i A3 og B3

sæt denne kode ind i arkets modul

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$2" Then
' Ret ("A3:B7") til det område du har data i, incl. overskrifter
    Range("A3:B7").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
        "C1:C2"), CopyToRange:=Range("D3:E3"), Unique:=False
        End If
End Sub



skriv så den værdi du vil have i C2, så skulle de komme over i  D og E kolonnen
Avatar billede i865 Nybegynder
03. september 2007 - 13:00 #4
Kabbak jeg påskønner din hjælp, men jeg kan ikke få det til at virke. Jeg forstår ikke helt hvorfor du skriver at jeg ikke kan bruge avanceret filter - gør jeg det?
I din kode forstår jeg hellere hvad er (ByVal Target As Range) gør. Jeg er rimmelig grøn :).
Avatar billede kabbak Professor
03. september 2007 - 13:30 #5
send lige dit regneark til mig så laver jeg det og sender det retur.

kabbak snabela tiscali dot dk
Avatar billede excelent Ekspert
03. september 2007 - 15:33 #6
Private Sub CopyArrayTest()

    Dim x1 As Variant, x2(20, 20) As Variant
    Dim a As Integer, t As Integer

    x1 = Worksheets("Test").Range("A4:B7")

    For t = 1 To UBound(x1)
        If x1(t, 2) = 500 Then
            a = a + 1
            x2(a, 1) = x1(t, 1)
            x2(a, 2) = x1(t, 2)
        End If
    Next

    Worksheets("Test").Range("D4").Resize(UBound(x2, 1), UBound(x2, 2)) = x2

End Sub
Avatar billede i865 Nybegynder
04. september 2007 - 11:20 #7
Jeg har fået begge løsninger til at virke! Og kan se der er både fordele og ulemper.

Løsning kabbak: nem og enkel, jeg ser dog ikke at jeg kan arbejde med den som en variable (array).

Løsning excelent: Jeg kan arbejde videre med daterne i variablen (array) men løsningen forudsætter at jeg kender array 'ets (x2) størrelse.

Er I enig?

Jeg vil anvend begge løsninger i min virdere programering og det med størrelse af array har jeg løst ved at gennemløbet source array 'et to gange.

Jeg fordeler point 50% til hver - så send mig lige svar så jeg kan overføre.

Tak for hjælpen!

By the way... tror jeg nok en af jer er stærk på http://www.eksperten.dk/spm/793715
Avatar billede kabbak Professor
04. september 2007 - 13:06 #8
ok og et svar ;-))
Avatar billede excelent Ekspert
04. september 2007 - 15:27 #9
ok:

for mig at se har du taklet x2's størrelse ret flot med denne

Worksheets("Test").Range("D4").Resize(UBound(x2, 1), UBound(x2, 2)) = x2
Avatar billede i865 Nybegynder
04. september 2007 - 15:56 #10
Nej excelent den går ikke!

Worksheets("Test").Range("D4").Resize(UBound(x2, 1), UBound(x2, 2)) = x2

Fortæller kun at jeg ønsker at placer indholdet FRA Range D4 - jeg resize 'er altså det range hvor jeg vil placere mit array! Men se koden nedenfor:

Hermed lukker jeg.

'...Define size of destination array - because you can resize only the last array dimension!!!
    For iSourceD1 = 1 To iSourceUBoundD1
        If vSourceArray(iSourceD1, 3) = CapGrp Then
            iDestinationUBoundD2 = iDestinationUBoundD2 + 1
        End If
    Next
    ReDim vDestinationArray(iDestinationUBoundD2, iSourceUBoundD2)
   
    iDestinationD1 = 1
    For iSourceD1 = 1 To iSourceUBoundD1
        '...If a match then begin to load into the new array
        If vSourceArray(iSourceD1, 3) = CapGrp Then
           
            For iSourceD2 = 1 To iSourceUBoundD2
                vDestinationArray(iDestinationD1, iSourceD2) = vSourceArray(iSourceD1, iSourceD2)
            Next
       
        iDestinationD1 = iDestinationD1 + 1
        End If
    Next
Avatar billede excelent Ekspert
04. september 2007 - 19:46 #11
øhh hvad er vi uenige om :-)
og det er nok nemmest hvis vi tager udganspunkt i koden
fra kommentar 15:33:59
Avatar billede i865 Nybegynder
01. oktober 2007 - 12:45 #12
excent iflg. 15:27:10 det lader til at du mener at jeg kan resize array med;

Worksheets("Test").Range("D4").Resize(UBound(x2, 1), UBound(x2, 2)) = x2

Det kan man ikke - som jeg nævner under starten af 15:56:23 - det er range 'et der bliver tilpasset - ikke array 'et! :)

Lukker
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