• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

sorteren

Status
Niet open voor verdere reacties.

broek76

Gebruiker
Lid geworden
13 sep 2012
Berichten
95
Hallo,

Ik heb een bestand waarin ik verschillende kolommen wil sorteren. Op zich lukt het wel maar het zijn 66 kolommen.
Een sorteermacro maken lukt me wel maar ik ben al even aan het stoeien met for en next om hem ook de volgende kolommen te laten doen.
Als beginneling krijg ik dit niet voor elkaar.
Voor de duidelijkheid:
- namen moeten van boven naar onder in de kolom komen(zonder lege cellen er tussen)
- dag naam moet bovenaan blijven staan
- lege kolommen mogen niet weg(zit in het origineel een formule in)
- voorbeeld bestand heb ik even snel gemaakt omdat het origineel te groot is

Iemand een idee?

bvd Ron
 

Bijlagen

Heb ik gedaan en daarna nog meer dingen geprobeerd.
Ik krijg het wel werkend alleen het probleem is dat hij elke keer alle kolommen meeneemt.
Dus als hij kolom B sorteert gooit hij kolom A weer door de war.
ik heb de macro even in het bestandje gezet.
 

Bijlagen

Ik krijg het wel werkend alleen het probleem is dat hij elke keer alle kolommen meeneemt.
Is logisch; bij een gegevensbestand gaat Excel er (terecht) vanuit dat één rij één record is, en dat de gegevens dus bij elkaar horen. Je zult de macro dus om de tuin moeten leiden en duidelijk maken dat je elke rij apart wilt sorteren. Op basis van je voorbeeldje kan dat met deze macro, die 5 keer de sortering uitvoert.
Code:
Sub mcrSorteren()
Dim i As Integer, r As Integer
Dim rng As Range

With ActiveWorkbook.Worksheets(1)
    For i = 1 To 5
        Range(Columns(i), Columns(i)).Select
        r = ActiveWorkbook.Worksheets(1).Cells(Rows.Count, i).End(xlUp).Row
        Set rng = Range(Cells(1, i), Cells(r, i))
        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=rng, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange rng
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Next
End With
    Selection.End(xlDown).Select
End Sub
Zal best handiger kunnen, maar dit werkt :).
 
Laatst bewerkt:
Ik wist wel dat Excel er vanuit gaat dat de een hele rij bij elkaar hoort maar dacht dat het inderdaad wel te omzeilen was.
Dit werkt precies zoals ik het bedoelde dus daar ben ik je erg dankbaar voor maar ik heb toch nog een verzoekje.
Zou je in je code aan kunnen geven wat je precies gedaan hebt? Ik probeer namelijk een beetje VBA te leren en wil graag begrijpen hoe je code werkt.

In elk geval erg bedankt
 
Geen probleem :). Zoals sylvester-ponte al aangaf, heb je een lus nodig om elke kolom apart te sorteren. Je hebt nu 5 kolommen, dus de lust wordt nu 5 keer uitgevoerd. Ik heb eerst een macro opgenomen die één kolom sorteert, zodat de instellingen correct in de macro opgenomen worden. Zoals: alleen huidige kolom sorteren, en 1e cel bevat kolomkop. In die macro wordt eerst de kolom geselecteerd, om het aantal gevulde cellen te berekenen. Omdat de lus door verschillende kolommen loopt, moet je de kolom steeds aanpassen. Dat gebeurt met
Code:
        Range(Columns(i), Columns(i)).Select
Vervolgens wordt de variabele r gevuld met de waarde van de laatste cel waar tekst in staat. Dat gebeurt hier met de functie Row, die vanaf de laatste cel (.End) omhoog gaat naar de 1e cel waar wat in staat (xlUp):
Code:
        r = ActiveWorkbook.Worksheets(1).Cells(Rows.Count, i).End(xlUp).Row
Daarna wordt een range ingesteld; dit zijn de cellen die gesorteerd moeten worden. Dat gebeurt weer met de functie Cells om de adressen van de reeks te vinden. Cells(1, i) vindt de eerste cel van de kolom, Cells(r, i) de laatste. Omdat r dus de laatste rij bevat.
Code:
                Set rng = Range(Cells(1, i), Cells(r, i))
De rest is eigenlijk letterlijk overgenomen uit de macro, en sorteert de range. De enige aanpassing is dat de letterlijke celverwijzingen uit de macro zijn vervangen door de dynamische reeks. Dus Add Key:=Range("B1"B14") is nu: Add Key:=rng
Code:
            .SortFields.Add Key:=rng, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange rng
Hopelijk helpt dit je wat verder met het begrip.
Ik heb overigens de oorspronkelijke macro aangepast, want die ging niet verder dan 26 kolommen vanwege het alfabet. De huidige code loopt probleemloos door als je For i = 1 to 66 gebruikt.
 
Ja, heel duidelijk.
De oorspronkelijke stopt inderdaad na Z, ik had hem er al in geplakt.

Ook heb ik xlDescending gebruikt omdat hij anders met de "lege"(formule) cellen begint maar dat is ook prima.

Mijn dank is groot.

Gr Ron
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan