Emne: Sortering af regneark ved åbning Sendt: 01.Jul.2017 kl. 11:57
Følgende VBA er glimrende til at sortere et givent regneark.
Problemet er at jeg gerne ville den kørte på alle ark og ikke kun det der hedder "Ark7". Desværre kender jeg ikke antallet af ark eller navnene på dem. Kan det lade sig gøre ?
Sub MakroSortering()
ActiveWorkbook.Worksheets("Ark7").ListObjects("Tabel7").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Ark7").ListObjects("Tabel7").Sort.SortFields.Add _ Key:=Range("Tabel7[[#All],[VisBilag]]"), SortOn:=xlSortOnValues, Order:= _ xlDescending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Ark7").ListObjects("Tabel7").Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
Derfor skal koden kun sortere på netop det regneark som er blevet oprettet.
Ja, det er jo ikke det, du skriver:
jeg gerne ville den kørte på alle ark og ikke kun det der hedder "Ark7".
Desværre kender jeg ikke antallet af ark eller navnene på dem.
Men, hvis du udskifter kode linjen...
For Each WS In ThisWorkbook.Worksheets
...med...
Set WS = ActiveSheet
...og, sletter den sidste kode linje, der hedder...
Next
...så burde makroen virke på det aktive faneblad/regneark, uanset, hvad det hedder.
Husk stadig, at fortælle, hvilke kolonner, der skal sorteres i konstanten i første kode linje. Og, stadig angive dit/dine sorteringskriterie i .Add linjen.
Husk, at trykke på [Tak], hvis du kan lide et indlæg. Husk, at trykke på [Accepteret Svar], hvis du kan bruge et løsningsforslag.
Der er flere forskellige problemstillinger i din opgave, der gør, at det kræver lidt 'fodarbejde'.
For det første benytter du fanebladets/regnearkets navn i din sortering, og da du selv nævner, at der kan være et vilkårligt antal faner/regneark, så kan vi heller ikke vide, hvad de hedder.
For det andet, så benytter du tabel navne i din sortering, og dette give samme problem som i punkt 1, men blot på tabel niveau.
Altså er vi nødt til at lave sorteringen af, hvert enkelt ark, på kolonne niveau, hvilket igen rejser en række problem stillinger.
For det første kan tabellerne være af forskellig længde (rækker), og for det andet kan der være eventuelle SUM rækker, der ikke skal medtages i sorteringen.
Kort sagt: Makroen skal lave det hele "manuelt".
Her er et forslag til, hvordan en sådan makro kunne se ud:
Sub MakroSortering()
' * ' Initialize Const Columns2Sort As String = "A:B"
On Error Resume Next
' * ' Define variables Dim LastRow As Long Dim WS As Excel.Worksheet Dim SingleColumn As Excel.Range
' * ' Sort given columns on each worksheet in the workbook For Each WS In ThisWorkbook.Worksheets LastRow = 2 For Each SingleColumn In WS.Range(Columns2Sort).Columns LastRow = WorksheetFunction.Max(LastRow, WS.Cells(WS.Rows.Count, SingleColumn.Column).End(xlUp).Row) Next
With WS.Sort With .SortFields .Clear .Add Key:=Range("A2:A" & LastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal End With .SetRange Range(Replace(Columns2Sort, ":", "1:") & LastRow) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Next
ES: ' End of Sub Set WS = Nothing Set SingleColumn = Nothing
End Sub
BEMÆRK! Du er nødt til at angive, hvilke kolonner, der skal sorteres i konstanten i første kode linje. Vær opmærksom på beregningen af 'LastRow', hvis du har eventuelle SUM rækker med, der ikke skal sorteres - træk selv det antal rækker fra, der ikke skal medtages.
Og, vigtigst: I min definition af, hvad der skal sorteres på ('.Add' kode linjen) har jeg blot sagt, at der skal sorteres på kolonne A. Dette skal du naturligvis ændre til dine egne sorteringskriterier.
Husk, at trykke på [Tak], hvis du kan lide et indlæg. Husk, at trykke på [Accepteret Svar], hvis du kan bruge et løsningsforslag.
Jeg ønsker at benytte koden i bunden af en sub, som aktiveres når der genereres et nyt ark med en specifikation af data fra en pivottabel. Derfor skal koden kun sortere på netop det regneark som er blevet oprettet.
Det betyder at jeg ved at arkets navn er "Ark" men ikke om det er "Ark1", "Ark2" osv.
Jeg kender også opbygningen af tabellens kolonner herunder navne for de enkelte kolonner da de kommer fra Pivottabellen
I den konkrete case er der ikke sammentællinger i bunden, så det er ikke nødvendigt at tage hensyn hertil.
Men det er rigtigt at antallet af rækker er ukendt.
Derfor skal koden kun sortere på netop det regneark som er blevet oprettet.
Ja, det er jo ikke det, du skriver:
jeg gerne ville den kørte på alle ark og ikke kun det der hedder "Ark7".
Desværre kender jeg ikke antallet af ark eller navnene på dem.
Men, hvis du udskifter kode linjen...
For Each WS In ThisWorkbook.Worksheets
...med...
Set WS = ActiveSheet
...og, sletter den sidste kode linje, der hedder...
Next
...så burde makroen virke på det aktive faneblad/regneark, uanset, hvad det hedder.
Husk stadig, at fortælle, hvilke kolonner, der skal sorteres i konstanten i første kode linje. Og, stadig angive dit/dine sorteringskriterie i .Add linjen.
Husk, at trykke på [Tak], hvis du kan lide et indlæg. Husk, at trykke på [Accepteret Svar], hvis du kan bruge et løsningsforslag.
Jeg tror, at din .Select linje er overflødig, da jeg ikke kan se, at du bruger Selection nogensteder, men har du behov for den, så lad den endelig blive...
Husk, at trykke på [Tak], hvis du kan lide et indlæg. Husk, at trykke på [Accepteret Svar], hvis du kan bruge et løsningsforslag.
Du kan ikke oprette nye emner i dette forum Du kan ikke besvare beskeder i dette forum Du kan ikke slette dine beskeder i dette forum Du kan ikke redigere dine beskeder i dette forum Du kan ikke oprette afstemninger i dette forum Du kan ikke stemme i dette forum