Avatar billede fanth Nybegynder
23. december 2005 - 20:58 Der er 15 kommentarer og
1 løsning

hjælp til macro

Hej.

Har en lille udfordring jeg har knoklet lidt med, men kan godt se at jeg skal bruge lidt eksperthjælp.

Jeg har et regneark med ca. 35.000 rækker. Hver måned kommer der en ny liste med nye rækker. Antallet svinger fra måned til måned. Men vil oftes ligge mellem 30.000 og  40.000.

Hver række består af følgende kolonner:
Land
Team
No
Navn
Ono
Farve
Type
Date
Svc
Svc d

Ono er et Ordrenummer. Det er ikke unikt, da der kan være flere vare på samme ordre. Desværre kan disse være spredt rundt i arket.

Der skal sorteres og fjernes i arket. Da der kommer et nyt ark tænkte jeg det ville være smart med en makro. Enten en som selv hentede data over eller hvor man manuelt kopierede data over.
Jeg skal bruge en makro der skal kunne følgende:

Først skal der fjernes alle rækker som indholder farverne roed & blaa.

Så skal der ryddes op udfra følgende kriterier

Alle ordrenumre hvor en af varerne indeholder en af følgende kombination  på felterne svc & svc d

BPack     3y
NBDS     3y
SVB     30D
SPack    3Y


For eksempel. Hvis man søger på NBDS 3Y finder man følgende:
Norway    NW Websales    2199878    1    601325842    sort    bil 17    26-10-2005    NBDS    3Y

Søger man videre på ordrenumret så kommer følgende 2 op:

Norway    NW Websales    2199878    1    601325842    sort    bil 17    26-10-2005

Norway    NW Websales    2199878    1    601325842    sort    bil 17    26-10-2005    SVB    30D


Alle 3 skal slettes.

Til sidst skal der kun være de ordre tilbage hvor ingen af varerne indeholder ovenstående kombination. Derefter skal antallet beskæres så der kun er en vare tilbage for hvert ordernummer.

For eksempel. Så findes der på denne order 2 forskellige varer.

Sweden    SW Websales    2279174    1    592490141    gul    bil 3    26-10-2005       

Sweden    SW Websales    2279174    1    592490141    gul    bil 3    26-10-2005    OTH    0Y

Dette skal skæres ned så der kun er en tilbage.

Sweden    SW Websales    2279174    1    592490141    gul    bil 3    26-10-2005       

I ovenstående tlifælde står der samme tekst, men det kan sagtens være 2 forskellige tekster, dog vil følgende felster altid være ens:
Land    Team    No    Navn    Ono    Date


Slutteligt skal der sorteres på No. Her kan der godt være flere forskellige ordre (Ono) på samme nummer.


Kort sagt så skal hver ordre (Ono) hvor en af varerne ikke indeholder en af kombinationer (BPack+3y, NBDS+3y, SVB+30D eller SPack+3Y). Være repræsenteret med 1 linie.

Jeg har lagt en kopi af arket ud tli download her:
http://www.fanth.dk/excel/ex/sort.xls

På sheet1 er selve arket
På sheet2 er et eksempel på hvordan resultatet kunne se ud. Dette er lavet på den langtrukne måde, så det er kun de ca. 500 som er rigige. :)

Håber det er til at forstå. :)
Avatar billede kabbak Professor
24. december 2005 - 00:56 #1
prøv at teste denne

først sætter den farver på de uønskede, og derefter kopierer resten over i Sheet3

Public Sub FarvUønskedeOgKopierResten()
Dim FJ1 As Variant, Farve As Variant, RW As Long, I As Long, A As Long, X As Long, Data As Variant
Farve = Array("roed", "blaa")
FJ1 = Array("BPack3y", "NBDS3y", "SVB30D", "SPack3Y")
RW = Range("A65536").End(xlUp).Row
'Land    Team    No  Navn    Ono Farve  Type    Date    Svc Svc d
'  1      2      3    4      5    6      7      8      9  10

' laver tal som tekst om til tal
    Range("L1").Value = 1
    Range("L1").Copy
    Range("C2:C" & RW & ",E2:E" & RW).Select
    Range("E1").Activate
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
        SkipBlanks:=False, Transpose:=False
    Range("L1") = ""
   
' sortering på Ono
      Columns("A:J").Sort Key1:=Range("E2"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
       
' finder de 2 farver
Data = Range("A2:J" & RW)
For I = 1 To UBound(Data)
    If Data(I, 6) = Farve(0) Or Data(I, 6) = Farve(1) Then
        Rows(I + 1).Interior.ColorIndex = 6
    End If
Next

'Finder Alle ordrenumre hvor en af varerne indeholder en af følgende kombination  på felterne svc & svc d
For I = 1 To UBound(Data)
    kb = Data(I, 9) & Data(I, 10)
    For A = 0 To 3
        If FJ1(A) = kb Then
            For X = I - 10 To I + 10
                If Data(X, 5) = Data(I, 5) Then
                    Rows(X + 1).Interior.ColorIndex = 7
                End If
            Next
        End If
    Next
Next

' Farver dubletter
For I = 2 To UBound(Data)
    If Data(I, 5) = Data(I - 1, 5) Then
        Rows(I + 1).Interior.ColorIndex = 8
    End If
Next
' Kopierer resten til Sheet3
For I = 1 To UBound(Data)
    If Rows(I & ":" & I).Interior.ColorIndex = xlNone Then
        Rows(I & ":" & I).Copy Sheets("Sheet3").Range("A" & Sheets("Sheet3").Range("A65536").End(xlUp).Row + 1)
    End If
Next
End Sub
Avatar billede kabbak Professor
24. december 2005 - 01:10 #2
kan vist koges ned til
Public Sub FarvUønskedeOgKopierResten()
Dim FJ1 As Variant, Farve As Variant, RW As Long, I As Long, A As Long, X As Long, Data As Variant
Farve = Array("roed", "blaa")
FJ1 = Array("BPack3y", "NBDS3y", "SVB30D", "SPack3Y")
RW = Range("A65536").End(xlUp).Row
'Land    Team    No  Navn    Ono Farve  Type    Date    Svc Svc d
'  1      2      3    4      5    6      7      8      9  10

' sortering på Ono
      Columns("A:J").Sort Key1:=Range("E2"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
       
' finder de 2 farver
Data = Range("A2:J" & RW)
For I = 1 To UBound(Data)
    If Data(I, 6) = Farve(0) Or Data(I, 6) = Farve(1) Then
        Rows(I + 1).Interior.ColorIndex = 6
    End If
Next

'Finder Alle ordrenumre hvor en af varerne indeholder en af følgende kombination  på felterne svc & svc d
For I = 1 To UBound(Data)
    kb = Data(I, 9) & Data(I, 10)
    For A = 0 To 3
        If FJ1(A) = kb Then
        If I - 10 < 1 Then X = 1 Else X = I - 10
            For X = X To I + 10
                If Data(X, 5) = Data(I, 5) Then
                    Rows(X + 1).Interior.ColorIndex = 7
                End If
            Next
        End If
    Next
Next

' Farver dubletter
For I = 2 To UBound(Data)
    If Data(I, 5) = Data(I - 1, 5) Then
        Rows(I + 1).Interior.ColorIndex = 8
    End If
Next
' Kopierer resten til Sheet3
For I = 1 To UBound(Data)
    If Rows(I & ":" & I).Interior.ColorIndex = xlNone Then
        Rows(I & ":" & I).Copy Sheets("Sheet3").Range("A" & Sheets("Sheet3").Range("A65536").End(xlUp).Row + 1)
    End If
Next
End Sub
Avatar billede bak Forsker
24. december 2005 - 01:49 #3
godt lavet, kabbak
God jul
/bak
Avatar billede kabbak Professor
24. december 2005 - 10:13 #4
Bak -> God jul til dig også

Jeg regnede med, at du kom på banen og rettede den til ;-))
Avatar billede bak Forsker
24. december 2005 - 11:54 #5
har jeg allerede gjort :-), men der er jo højst 3-4 sek at tjene og det skal en velfungerende kode da ikke skilles ad for.

Er du begyndt at bruge SmartIndenter på din kode? 
Den har jeg brugt længe, da jeg ikke gider sidde at formatere min kode, når et program kan gøre det.
Avatar billede kabbak Professor
25. december 2005 - 10:04 #6
hvad er SmartIndenter, en der automatisk laver kodeindrykning ??
Avatar billede bak Forsker
25. december 2005 - 11:13 #7
Avatar billede kabbak Professor
25. december 2005 - 21:36 #8
tak bak, det er jo nemt, ikke alle de tabulatorer og mellemrum, man brugte før.
Avatar billede kabbak Professor
27. december 2005 - 20:43 #9
Bak, tjek lige denne.

Public Sub FjernUønskedeOgKopierResten()
    Dim FJ1 As Variant, Farve As Variant, RW As Long, I As Long, A As Long, X As Long, Data As Variant, Tjek() As Variant
    Dim Res() As Variant, R As Long
    Farve = Array("roed", "blaa")
    FJ1 = Array("BPack3y", "NBDS3y", "SVB30D", "SPack3Y")
    RW = Sheets("Sheet1").Range("A65536").End(xlUp).Row
    ReDim Tjek(RW)
    'Land    Team    No  Navn    Ono Farve  Type    Date    Svc Svc d
    '  1      2      3    4      5    6      7      8      9  10

    ' sortering på Ono
    Columns("A:J").Sort Key1:=Range("E2"), Order1:=xlAscending, Header:= _
                        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                        DataOption1:=xlSortNormal

    ' finder de 2 farver
    Data = Sheets("Sheet1").Range("A1:J" & RW)
    ReDim Res(UBound(Data), 9)
    For I = 1 To UBound(Data)
        If Data(I, 6) = Farve(0) Or Data(I, 6) = Farve(1) Then
            Tjek(I) = I
        End If
    Next

    'Finder Alle ordrenumre hvor en af varerne indeholder en af følgende kombination  på felterne svc & svc d
    For I = 1 To UBound(Data)
        kb = Data(I, 9) & Data(I, 10)
        For A = 0 To 3
            If FJ1(A) = kb Then
                If I - 10 < 1 Then X = 1 Else X = I - 10
                For X = X To I + 10
                    If Data(X, 5) = Data(I, 5) Then
                        Tjek(I) = I
                    End If
                Next
            End If
        Next
    Next

    ' Finder dubletter
    For I = 2 To UBound(Data)
        If Data(I, 5) = Data(I - 1, 5) Then
            Tjek(I) = I
        End If
    Next
   
    ' Overfører den der skal bruges til array res
    R = 0
    For I = 1 To UBound(Tjek)
        If IsEmpty(Tjek(I)) Then
            For X = 1 To 10
                Res(R, X - 1) = Data(I, X)
            Next

            R = R + 1
        End If
    Next
    ' Kopierer resten til Sheet3

    Sheets("Sheet3").Range("A1").Resize(UBound(Res, 1), UBound(Res, 2)) = Res

End Sub
Avatar billede bak Forsker
28. december 2005 - 19:47 #10
Så kan den nok ikke blive hurtige. Den er en smule hurtigere end min egen version (det er jeg jo ikke meget for at indrømme) :-)
Rigtig flot optimeret, kabbak
Men jeg får faktisk to forskellige resultater, når jeg kører din første og din nye makro.
Avatar billede kabbak Professor
29. december 2005 - 01:08 #11
Nu er de tjekket op mod hinanden, der var lidt rettelser, men nu skulle de gøre det ens.

Public Sub FarvUønskedeOgKopierResten()
Dim FJ1 As Variant, Farve As Variant, RW As Long, I As Long, A As Long, X As Long, Data As Variant
Farve = Array("roed", "blaa")
FJ1 = Array("BPack3y", "NBDS3y", "SVB30D", "SPack3Y")
RW = Range("A65536").End(xlUp).Row
'Land    Team    No  Navn    Ono Farve  Type    Date    Svc Svc d
'  1      2      3    4      5    6      7      8      9  10

