[Excel 2016] VBA stopt niet na laatste rij

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • sypie
  • Registratie: Oktober 2000
  • Niet online
In Excel ben ik bezig een "automatisch-formulier-invul-mechanisme" te bouwen voor mijzelf en collega docenten. Tot nu toe lukt dat aardig (met behulp van het grote internet en de gebruikers daarvan). Echter zou ik daarvoor niet een topic hoeven te openen.

Even de situatie schetsen: De meeste klassen hebben niet meer dan zo'n 20 studenten. Mijn Excel houdt rekening met maximaal 29 studenten, voor het geval dat. Nu heb ik in het werkblad waar ik alle informatie verzamel uit andere werkbladen de formules dusdanig aangepast dat een cel leeg blijft wanneer er geen data in de bron-cel staat. Dit heb ik gedaan met een formule die zo is opgebouwd:

code:
1
=ALS(Werkblad1!A1="";"";Werkblad1!A1)


Dit heb ik zo voor een stuk of 80 kolommen gedaan, werkt als een trein om de info uit andere tabbladen te halen.

In mijn VBA heb ik het volgende staan:
code:
1
2
3
4
With Sheets("Werkblad2")
    lonLaatsteRij = .Cells(Rows.Count, "A").End(xlUp).Row
    Set rngData = .Range(.Cells(2, 1), .Cells(lonLaatsteRij, 1))
End With


Omdat er een bericht komt na het genereren van de documenten kan ik ook zien dat er 30 documenten worden geteld (op zich vreemd want het zouden er 29 moeten zijn). Dit doe ik met:

code:
1
MsgBox "Aantal gegenereerde documenten: " & lonLaatsteRij


Mijn macro's gaan nu door tot en met rij 30, 1 rij koptekst en 29 rijen met mogelijke data. Na rij 30 zijn er geen formules meer om data uit andere werkbladen te halen. Het probleem is dat de macro niet stopt na de laatste rij met ingevulde gegevens. Ook de rijen die middels de eerste formule leeg worden gehouden worden verwerkt. Op zich is het geen ramp maar het kost zoveel tijd om bijvoorbeeld 15 extra Word documenten te openen en in te vullen.

Waar ik naar op zoek ben, als niet-programmeur, is een oplossing om er voor te zorgen dat de macro's daadwerkelijk stoppen na de laatste ingevulde rij. Iemand een idee?

Acties:
  • 0 Henk 'm!

  • breew
  • Registratie: April 2014
  • Laatst online: 22:43
Een cel zonder tekst, maar met een formule... is niet leeg :)
Je moet in je vba een check inbouwen voor cellen zonder tekstuele inhoud, bijvoorbeeld:
Visual Basic:
1
2
3
For Each c in rngData
   If c.Value = "" Then ... Else ...
Next c

[ Voor 9% gewijzigd door breew op 31-08-2018 13:02 ]


Acties:
  • 0 Henk 'm!

  • sypie
  • Registratie: Oktober 2000
  • Niet online
@Breeuw: ;Bedankt voor je antwoord. Ik begrijp de code, als in "ik weet wat er gebeurt op welke regel". Alleen heb ik geen idee wat ik achter the Then en Else in moet voeren.

Mijn logica zou zijn: Then Stop Else Continue. Alleen dat zal vast te eenvoudig zijn. Het is maar goed dat ik me door geen enkele kennis laat hinderen om hier toch mee bezig te zijn.

Is jouw antwoord te combineren met deze? Gevonden op het internet:
code:
1
2
3
4
5
6
7
8
9
10
For i=1 To 10
    Do 
        'Do everything in here and

        If I_Dont_Want_Finish_This_Loop Then
            Exit Do
        End If 

    Loop While False 'quit after one loop
Next i

Alleen snap ik niet wat de For i=1 To 10 doet.

Ik ben aan het zoeken (en proberen) geslagen. Heb wat dingen op Stackoverflow aangewezen gekregen waaronder deze pagina. Daar staan diverse antwoorden maar deze produceren nog steeds een output van 30 rijen.

Deze heb ik geprobeerd maar ziet ook de lege output in cellen aan voor data, dus gaat die ook 30 documenten genereren terwijl er minder rijen gevuld zijn met gegevens:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
With Sheets("Sheet1")
    If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
        lastrow = .Cells.Find(What:="*", _
                      After:=.Range("A1"), _
                      Lookat:=xlPart, _
                      LookIn:=xlFormulas, _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious, _
                      MatchCase:=False).Row
    Else
        lastrow = 1
    End If
End With

[ Voor 39% gewijzigd door sypie op 31-08-2018 20:10 ]


Acties:
  • 0 Henk 'm!

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
...kan ik ook zien dat er 30 documenten worden geteld (op zich vreemd want het zouden er 29 moeten zijn)
Dat is niet vreemd, want met "lonLaatsteRij" bereken je het aantal rijen dat in gebruik is in kolom A, maar dat is het aantal rijen vanaf rij 1, dus inclusief de koprij. De variabele "lonLaatsteRij" gebruik je daarna in de regel die begint met "Set rngData....", maar daarmee verandert "lonLaatsteRij" niet van waarde !
Je schrijft dat je formules doorlopen t/m rij 30. De laatste in gebruik zijnde rij (= de rij waarin de formule nog wel tekst oplevert) kun je dan bv. als volgt berekenen:

code:
1
2
3
4
5
6
7
8
Dim lonLaatsteRij As Integer, aantalrijenrngData As Integer
With Sheets("Werkblad2")
lonLaatsteRij = 30
Do Until .Cells(lonLaatsteRij, 1) <> ""
lonLaatsteRij = lonLaatsteRij - 1
Loop
Set rngdata = .Range(.Cells(2, 1), .Cells(lonLaatsteRij, 1))
End With

Aangezien je de eerste kolom met gegevens definieert als rngdata, neem ik aan dat je dat bereik voor het een en ander gebruikt. Je kunt dan best met het aantal rijen van dat bereik verder werken; dat aantal is uiteraard lonLaatsteRij - 1 . Maar je kunt dat bv. ook berekenen (nadat je hebt uitgevoerd wat hierboven staat) met: aantalrijenrngData = rngData.Rows.Count
Dit zijn heel basic-onderwerpen; neem eens wat elementaire zaken door uit de helpfile van Excel-vba !

Acties:
  • 0 Henk 'm!

  • sypie
  • Registratie: Oktober 2000
  • Niet online
dix-neuf schreef op zaterdag 1 september 2018 @ 02:55:
[...]
De laatste in gebruik zijnde rij (= de rij waarin de formule nog wel tekst oplevert) kun je dan bv. als volgt berekenen:

code:
1
Dit is wat ik nodig had. Dit is wat werkt!
dix-neuf schreef op zaterdag 1 september 2018 @ 02:55:Aangezien je de eerste kolom met gegevens definieert als rngdata, neem ik aan dat je dat bereik voor het een en ander gebruikt.
In principe wordt iedere rij gevuld met gegevens en resultaten van studenten, als er geen naam staat kunnen er ook geen resultaten worden gegeven.
dix-neuf schreef op zaterdag 1 september 2018 @ 02:55:
Dit zijn heel basic-onderwerpen; neem eens wat elementaire zaken door uit de helpfile van Excel-vba !
Ik weet dat dit voor mensen met enige kennis van VBA elementaire zaken zijn. Op zich is Excel, net als Word ook prima te doen voor mij. Toen ik begon met dit project om aan het einde van het schooljaar flink wat uren te besparen had ik een heel andere werkwijze: vanuit Word allerlei samenvoegvelden maken waardoor de documenten ook gevuld zouden worden. Eigenlijk ben ik met iets begonnen wat ik wél begreep wat is uitgedraaid op iets wat mij eigenlijk boven de pet gaat. Toch probeer ik er, samen met het internet, het beste van te maken.

Daarna kwam @breew volgens mij met het idee om Word los te laten en Excel als basis te gaan gebruiken met macro's. Ik kan veel met computers maar het bedenken van code, welke code dan ook, is niet mijn kwaliteit. Er zijn dingen die mensen kunnen en er zijn dingen die mensen zich gewoon niet eigen kunnen maken. Code schrijven is zo een ding wat ik mijzelf niet eigen kan maken. Wat ik wél kan is code kopiëren, plakken én aanpassen. Wanneer ik een stukje code zie kan ik het meeste wel begrijpen. In de macro's die ik nu heb kan ik ontdekken wat het doet op welk moment.

Op dit moment ben ik super dankbaar dat je mij een antwoord hebt gegeven mét uitleg. De code staat op de plek van de eerdere code die er stond en is getest. Hiermee kan ik verder, mijn Excel bestand staat nu in de steigers en wil ik in de loop van komende week graag helemaal klaar hebben.

Ik zal vast nog eens een vraag stellen over Excel in combinatie met VBA.

Acties:
  • +1 Henk 'm!

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Gelukkig voor jou dat je probleem opgelost is.
En dank voor je positieve feedback!
Pagina: 1