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.
 
  • Leuk
Waarderingen: snb
Helemaal mee eens.
Mijn bijdrage was dan ook niet bedoeld als kritiek :)
 
Ik sta altijd open voor opbouwende kritiek.
 
@peter59
Dit kreeg ik als commentaar bij gebruik van AI, dus meteen mee gestopt.
Voor eigen gebruik is het prima en kunnen de specialisten het meestal vereenvoudigen en inkorten.
Code:
@jverkerk, op diverse buitenlandse fora wordt je verbannen als je AI codes gebruikt om te helpen (hier nog niet); en dat komt omdat de codes van AI helaas bagger zijn.
 
Van wie heb je dat gekregen? Van dit forum?
 
@peter: een forum is niet voor oplossingen, maar voor suggesties hoe deelnemers zich kunnen bekwamen, zodat zij zelfredzamer worden. 'Doet wat gevraagd wordt' is vanuit kwalitatief standpunt bekeken onvoldoende. Je kunt vanuit Groningen naar Amsterdam via Maastricht, maar het is niet de 'beste' route.
 
Van wie heb je dat gekregen? Van dit forum?
Van mij @peter59, en ik zet hier geen onzin neer.
Bericht automatisch samengevoegd:

@snb en @jverkerk , jullie moeten de naam van de persoon die je wil aanduiden wel helemaal uitschrijven.
Zo krijgt de verkeerde persoon er bericht van.
 
@HSV
Dat werd me net duidelijk dankzij @jverkerk.

Ik vind de stelling dat AI-code "bagger" is te kort door de bocht.
AI maakt fouten, net als mensen. Met een goede prompt en een kritische beoordeling levert het vaak juist uitstekende code of formules op.
Als AI structureel waardeloze resultaten zou geven, zouden zoveel ontwikkelaars en bedrijven het niet dagelijks gebruiken.
AI is een hulpmiddel. De kwaliteit hangt uiteindelijk af van degene die het gebruikt en controleert.

@snb
Je kunt vanuit Groningen naar Amsterdam via Maastricht, maar het is niet de 'beste' route.
Tegenwoordig heeft bijna iedereen een navigatiesysteem.
Het leert je niet autorijden, maar het helpt je wel om sneller op je bestemming te komen. En dat gaat ook nog wel eens mis.
Met AI zie ik dat eigenlijk net zo. ;)
https://nos.nl/artikel/2625288-nederlander-volgt-navigatie-en-rijdt-van-hoge-trap-in-blankenberge
 
Laatst bewerkt:
Terug
Bovenaan Onderaan