• 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.

macro lijkt niet consequent te werken

Status
Niet open voor verdere reacties.

HansAteB

Gebruiker
Lid geworden
16 mrt 2015
Berichten
67
Zie bestand.
In tabblad jaar kolom A (en B, C en D) zit een formule die btw moet berekenen indien van toepassing volgens een getal in kolom F.
In het bestand zit een macro (die normaal in personal.xlsb zit).
Deze simpele macro (ctrl-q) voegt een regel in en kopieert cellen in de kolommen A t/m D. en zet een vast getal in kolom F.
Hierbij worden velden al bewust ruim gekopieerd om onbedoelde verspringingen in de functies te voorkomen.
In het begin gaat dat veelal goed, maar op enig (niet eenduidig) moment gebeurt er iets raars waardoor de macro niet meer consequent lijkt te werken.
In het voorbeeldbestand gebeurt dat bij/vanaf regel 202 waardoor er wel een verspringing in de functie optreedt.
Ik begrijp niet wat de oorzaak is en weet daardoor ook niet hoe ik het probleem (in de functie of macro?) zou kunnen oplossen.

Graag jullie hulp.
Als jullie ook tav de functie in kolom A (t/m D) mogelijkheden voor verbetering zien dan zou ik daar blij mee zijn.

Ik ben benieuwd.
Dank alvast.
 

Bijlagen

  • Macrocontrole.xlsm
    118,1 KB · Weergaven: 58
Mogelijkheden tot verbetering zie ik wel. Breng structuur aan in dit kladblok wat op een spreadsheet lijkt. In mij optiek is dit een grote chaos aan gegevens waar je eigenlijk niets slims mee kan.

Deze macro heb ik gevonden maar wat het nut ervan is zie ik niet in het bijgevoegde bestand.

Code:
Sub Btw_rij()
'
' Btw_rij Macro
'
' Sneltoets: Ctrl+q
'
    ActiveCell.Rows("1:1").EntireRow.Select
    Selection.Insert Shift:=xlDown
    ActiveCell.Offset(-5, 0).Range("A1:E5").Select
    Selection.Copy
    ActiveCell.Offset(3, 0).Range("A1").Select
    ActiveSheet.Paste
    ActiveCell.Offset(2, 5).Range("A1").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "1520"
    ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Alle selects zijn overbodig. Of Activecell nu zo'n nuttige referentie is zie ik ook niet.

Maar mogelijk lezen ander helpers het anders.;)
 
Laatst bewerkt:
Dank voor je reactie. Fijn dat je meekijkt.
Maar je gaat voorbij aan m'n vraag en dat is jammer.
Laat het in jou ogen een kladblok zijn, voor de gebruiker heeft het (tijdsbesparende) waarde.

De macro is opgenomen, dus de selects zijn door Excel zelf geplaatst.
Je suggereert dus dat ze weg kunnen?
Blijft de macro dan hetzelfde doen?
 
Als je tabellen gebruikt dan gaan formules automatisch mee bij het toevoegen van nieuwe data. Ik kan mij niet voorstellen dat enige gebruiker blij wordt van deze opzet. Maar zoals al geschreven is dat mijn mening.

Code:
ActiveCell.Rows("1:1").EntireRow.Select
    Selection.Insert Shift:=xlDown

Zal zo ook wel werken
Code:
ActiveCell.EntireRow.Insert
 
Sorry hoor @VenA, maar ik denk dat niemand in dit forum op je badinerende uitspraken zit te wachten.
Minder deskundigen komen hier voor hulp en niet voor uitlatingen zoals jij die (vaker) blijkt te doen.
Je kennis van Excel is dan misschien groots, je gedrag het tegenovergestelde.

Je woorden zijn al helemaal groot als je stelt dat een opgenomen macro slecht is ("alle selects kunnen weg"), maar je daarna slechts voor een enkele regel een suggestie voor een alternatief doet.
Gedraag je dan als een kerel en laat een macro zien die naar jouw mening beter is en het zelfde doet/kan.
 
nochtans is de insteek goed.
Selects zijn zaken die door de macro-recorder meegenomen worden, zonder toegevoegde waarde en die eerder vertragend werken.
Reductie tot een derde is meestal probleemloos mogelijk.
De leesbaarheid verhoogt enorm.
Met constructies als With ... End With ga je bovendien nog een stap verder.
Hier eventjes wat tijd in investeren, levert je straks een veelvoud aan winst op.

Verder heb ik wel niet de geleverde oplossing bekeken. Vanavond.
 
het blijft een beetje gissen wat je doet, maar nu zit je zeker in de kolommen A:D
ik zie niets afwijkend in rij 202
Code:
Sub Btw_rij2()
'
' Btw_rij Macro
'
' Sneltoets: Ctrl+q
'
   With ActiveCell.EntireRow                     'huidige rij
      .Insert Shift:=xlDown                      'nieuwe rij invoegen, huiidge rij naar beneden
      .Offset(-1).Resize(, 5).Formula = .Offset(-2).Resize(, 5).Formula   'formules in 1e 5 cellen van nieuwe rij = formules van rij erboven
      .Cells(0, 6).Value = "1520"                'nieuw rekeningnummer
   End With
End Sub
 
Sorry hoor @VenA, maar ik denk dat niemand in dit forum op je badinerende uitspraken zit te wachten.
Ik geef alleen mijn mening en daar is niets vervelends mee bedoelt. Daarnaast geef ik jouw het advies om gebruik te maken van tabellen en dan heb je voor deze vraag waarschijnlijk geen VBA nodig. Rechtsklikken op/in een cel en vervolgens rij invoegen is nagenoeg net zo snel als een een toetsencombinatie indrukken. Als jij graag vasthoudt aan een bestaand concept waar iedereen blij van wordt wie ben ik dan om er kritiek op te hebben? ;)

Dat de selects overbodig zijn heb ik ter illustratie inderdaad maar voor 1 regel laten zien. Hiermee kan je toch zelf aan de gang om ook de rest te optimaliseren? Al heb je het nu al weer voorgecowd gekregen.
 
Dank @cow18.
Een veel efficiëntere macro.

Maar het is niet de juiste.

Ga maar eens in de functie van cel a202 staan en vergelijk die eens met a215.
a215 is goed. a202 is onjuist door een verspringing in de functie.
Jouw macro veroorzaakt nog weer een ander soort verspringing.

Ik ben er inmiddels achter dat de volgende code in ieder geval het gewenste resultaat geeft.
Maar in jullie ogen dus niet efficiënt.

Code:
Sub Btw_rij()
'
' Btw_rij Macro
'
' Sneltoets: Ctrl+q
'
    ActiveCell.EntireRow.Insert
    ActiveCell.Offset(-5, -5).Range("A1:E1").Select
    Selection.Copy
    ActiveCell.Offset(3, 0).Range("A1:A5").Select
    ActiveSheet.Paste
    ActiveCell.Offset(2, 5).Range("A1").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "1520"
    ActiveCell.Offset(2, 0).Range("A1").Select
End Sub
Startpunt is steeds een veld in kolom F.

Maar hoe wordt de macro dan?
 
Laatst bewerkt:
Ik geef alleen mijn mening en daar is niets vervelends mee bedoelt. Daarnaast geef ik jouw het advies om gebruik te maken van tabellen en dan heb je voor deze vraag waarschijnlijk geen VBA nodig. Rechtsklikken op/in een cel en vervolgens rij invoegen is nagenoeg net zo snel als een een toetsencombinatie indrukken. Als jij graag vasthoudt aan een bestaand concept waar iedereen blij van wordt wie ben ik dan om er kritiek op te hebben? ;)

Dat de selects overbodig zijn heb ik ter illustratie inderdaad maar voor 1 regel laten zien. Hiermee kan je toch zelf aan de gang om ook de rest te optimaliseren? Al heb je het nu al weer voorgecowd gekregen.

Zand er over.
Maar je opmerking over tabellen en rechtsklikken gaat mij al boven de pet om daar een oplossing in te zien.
Het kan in een bestand makkelijk voorkomen dat je duizend keer de macro wilt uitvoeren.
Dat met een sneltoets lijkt me toch veel fijner dan zo vaak te rechtsklikken.
 
zonder het getest te hebben lijken mij de formules niet consistent.
in A201 staat
Code:
=IF(OR($F201=1500;$F201=1510;$F201=1520;$F201=1530);G200-A200;IF($F202=1500;ROUND(G201/1,21;2);IF($F202=1510;ROUND(G201/1,09;2);IF(202[/COLOR]=1520;ROUND(G201/1,21;2)[COLOR="#FF0000"];IF($F202=1530;ROUND(G201/1,09;2);G201)[/COLOR]))))
is 1 rij verschil.
in A202 staat
Code:
=IF(OR($F202=1500;$F202=1510;$F202=1520;$F202=1530);G201-A201;IF($F204=1500;ROUND(G202/1,21;2);IF($F204=1510;ROUND(G202/1,09;2);IF($F204=1520;ROUND(G202[/COLOR]/1,21;2)[COLOR="#FF0000"];IF($F204=1530;ROUND(G202/1,09;2);G202))))[/COLOR])
Zijn 2 rijen verschil.

Staat ook op meerder plekken in de formule verkeerd.
 
Laatst bewerkt:
leg eens uit wat er moet gebeuren ?
je staat ergens in een F-cel
er wordt voor die rij een nieuwe rij ingevoegd, waardoor bestaande rij 1 zakt.
Dan kopieer je de formules uit 5 rijen hoger A:E naar 3 rij lager en 5 rijen diep A:E
en dan zet je in de 2 rij 1250.
Een soort boekhouding met 5 posten of zo ?

Moet je dan niet checken of je beneden je gegevens staat, anders overschrijf je eventueel vorige ???
 
Klopt.
De formule in A202 is onjuist. En die verspringing werd veroorzaakt (Waarom, geen idee.) door mijn oorspronkelijke macro (na verloop van gebruik).

De formule in A201 (of A215) is goed.
En die formule wordt steeds netjes verwerkt in mijn huidige macro, waarvan de code hiervoor staat.
Maar die code is dus in jullie ogen niet efficiënt. En dat begrijp ik inmiddels.
Maar ik zie geen kans om mijn eigen code te vertalen naar een slimmere.
Heb net besloten een VBA-boek aan te schaffen om me er verder in te verdiepen.
Maar voor nu hou ik me dus aanbevolen voor iets moois.
 
je staat ergens in een F-cel
Klopt. En verder …
er wordt op die rij een nieuwe rij ingevoegd, waardoor bestaande rij 1 zakt.
Dan kopieer je de formules uit 5 rijen hoger A:E naar 3 rij lager en 5 rijen diep A:E
en dan zet je in de middelste, dus 3e rij 1520.
Dat kopiëren van meerdere regels gebeurt omdat de formule verwijst naar een regel -1 en een regel +1
Als je slechts de vorige regel kopieert na het invoegen gaat het fout bij de formule op de gezakte rij.
Om dat euvel te verhelpen kopieer ik dus vanuit de ingevoegde rij bezien ook naar twee rijen erboven en twee rijen eronder, waardoor er van een onbedoelde verspringing (of overschrijving) juist geen sprake is.
Dus:
Ik sta in F10
Voeg regel in
Kopieer A5:E5
Plak op A8:A12
Ga naar F10 en zet daar 1520 in.
Ga twee cellen omlaag.
 
Code:
Sub Btw_rij2()
'
' Btw_rij Macro
'
' Sneltoets: Ctrl+q
'
   With ActiveCell.EntireRow                     'huidige rij
      .Insert Shift:=xlDown                      'nieuwe rij invoegen, huiidge rij naar beneden
      .Offset(-3).Resize(5, 5).Formula = .Offset(-6).Resize(, 5).Formula
      .Cells(0, 6).Value = "1520"                'nieuw rekeningnummer
   End With
End Sub
 
Dank.
Maar helaas werkt het niet.
Jouw code
Code:
Sub Btw_rij2()
'
' Btw_rij2 Macro
'
' Sneltoets: Ctrl+q
'
   With ActiveCell.EntireRow                     'huidige rij
      .Insert Shift:=xlDown                      'nieuwe rij invoegen, huiidge rij naar beneden
      .Offset(-3).Resize(5, 5).Formula = .Offset(-6).Resize(, 5).Formula
      .Cells(0, 6).Value = "1520"                'nieuw rekeningnummer
   End With
End Sub
zet op rij 200 de formules die horen bij rij 197 en na een aantal keer achter elkaar gaan er ook nog verspringen ontstaan.


Dit moet het zijn (iets aangepast; ik grijp voor de te kopiëren cellen nu niet meer 5 maar 3 regels terug):
Ik sta in F200
Voeg regel in, bestaande rij zakt 1
Kopieer A197:E197
Plak op A198:A202
Ga naar F200 en zet daar 1520 in.
Ga twee cellen omlaag.

Dit is mijn macro en die werkt, maar dus niet efficiënt.
Code:
Sub Opnieuw()
'
' Opnieuw Macro
'

'   Startend in kolom F
    ActiveCell.Rows("1:1").EntireRow.Select
    Selection.Insert Shift:=xlDown
    ActiveCell.Offset(-3, 0).Range("A1:E1").Select
    Selection.Copy
    ActiveCell.Offset(1, 0).Range("A1:A5").Select
    ActiveSheet.Paste
    ActiveCell.Offset(2, 5).Range("A1").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "1520"
    ActiveCell.Offset(2, 0).Range("A1").Select
End Sub

Ben benieuwd wat het dan nu zou moeten worden.

Hebben jullie overigens nog tips over NL-boeken over Excel VBA (startend vanaf basic) en eventuele websites?
Ik hou me aanbevolen.
 
Klopt. In essentie mee eens.
Maar ik ben ook wel erg benieuwd naar de efficiency-slag die gemaakt zou kunnen worden.
Dus ik daag je toch graag uit.
 
probeer deze eens
Code:
Sub Opnieuw()
'
' Opnieuw Macro
'

'   Startend in kolom F
    ActiveCell.Rows("1:1").EntireRow.Insert Shift:=xlDown
    ActiveCell.Offset(-3, 0).Range("A1:E1").Copy   ActiveCell.Offset(1, 0).Range("A1:A5")
    ActiveCell.Offset(2, 5).Range("A1").FormulaR1C1 = "1520"
End Sub
 
Dank, maar helaas.

Vanuit F200 bezien
Kopieert niet de functies uit "A197:E197" in A198:A202
Maar "F197:J197" in F201:F205
En zet 1520 in K202
En blijft in F200 ipv 2 omlaag.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan