Avatar billede daki Juniormester
28. januar 2008 - 11:13 Der er 20 kommentarer og
1 løsning

sorter x-antal linier

Jeg har et ark på xx-antal linier i kolonne B indeholder nogle celler teksten grp. (er fed)
Det jeg ønsker, at xx-linier mellem de celler som indeholder teksten grp. bliver sorteret faldende efter kolonne P.

/dan
Avatar billede excelent Ekspert
28. januar 2008 - 16:10 #1
vis et eks... der er god mulighed for misforståelser her
Avatar billede daki Juniormester
28. januar 2008 - 16:57 #2
eks.
B5 = grp. 10
B6-B44 = firmanavn, A+C-O = div., P = beløb
B45 = grp. 18
B46-B47 = firmanavn, A+C-O = div., P = beløb
B48 = grp. 26
B49-B69 = firmanavn,  A+C-O = div., P = beløb
osv.
Skemaet slutter med teksten Total i Bxxx 

På næste mandag kan der så muligvis være kommet en linie ind i række47, så det hele er rykket en linie ned.

/dan
Avatar billede excelent Ekspert
28. januar 2008 - 17:06 #3
dvs. at linier som starter med grp  skal blive stående ?

er der kun værdier i kolonne B og P ? eller skal hele linien flyttes
Avatar billede daki Juniormester
28. januar 2008 - 20:37 #4
Ja, linier med grp er en total for de nedenstående linier.
Ja, hele linien skal flyttes/sorteres.

/dan
Avatar billede excelent Ekspert
28. januar 2008 - 22:04 #5
prøv lige på en kopi først

Sub SpecialSort()
Application.ScreenUpdating = False
Dim x()
Sheets("Ark1").Select
rk = Cells(1000, "B").End(xlUp).Row
ReDim x(rk)
For t = 1 To rk
If Cells(t, "B") Like "grp*" Then x(t) = Cells(t, "P").Formula: Cells(t, "P") = ""
Next
On Error Resume Next
For t = 1 To rk
If Cells(t, "B") <> "" And Cells(t, "B") <> "grp*" And Cells(t, "P") <> "" Then
rng = Range("A" & t & ":IV" & t)
maxtal = Application.WorksheetFunction.Max(Range("P" & t & ":P" & rk))
maxrk = Range("P" & t & ":P" & rk).Find(maxtal, LookIn:=xlValues).Row
Range("A" & maxrk & ":IV" & maxrk).Copy Range("A" & t & ":IV" & t)
Range("A" & maxrk & ":IV" & maxrk) = rng
End If
Next
For t = 1 To rk
If Cells(t, "B") Like "grp*" Then Cells(t, "P").Formula = x(t)
Next
Application.ScreenUpdating = True
End Sub
Avatar billede daki Juniormester
29. januar 2008 - 08:31 #6
Der kommer en besked med:
Subscript out of range

Kan det være fordi jeg har glemt at nævne, at grp først begynder ved 4. tegn.

/dan
Avatar billede excelent Ekspert
29. januar 2008 - 09:50 #7
tror det er manglende dimensionering af variable
hvis du har følgende linie i toppen af modulet så remark den
Option Explicit
ret evt. Ark1 til aktuel
Avatar billede daki Juniormester
29. januar 2008 - 11:49 #8
Selvfølgelig skal man huske at skifte arknavn :-)

Uden option Explicit, kommer der denne fejl ved ReDim x(rk): type mismatch
Med option Explicit, kommer der denne fejl ved rk = Cells: Variable not defined

/dan
Avatar billede excelent Ekspert
29. januar 2008 - 13:13 #9
ok prøv med denne

Sub SpecialSort()
Application.ScreenUpdating = False
Dim x()
dim t,rk,rng,maxtal,maxrk
Sheets("Ark1").Select
rk = Cells(1000, "B").End(xlUp).Row
ReDim x(rk)
For t = 1 To rk
If Cells(t, "B") Like "grp*" Then x(t) = Cells(t, "P").Formula: Cells(t, "P") = ""
Next
On Error Resume Next
For t = 1 To rk
If Cells(t, "B") <> "" And Cells(t, "B") <> "grp*" And Cells(t, "P") <> "" Then
rng = Range("A" & t & ":IV" & t)
maxtal = Application.WorksheetFunction.Max(Range("P" & t & ":P" & rk))
maxrk = Range("P" & t & ":P" & rk).Find(maxtal, LookIn:=xlValues).Row
Range("A" & maxrk & ":IV" & maxrk).Copy Range("A" & t & ":IV" & t)
Range("A" & maxrk & ":IV" & maxrk) = rng
End If
Next
For t = 1 To rk
If Cells(t, "B") Like "grp*" Then Cells(t, "P").Formula = x(t)
Next
Application.ScreenUpdating = True
End Sub
Avatar billede daki Juniormester
29. januar 2008 - 15:32 #10
nu går excel bare kold....

/dan
Avatar billede excelent Ekspert
29. januar 2008 - 16:35 #11
Koden virker fint i mit testark
hvis ikke du kan finde mulige problemårsager ved sammenlig
så prøv send filen til mig.
http://pmexcelent.dk/xSort.xls
Avatar billede excelent Ekspert
29. januar 2008 - 16:35 #12
du skal gemme filen lokalt ellers virker koden ikke
Avatar billede daki Juniormester
29. januar 2008 - 16:58 #13
har kopieret koden fra dit eks.
højreklik på faneark - vis program kode - 'sæt ind', ændre "Ark1" til "TEST".

excel går stadigvæk kold :-(
sender gerne til, hvilken mail!

/dan
Avatar billede excelent Ekspert
29. januar 2008 - 17:03 #14
koden skal ind i et alm modul
i arket taster du ALT+F11
vælg Module i menuen Insert
paste koden i vinduet

ellers

pm@madsen.tdcadsl.dk
Avatar billede excelent Ekspert
29. januar 2008 - 17:04 #15
husk lige slet koden i arkets kodemodul (skal kun være i et modul)
Avatar billede daki Juniormester
30. januar 2008 - 08:53 #16
Har set på arket igen, det er vist ikke så vanskeligt alligevel.

Kolonne A indeholder tal som referere til grp. dvs. 100, 180, 260 osv.
Jeg prøvede manuelt ved at markere alle linier hvor Kolonne A indeholder 100 også sortere faldende på Kolonne A og derefter Kolonne P
Resultatet er tilfredsstillende.

Men hvordan laves koden til det? (hele arket kan ikke sorteres på gang - har prøvet)

/dan
Avatar billede excelent Ekspert
30. januar 2008 - 09:14 #17
Vil det sige at der kun skal sorteres faldende inden for hver gruppe
og ikke faldende inden for hele arket ?
Som du kan se virker koden ok på mit testark, men der kan naturligvis være forhold hos dig som driller.
Du er stadig velkommen til at sende arket hvis...
men kikker først på det efter arb,tid.
Avatar billede daki Juniormester
30. januar 2008 - 09:35 #18
Ja, det er korrekt.
Test ark sendt.

Jeg venter med spænding.

/dan
Avatar billede daki Juniormester
31. januar 2008 - 11:49 #19
Har modtaget arket retur....
Fungerer perfekt.
Har ændret så det efterfølgende sortere på kolonne O og derefter B.

/dan
---------
Application.ScreenUpdating = False
Set sh = Sheets("excel")
sh.Select

rk1 = Range("A1").End(xlDown).Row
rng = Range("A" & rk1 & ":A" & Cells(65500, 1).End(xlUp).Row).Address
om:
værdi = Cells(rk1, 1)
antal = Application.WorksheetFunction.CountIf(Range(rng), værdi)
If antal > 1 Then Range("B" & rk1 + 1 & ":P" & rk1 + antal - 1).Select

Selection.Sort Key1:=Range("P" & rk1), Order1:=xlDescending, Key2:=Range("O" & rk1) _
        , Order2:=xlDescending, Key3:=Range("B" & rk1), Order3:=xlAscending, Header _
        :=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
        xlSortNormal

rk1 = rk1 + antal
If Cells(rk1, 1) <> "" Then GoTo om
Cells(1, 1).Select
Application.ScreenUpdating = True
---------
Avatar billede excelent Ekspert
31. januar 2008 - 15:37 #20
ok velbekom
Avatar billede daki Juniormester
31. januar 2008 - 20:16 #21
Tak for hjælpen.
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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