lege rij toevoegen op basis van laatst gevulde cel in een deel van een bereik??

harrybrinkman

Gebruiker
Lid geworden
7 nov 2019
Berichten
128
Besturingssysteem
Windows 11 Home & Pro, Linux Mint
Office versie
Ms Office 365, Libreoffice
Toppers,

Ik heb een werkblad met daarop een aantal secties. Per sectie worden mensen gepland. Op het moment dat er iemand bij gepland moet worden wil ik graag, na een druk op een knop een lege rij onder de laatst gevulde rij van die sectie invoegen. Dat lukt me wel voor het hele werkblad, maar niet voor een deel(sectie) daarvan. Klinkt abcadabra? zie het meegeleverde voorbeeldbestand. Hopelijk weten jullie raad!

mvrgr,
Harry
 

Bijlagen

Maak er per sectie tabellen van, wordt het al een stuk eenvoudiger.
 
Ik heb je wensen en vragen via een prompt ingevoerd in AI Claude.
Ik ben ervan overtuigd dat de VBA-specialisten deze code nog veel netter en korter kunnen schrijven, maar ik vraag me af of hij dan nog wel leesbaar blijft.

Code:
Sub VoegRegelToeAanSectie()
    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim headerRow As Long

    ' Als de macro is aangeroepen door een klik op een vorm (het "+"),
    ' gebruik dan de rij van die vorm. Anders: gebruik de actieve cel.
    On Error Resume Next
    headerRow = ws.Shapes(Application.Caller).TopLeftCell.Row
    On Error GoTo 0
    If headerRow = 0 Then headerRow = ActiveCell.Row

    ' Zoek omhoog naar de dichtstbijzijnde "Sectie"-rij
    Do While Left(ws.Cells(headerRow, 1).Value, 6) <> "Sectie" And headerRow > 1
        headerRow = headerRow - 1
    Loop

    If Left(ws.Cells(headerRow, 1).Value, 6) <> "Sectie" Then
        MsgBox "Kon geen sectie vinden boven deze positie.", vbExclamation
        Exit Sub
    End If

    Dim sectieNaam As String
    sectieNaam = ws.Cells(headerRow, 1).Value

    ' Data begint 2 rijen onder de sectiekop (na de kolomkoppenrij)
    Dim lastRow As Long
    lastRow = headerRow + 2

    ' Loop tot de eerstvolgende "Sectie"-rij of een lege rij: dat is de invoegplek
    Do While ws.Cells(lastRow, 1).Value <> "" And Left(ws.Cells(lastRow, 1).Value, 6) <> "Sectie"
        lastRow = lastRow + 1
    Loop

    ' Voeg de nieuwe (lege) rij in
    ws.Rows(lastRow).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    ws.Rows(lastRow).ClearFormats

    ' Randen van de tabel terugzetten (kolom A t/m E, pas aan indien nodig)
    With ws.Range(ws.Cells(lastRow, 1), ws.Cells(lastRow, 5)).Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
    End With

    ' Sectienaam automatisch invullen in kolom E
    ws.Cells(lastRow, 5).Value = sectieNaam
End Sub

De bovenstaande code die hieruit rolde doet het volgende (zie ook de bijlage):
  1. Bepaal vanuit welke sectie de knop is ingedrukt – de macro kijkt welk "+"-knopje is aangeklikt (of, als dat niet lukt, in welke cel je stond).
  2. Zoek de sectiekop – vanaf die positie zoekt hij omhoog naar de dichtstbijzijnde rij die begint met "Sectie" (bv. "Sectie 4").
  3. Onthoud de sectienaam – de tekst uit die sectiekop ("Sectie 4") wordt tijdelijk opgeslagen, om later in kolom E te zetten.
  4. Zoek het einde van de sectie – vanaf de sectiekop (plus de kolomkoppenrij) loopt hij naar beneden tot hij een lege rij of de volgende "Sectie"-rij tegenkomt. Dat is de plek waar de nieuwe rij moet komen.
  5. Voeg een lege rij in op die plek, en verschuif alles eronder één rij naar beneden.
  6. Maak de opmaak schoon – kleur/vet/etc. van de vorige rij wordt verwijderd, zodat de nieuwe rij niet per ongeluk oude opmaak overneemt.
  7. Zet nette dunne randen terug op de nieuwe rij (kolom A t/m E), zodat hij er verzorgd uitziet.
  8. Vul kolom E automatisch met de sectienaam die in stap 3 is onthouden (bv. "Sectie 4").
Waarom dit ook werkt bij nieuwe secties (bv. Sectie 7, 8, …):
De code zoekt nergens naar een vast sectienummer of een vaste rij — hij herkent alleen het woord "Sectie" aan het begin van een rij, en gebruikt de positie van het aangeklikte knopje om te bepalen waar hij moet beginnen zoeken. Zolang een nieuwe sectie dezelfde opbouw heeft (sectiekop → kolomkoppenrij → datarij(en)) en er een "+"-knopje naast staat (simpelweg een kopie van een bestaand knopje), werkt dezelfde macro er zonder enige aanpassing op.
 

Bijlagen

Je bedoeling is prima natuurlijk, maar vergelijk het eens met wat AHulpje en HSV maakten.
AI is lang niet altijd beter.
 
Helemaal mee eens.
Mijn bijdrage was dan ook niet bedoeld als kritiek :)
 
Ik sta altijd open voor opbouwende kritiek.
 
Terug
Bovenaan Onderaan