Avatar billede kgndksv Juniormester
21. oktober 2009 - 23:28 Der er 20 kommentarer og
1 løsning

Markering af område ud fra celler indhold - Markeringen skal sorteres...

Hej

Jeg har et ark hvor forskellige områder skal sorteres.

Jeg kan ikke lave absolutte områder fordi det varierer hvor store områderne er...
Men der er nogle forhold som aldrig ændre sig
i kolonne A vil området der skal markeres altid være mellem en celle hvor i der står POPL og en celle hvor i der står POIL området starter i cellen under POPL og slutter i cellen lige over POIL og så dækker området helt ud til kolonne S

Kan man bruge Target.value = POPL og det eller andet med offset(1,19) eller noget eller skal det laves som en løkke??

Til sidst skal området sorteres efter kolonne b stigende...

Er det helt umuligt at lave?? :-)
Avatar billede tjacob Juniormester
22. oktober 2009 - 10:35 #1
Prøv med denne:

Den forudsætter: data starter i A1 eller A2, og at POPL og POIL kun forekommer en gang hver i kolonne A.

Sub SorterOmråde()

    Dim a As Long, b As Long, Aend As Long
    Dim pRange As Range
   
    Aend = Range("A2").End(xlDown).Row
    Set pRange = Range(Cells(1, 1), Cells(Aend, 1))
    a = WorksheetFunction.Match("POPL", pRange, 0) + 1
    b = WorksheetFunction.Match("POIL", pRange, 0) - 1
    Set pRange = Range(Cells(a, 1), Cells(b, 19))
    pRange.Select
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Range(Cells(a, 2), Cells(b, 2)), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Ark1").Sort
        .SetRange pRange
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("A1").Select

End Sub
Avatar billede kgndksv Juniormester
22. oktober 2009 - 11:12 #2
et ser jo rigtig nok ud - Men den skriver ved en fejl ved linien:

b = WorksheetFunction.Match("POIL", pRange, 0) - 1

Fejlen er:
Runtime error '1004':
kan ikke angive egenskaben match for klassen worksheetFunktion

Jeg har dobbelt tjekket at der står det samme i de celler som der står i koden...
Avatar billede tjacob Juniormester
22. oktober 2009 - 11:20 #3
Det kører fint hos mig.
Fejlen plejer at betyde at der IKKE står poil i kolonne A.
Er du sikker på at der ikke er et mellemrum eller noget?
Avatar billede kgndksv Juniormester
22. oktober 2009 - 11:47 #4
Jamen det var også hvad jeg troede, men ligegyldigt hvad jeg skriver kommer den med fejlen i anden Worksheet.function linie...!! :-)

kan det have noget med formateringen i cellen? den er godt nok standard...
Avatar billede kgndksv Juniormester
22. oktober 2009 - 11:51 #5
Jeg har prøvet at teste om der står det samme med denne og det gør der

Sub prøve()
If Range("A21").Value = "POIL" Then
MsgBox ("OK")
End If
End Sub
Avatar billede tjacob Juniormester
22. oktober 2009 - 12:16 #6
Ja, den er godtnok mystisk.....

Alternativt kan vi jo selv finde værdien i stedet for at bruge Match:

Sub SorterOmråde()

    Dim a As Long, b As Long, i As Long, Aend As Long
    Dim pRange As Range
    Aend = Range("A2").End(xlDown).Row
    For i = 1 To Aend
        If Cells(i, 1).Value = "POPL" Then a = i
        If Cells(i, 1).Value = "POIL" Then b = i
    Next i
    Set pRange = Range(Cells(a, 1), Cells(b, 19))
    pRange.Select
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Range(Cells(a, 2), Cells(b, 2)), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Ark1").Sort
        .SetRange pRange
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("A1").Select

End Sub
Avatar billede tjacob Juniormester
22. oktober 2009 - 12:19 #7
Ups der er en fejl  ret til:

Then a = i +1
Then b = i -1
Avatar billede tjacob Juniormester
22. oktober 2009 - 12:36 #8
Der er også en mindre "fejl" ved angivelsen af Ark1 så brug denne:

Sub SorterOmråde()

    Dim a As Long, b As Long, i As Long, Aend As Long
    Dim pRange As Range
    Aend = Range("A2").End(xlDown).Row
    For i = 1 To Aend
        If Cells(i, 1).Value = "POPL" Then a = i + 1
        If Cells(i, 1).Value = "POIL" Then b = i - 1
    Next i
    Set pRange = Range(Cells(a, 1), Cells(b, 19))
    pRange.Select
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Range(Cells(a, 2), Cells(b, 2)), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange pRange
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("A1").Select

End Sub
Avatar billede kgndksv Juniormester
22. oktober 2009 - 14:36 #9
Hmm... denne kode giver mig fejlen:

Run-time error'1004'
Application-defined of object-defined error

fejlen opstår i denne linie:
Set pRange = Range(Cells(a, 1), Cells(b, 19))

Jeg kan også se at a rigtig nok får værdien 4, men b får værdien 0 selvom værdien skulle være 8....?
Avatar billede tjacob Juniormester
22. oktober 2009 - 14:46 #10
Ja, det er åbenbart samme problem, som ved Match: Den kan ikke finde en celle med værdien "POIL".

Jeg kan ikke forklare det, hos mig finder den fint "POIL" uanset om jeg bruger den ene eller anden metode.

Har du prøvet at slette cellen og skrive POIL igen?
Avatar billede tjacob Juniormester
22. oktober 2009 - 14:53 #11
Det kunne være der i cellen står:
[mellemrum]POIL    eller
POIL[mellemrum]    eller
PO1L
Avatar billede kgndksv Juniormester
22. oktober 2009 - 16:08 #12
Nope, ingen mellemrum - jeg har også prøvet at ændre ordene...
Avatar billede kgndksv Juniormester
22. oktober 2009 - 16:17 #13
Kan der være nogle indstiller i excel/VB jeg kan have slået fra...?
Avatar billede tjacob Juniormester
22. oktober 2009 - 16:26 #14
Det kan jeg ikke forestille mig, -så ville der også være problemer med a.

Prøv at kopiere alle celler og sæt ind i et andet ark, og kør makroen derfra..........
Avatar billede kgndksv Juniormester
22. oktober 2009 - 16:39 #15
hmm... samme fejl... Men det var sku underligt!!

Det underlige er at selv om jeg opretter en helt ny fil med et tilsvarende ekempel skriver den samme fejl...
Avatar billede kgndksv Juniormester
25. oktober 2009 - 21:45 #16
For Fa...n!!

Aend = Range("A2").End(xlDown).Row


Aend fik en forkert værdi fordi området skulle starte ved "A3"!!!

Nu virker det!!!

Tusind tak endnu engang!!!


Er det muligt at sortere to områder på én gang? eller skal jeg bare kopiere koden efter hinanden og sortere område efter område?
Avatar billede kgndksv Juniormester
25. oktober 2009 - 21:45 #17
Hov forresten sender du et svar :-)
Avatar billede tjacob Juniormester
26. oktober 2009 - 09:42 #18
Svaret kommer her...

Du kan ikke sortere to områder på en gang. Du kan naturligvis godt definere et range der består af to områder, og så sortere. Men de to områder vil så blive sorteret sammen, -altså blandet.
Avatar billede kgndksv Juniormester
26. oktober 2009 - 09:48 #19
Ja ok, det var egentlig også det jeg mente :-)

Kan du forklare mig hvorfor koden ikke virker i excel 2003

Fejlen opstår her:
[div]ActiveSheet.Sort.SortFields.Clear[div/]

Jeg har dobbelt testet det i 2007 og der virker arket...?
Avatar billede tjacob Juniormester
26. oktober 2009 - 10:13 #20
Jeg kan ikke forklare fejlen i 2003 (har den ikke selv installeret).

Du kunne prøve at erstatte ActiveSheet med arkets navn, altså: Sheets("Arknavn").

Linien med SortFields.Clear er muligvis heller ikke nødvendig. Du kunne prøve bare at slette den.
Avatar billede kgndksv Juniormester
27. oktober 2009 - 11:27 #21
OK, underlader at sortere hvis det ikke er excel 2007:

If Application.Version = "12.0" Then
Call SorterOmråde
Else
MsgBox ("Arket sorteres ikke fordi du ikke kører en Excel 2007")
End If

:-)
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
Kurser inden for grundlæggende programmering

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