' sortering på Ono
      Columns("A:J").Sort Key1:=Range("E2"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
       
' finder de 2 farver
Data = Range("A1:J" & RW)
For I = 1 To UBound(Data)
    If Data(I, 6) = Farve(0) Or Data(I, 6) = Farve(1) Then
        Rows(I).Interior.ColorIndex = 6
    End If
Next

'Finder Alle ordrenumre hvor en af varerne indeholder en af følgende kombination  på felterne svc & svc d
For I = 1 To UBound(Data)
    kb = Data(I, 9) & Data(I, 10)
    For A = 0 To 3
        If FJ1(A) = kb Then
        If I - 10 < 1 Then X = 1 Else X = I - 10
            For X = X To I + 10
                If Data(X, 5) = Data(I, 5) Then
                    Rows(X).Interior.ColorIndex = 7
                End If
            Next
        End If
    Next
Next

' Farver dubletter
For I = 2 To UBound(Data)
    If Data(I, 5) = Data(I - 1, 5) And Rows(I).Interior.ColorIndex = xlNone And Rows(I - 1).Interior.ColorIndex = xlNone Then
        Rows(I - 1).Interior.ColorIndex = 8
    End If
Next
' Kopierer resten til Sheet4
  R = 1
For I = 1 To UBound(Data)
    If Rows(I & ":" & I).Interior.ColorIndex = xlNone Then
        Rows(I & ":" & I).Copy Sheets("Sheet4").Range("A" & R)
        R = R + 1
    End If
Next
End Sub


Public Sub FjernUønskedeOgKopierResten()
    Dim FJ1 As Variant, Farve As Variant, RW As Long, I As Long, A As Long, X As Long, Data As Variant, Tjek() As Variant
    Dim Res() As Variant, R As Long
    Farve = Array("roed", "blaa")
    FJ1 = Array("BPack3y", "NBDS3y", "SVB30D", "SPack3Y")
    RW = Sheets("Sheet1").Range("A65536").End(xlUp).Row
    ReDim Tjek(RW)
    'Land    Team    No  Navn    Ono Farve  Type    Date    Svc Svc d
    '  1      2      3    4      5    6      7      8      9  10

    ' sortering på Ono
    Columns("A:J").Sort Key1:=Range("E2"), Order1:=xlAscending, Header:= _
                        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                        DataOption1:=xlSortNormal

    ' finder de 2 farver
    Data = Sheets("Sheet1").Range("A1:J" & RW)
    ReDim Res(UBound(Data), 9)
    For I = 1 To UBound(Data)
        If Data(I, 6) = Farve(0) Or Data(I, 6) = Farve(1) Then
            Tjek(I) = I
        End If
    Next

    'Finder Alle ordrenumre hvor en af varerne indeholder en af følgende kombination  på felterne svc & svc d
    For I = 1 To UBound(Data)
        kb = Data(I, 9) & Data(I, 10)
        For A = 0 To 3
            If FJ1(A) = kb Then
                If I - 10 < 1 Then X = 1 Else X = I - 10
                For X = X To I + 10
                    If Data(X, 5) = Data(I, 5) Then
                        Tjek(X) = I
                    End If
                Next
            End If
        Next
    Next

    ' Finder dubletter
    For I = 2 To UBound(Data)
        If Data(I, 5) = Data(I - 1, 5) And IsEmpty(Tjek(I)) And IsEmpty(Tjek(I - 1)) Then
            Tjek(I - 1) = I
        End If
    Next
   
    ' Overfører den der skal bruges til array res
    R = 0
    For I = 1 To UBound(Tjek)
        If IsEmpty(Tjek(I)) Then
            For X = 1 To 10
                Res(R, X - 1) = Data(I, X)
            Next

            R = R + 1
        End If
    Next
    ' Kopierer resten til Sheet3

    Sheets("Sheet3").Range("A1").Resize(UBound(Res, 1), (UBound(Res, 2) + 1)) = Res

End Sub
Avatar billede fanth Nybegynder
30. december 2005 - 20:01 #12
Wow. Dette er vildt. Havde håbet der var kommet svar, når jeg kom fra juleferie, men havde ikke regnet med at der 4 timer senere ville være et super svar. Jeg takker mange gange for hjælpe.

Et godt nytår til jer begge og tak for hjælpen.

/fanth

ps. er ikke den store bruger herinde, så er der ikke en som kan fortælle hvordan jeg giver de fortjente point til kabbak?
Avatar billede kabbak Professor
30. december 2005 - 21:37 #13
jeg smider lige et svar, så markerer du mit navn og trykker accepter.

NB.

det er 2 forskellige makroer, den sidste er den hurtigste, men de laver det samme.
Avatar billede fanth Nybegynder
31. december 2005 - 10:44 #14
Takker endnu engang for hjælpen.
Avatar billede kabbak Professor
31. december 2005 - 10:59 #15
virker den som den skal ??
Avatar billede kabbak Professor
31. december 2005 - 11:20 #16
jeg havde glemt sidste sortering på No.

Der er også tidtagning nu

Public Sub FjernUønskedeOgKopierResten()
    Dim FJ1 As Variant, Farve As Variant, RW As Long, I As Long, A As Long, X As Long, Data As Variant, Tjek() As Variant
    Dim Res() As Variant, R As Long
    tid = Now()
    Farve = Array("roed", "blaa")
    FJ1 = Array("BPack3y", "NBDS3y", "SVB30D", "SPack3Y")
    RW = Sheets("Sheet1").Range("A65536").End(xlUp).Row
    ReDim Tjek(RW)
    'Land    Team    No  Navn    Ono Farve  Type    Date    Svc Svc d
    '  1      2      3    4      5    6      7      8      9  10

    ' sortering på Ono
    Columns("A:J").Sort Key1:=Range("E2"), Order1:=xlAscending, Header:= _
                        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                        DataOption1:=xlSortNormal

    ' finder de 2 farver
    Data = Sheets("Sheet1").Range("A1:J" & RW)
    ReDim Res(UBound(Data), 9)
    For I = 1 To UBound(Data)
        If Data(I, 6) = Farve(0) Or Data(I, 6) = Farve(1) Then
            Tjek(I) = I
        End If
    Next

    'Finder Alle ordrenumre hvor en af varerne indeholder en af følgende kombination  på felterne svc & svc d
    For I = 1 To UBound(Data)
        kb = Data(I, 9) & Data(I, 10)
        For A = 0 To 3
            If FJ1(A) = kb Then
                If I - 10 < 1 Then X = 1 Else X = I - 10
                For X = X To I + 10
                    If Data(X, 5) = Data(I, 5) Then
                        Tjek(X) = I
                    End If
                Next
            End If
        Next
    Next

    ' Finder dubletter
    For I = 2 To UBound(Data)
        If Data(I, 5) = Data(I - 1, 5) And IsEmpty(Tjek(I)) And IsEmpty(Tjek(I - 1)) Then
            Tjek(I - 1) = I
        End If
    Next

    ' Overfører den der skal bruges til array res
    R = 0
    For I = 1 To UBound(Tjek)
        If IsEmpty(Tjek(I)) Then
            For X = 1 To 10
                Res(R, X - 1) = Data(I, X)
            Next

            R = R + 1
        End If
    Next
    ' Kopierer resten til Sheet3

    Sheets("Sheet3").Range("A1").Resize(UBound(Res, 1), (UBound(Res, 2) + 1)) = Res
   
    ' sortering på no
    Sheets("Sheet3").Select
    Columns("A:J").Sort Key1:=Range("C2"), Order1:=xlAscending, Header:= _
                        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                        DataOption1:=xlSortNormal
    ' tidtagning
    MsgBox " det tog " & Format((Now() - tid), "nn:ss") & " minutter" & vbCrLf _
    & "For " & I & " datalinier", vbOKOnly, "Tidtagning"
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