Vraag


  • Ruud van Dijk
  • Registratie: Februari 2021
  • Laatst online: 01-09 15:19
Mijn vraag
...
Ik heb een simpel werkblad als CSV bestand die uit het bedrijfsprogramma komt. Het betreft een prijslijst met iedere keer verschillende aantallen regels per blok, Blokken beginnen op kolom B, op regel 7. E.e.a. onder elkaar ingedeeld in groepen met 1 regel er tussen. Alles bij elkaar soms wel 10 van deze blokken gegevens a 6 kolommen breed, iedere keer verschillend in aantallen. De macro zou moeten sorteren op kolom C. Er zijn geen kolomkoppen. Het is makkelijk genoeg even een klein macrootje te maken om één blok te sorteren, maar dan laat ik de selectie sorteren met "Aangepast sorteren" op kolom C. Dit is één keer leuk maar dit komt best heel veel voor. Hoe kan ik er voor zorgen dat wanneer ik binnen 1 blok de meest linkse / bovenste cel selecteer, deze selectie uitbreid naar het blok rechts beneden, maar daarbij dus de sorteerfunctie (de ene keer dus voor 10 artikelen en het volgende blok voor 50 artikelen en dan weer 3.
Ik hoop dat ik het duidelijk uitgelegd heb.

Relevante software en hardware die ik gebruik
Excel / VBA
...

Wat ik al gevonden of geprobeerd heb
...Het is makkelijk genoeg even een klein macrootje te maken om één blok te sorteren, die heb ik wel maar daarachteraan dus steeds "Aangepast sorteren" Ik had ook een routine die sorteerde steeds eenzelfde hoeveelheid regels, dus niet werkbaar. :-(

Beste antwoord (via Ruud van Dijk op 01-03-2021 09:47)


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Dit moet het in principe doen:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit

Sub RegionSort()
    Dim curRegion As Range
    
    'selecteer het eerste blok cellen. Als het blok niet begint op A1 moet je dat natuurlijk aanpassen
    Set curRegion = ActiveSheet.Range("A1").CurrentRegion

    DO
        'bewijs dat het werkt: in het venster direct verschijnt het adres van het gevonden blok
        Debug.Print curRegion.Address
        'sorteer het blok: je mag zelf even uitvogelen hoe sort verder moet worden aangeroepen
        curRegion.Sort
        'ga vanuit de onderkant van het blok twee regels naar beneden en selecteer het volgende blok
        Set curRegion = curRegion.End(xlDown).Offset(2, 0).CurrentRegion
    'we gaan er maar even vanuit dat ieder geldig blok minimaal twee regels bevat. 
    'Is een blok maar één regel dan denkt de macro dat hij klaar is
    Loop Until curRegion.Rows.Count < 2
End Sub

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Alle reacties


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Moet ieder blok apart gesorteerd worden of moeten alle blokken samengevat worden en dan gesorteerd?

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Ruud van Dijk
  • Registratie: Februari 2021
  • Laatst online: 01-09 15:19
Nee het gaat er om dat de groepen blijven dus ieder blok zou apart gesorteerd moeten worden.

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 00:01

g0tanks

Moderator CSA
Is er toevallig een kolom waarin een soort Blok_ID staat? Dus waarmee je alle regels behorende bij één blok kunt identificeren?

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


  • JukeboxBill
  • Registratie: Juni 2003
  • Laatst online: 23:37
In LibreOffice zit een toetsenbord functie Ctrl+ * , waarbij (*) het vermenigvuldigingsteken op het numerieke toetsenblok is. Het selecteert het gegevensbereik vanaf de geselecteerde cel met uitbreiding naar een aaneengesloten blok dat gegevens bevat en begrensd wordt door lege rijen en kolommen.

Als ik het goed heb dan is dit in Excel Ctrl+Shift+Asterisk (*) en er zal vast ook wel een VBA functie voor zijn.

Soms ben ik bijna gelukkig


Acties:
  • Beste antwoord
  • +1Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Dit moet het in principe doen:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit

Sub RegionSort()
    Dim curRegion As Range
    
    'selecteer het eerste blok cellen. Als het blok niet begint op A1 moet je dat natuurlijk aanpassen
    Set curRegion = ActiveSheet.Range("A1").CurrentRegion

    DO
        'bewijs dat het werkt: in het venster direct verschijnt het adres van het gevonden blok
        Debug.Print curRegion.Address
        'sorteer het blok: je mag zelf even uitvogelen hoe sort verder moet worden aangeroepen
        curRegion.Sort
        'ga vanuit de onderkant van het blok twee regels naar beneden en selecteer het volgende blok
        Set curRegion = curRegion.End(xlDown).Offset(2, 0).CurrentRegion
    'we gaan er maar even vanuit dat ieder geldig blok minimaal twee regels bevat. 
    'Is een blok maar één regel dan denkt de macro dat hij klaar is
    Loop Until curRegion.Rows.Count < 2
End Sub

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Ruud van Dijk
  • Registratie: Februari 2021
  • Laatst online: 01-09 15:19
Het is voor mijn werk en nu zit ik thuis maar het betreft een lijst met in kolom A een groepsnaam op de zevende regel. De regels daaronder zijn leeg tot de daarop volgende groep.

  • Ruud van Dijk
  • Registratie: Februari 2021
  • Laatst online: 01-09 15:19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit

Sub RegionSort()
Dim curRegion As Range

'selecteer het eerste blok cellen. Als het blok niet begint op A1 moet je dat natuurlijk aanpassen
Set curRegion = ActiveSheet.Range("A1").CurrentRegion

DO
'bewijs dat het werkt: in het venster direct verschijnt het adres van het gevonden blok
Debug.Print curRegion.Address
'sorteer het blok: je mag zelf even uitvogelen hoe sort verder moet worden aangeroepen
curRegion.Sort
'ga vanuit de onderkant van het blok twee regels naar beneden en selecteer het volgende blok
Set curRegion = curRegion.End(xlDown).Offset(2, 0).CurrentRegion
'we gaan er maar even vanuit dat ieder geldig blok minimaal twee regels bevat.
'Is een blok maar één regel dan denkt de macro dat hij klaar is
Loop Until curRegion.Rows.Count < 2
End Sub


Bovenstaande ga ik maandag direct uittesten, lijkt er wel op. Je hoort :)

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 00:01

g0tanks

Moderator CSA
Ruud van Dijk schreef op zaterdag 27 februari 2021 @ 12:35:
het betreft een lijst met in kolom A een groepsnaam op de zevende regel. De regels daaronder zijn leeg tot de daarop volgende groep.
Dit is de eerste keer dat je over kolom A begint. Zeg je nou dat de data er zo uit ziet? Sorteren gaat er dan denk ik ook voor zorgen dat de groepsnaam niet meer onderaan elk blok komt te staan. Als je dat niet wil moet je de macro ook aanpassen dat alleen vanaf kolom B wordt gesorteerd.

Ruud van Dijk schreef op zaterdag 27 februari 2021 @ 12:40:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Geen idee wat je hiermee duidelijk wil maken.

[Voor 5% gewijzigd door g0tanks op 01-03-2021 09:35]

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


  • Patrick_6369
  • Registratie: April 2010
  • Laatst online: 20:33
Dit klinkt als een klus voor PowerQuery.
Die Excel-tool is er voor gemaakt om gegevens in een semi-gestructureerde vorm te bewerken dat het in een gewenste tabel-vorm terecht komt. Afhankelijk van hoe je data er exact uit ziet is het makkelijk of extreem moeilijk om hem goed te bewerken, maar het is wel hiervoor bedoeld.

Hier zou een handtekening kunnen staan.


  • Ruud van Dijk
  • Registratie: Februari 2021
  • Laatst online: 01-09 15:19

[Voor 27% gewijzigd door Ruud van Dijk op 01-03-2021 09:22]


  • Ruud van Dijk
  • Registratie: Februari 2021
  • Laatst online: 01-09 15:19
Dit is een afbeelding hoe e.e.a. er uit ziet. Alleen wil ik dus niet dat kolom A mee sorteert.

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 00:01

g0tanks

Moderator CSA
Als je nou was begonnen met die screenshot, dan had het een hele lap aan tekstuitleg gescheeld. ;)

De code van @Lustucru vergt dan iets meer aanpassing, bijvoorbeeld twee regels naar beneden voor het volgende blok werkt niet omdat er geen volledige witregel aanwezig is, maar is alsnog een zeer goed startpunt. Nu is het aan jou om het uit te werken.

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


  • Ruud van Dijk
  • Registratie: Februari 2021
  • Laatst online: 01-09 15:19
Ik ga er mee bezig. In ieder geval een leuke opgave er met bovenstaande uit te komen. Mensen bedankt zover.
Pagina: 1



Google Pixel 7 Sony WH-1000XM5 Apple iPhone 14 Samsung Galaxy Watch5, 44mm Sonic Frontiers Samsung Galaxy Z Fold4 Insta360 X3 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2022 Hosting door True

Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee