• 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.
Code:
Sub Btw_rij()
   With ActiveCell.EntireRow                     'huidige rij
      .Insert Shift:=xlDown                      'nieuwe rij invoegen, huiidge rij naar beneden
      .Offset(-4).Resize(, 5).Copy .Offset(-3).Resize(5, 5)
      .Cells(0, 6).Value = "1520"                'nieuw rekeningnummer
   End With
End Sub
 
Super. Dank je wel. Gelukkig heb je niet gepast :)
Werkt als een speer.

Maar nu voor mijn begrip.
Want ik lijk er toch niks van te snappen.
En functietoets F8 in de editor helpt niet door snelheid/efficiency van de regels.

Startpunt is F200.
De invoegregels begrijp ik.
En daarna staat de cursor (actieve cel) nog steeds in F200.

Dan zou ik denken dat
.Offset(-4).Resize(, 5).Copy
de regels F196:J196 selecteert om te kopiëren.
Want 4 rijen omhoog en 5 kolommen naar rechts.
Maar blijkbaar wordt toch A196:E196 gekopieerd.
Waarom is dit: ik snap dan die offset (-4) niet?

Daarna plakt
.Offset(-3).Resize(5, 5)
blijkbaar zonder paste in cellen A197:A201
Dat zonder paste klopt?
En het bereik klopt ook? Want als ik heel goed kijk bij stap voor stap lijkt er toch geplakt te worden t/m rij202? Hoezo?

En
.Cells(0, 6).Value = "1520"
zet dan 1520 in cel F200, want zelfde regel 6 kolommen verder.
Dan zou uit alles mijn conclusie zijn dat A200 de ActiveCell is, maar na het invoegen van de rij stond de cursor toch echt in F200.
Ra ra, hoe zit dit nu precies?

Na End With
Heb ik zelf nog
ActiveCell.Offset(2, 0).Range("A1").Select
toegevoegd om van F200 naar F202 te gaan.
Of kan dat misschien nog efficiënter?

Ben benieuwd naar de uitleg.
Maar in ieder geval nogmaals dank voor de code.
 
Met die ganse With ... End With-constructie moet je alles los zien van die actieve cel, hou dat in je achterhoofd.
Niet je actieve cel is de referentie, het is de ganse rij, die bovendien tussendoor nog eventjes opschuift door die insert.
Na doorloop van de macro staat je cursor vermoedelijk nog steeds in F200, ik heb het niet geprobeerd, maar aangezien de rij de referentie is, is de activecell volledig bijkomstig.
Al die select's zijn hopeloos vertragend en compleet nutteloos, maar ja, zo werkt die macro-recorder nu 1 maal.

Even meevolgen :
met Active.entirerow is er nergens sprake van een cel, wel van de ganse rij 200, ongeacht de kolom van je actieve cel, maw sta je in F200 of Z200 of ..., het maakt geen bal uit.
Na de insert schuift alles 1 rij op en gaat het onzichtbaar plots over rij 201.
Vanaf dan is de rest vrij logisch.
.Offset(-4).Resize(, 5).Copy : kopieert gezien vanaf rij 201, de 1e 5 cellen van de rij 4 hoger of 201-4 = 197, dus A197:E197
.Offset(-3).Resize(5, 5) : plakken gebeurt 3 rijen boven 201, dus rij 198 en wel 5 rijen diep en 5 kolommen breed, dus A198:E202
.Cells(0, 6).Value = "1520" : opletten met Cells vs Offset, de huidige rij is bij Cells 1, bij Offset 0.
Dus cells(0,6) is de vorige rij, de 6e kolom tov je referentie, de totale rij 201, dus F200
 
Laatst bewerkt:
Dank nogmaals.
Heldere uitleg.
Super.


Wat is de achterliggende logica om hier verder met regel 201 ipv 200 te werken?
Maakt het voor een leek als ik minder/niet begrijpelijk.
 
Raadsel

Code:
Sub M_snb()
   Sheet1.Range("A1") = "snb_1"
   Sheet1.Range("A1").AutoFill Sheet1.Range("A1:A10")
   
   MsgBox Sheet1.Rows.Count
   Sheet1.Rows(7).Insert
   MsgBox Sheet1.Rows.Count
End Sub
 
Ik weet niet wat je wil zeggen.
Maar op de 1e macroregel krijg ik al een fout: fout 424, object vereist
 
Als je zelf uit kunt zoeken waarom, heb je veel geleerd waaraan je in de toekomst veel plezier zult beleven.
 
weet dat een computer zich zelden of nooit vergist, alle problemen zitten tussen het scherm en de bureaustoel.
Ik heb het even niet getest, maar als ik jouw en mijn gedachten probeer te analyseren, dan zou onderstaande vermoedelijk beter aansluiten bij het verwachtingspatroon.
Ik heb het wel niet getest.

Bij die With ... End with ga ik met onderstaande nu uit van de activecell en niet de ganse rij, daardoor vermoed ik dat je in al de onderliggende offset's niet 4 en 3 rijen terug moet, maar de eerder logischer 3 en 2.
Nogmaals, ik heb het niet zelf geprobeerd, maar zat eerder te bekijken hoe ik het nog beter kon duiden.

Code:
Sub Btw_rij()
   With ActiveCell.Offset(, 1 - ActiveCell.Column)
      .EntireRow.Insert Shift:=xlDown            'nieuwe rij invoegen, huiidge rij naar beneden
      .Offset(-[COLOR="#FF0000"]4[/COLOR]).Resize(, 5).Copy .Offset(-[COLOR="#FF0000"]3[/COLOR]).Resize(5, 5)
      .Cells([COLOR="#FF0000"]0[/COLOR], 6).Value = "1520"                'nieuw rekeningnummer
   End With
End Sub
 
Laatst bewerkt:
Getest.
De uitkomst van deze code is dezelfde als eerder.
De offset -4 en -3 en cells 0 blijven nodig.

Dus de verwijzing naar offset -3 en -2 kan ik nu niet duiden.

En wat doet deze code precies:
Offset(, 1 - ActiveCell.Column)
 
die offset, eigenlijk had je voorop gesteld dat je altijd in een bepaalde kolom stond om die macro te starten.
Dat is vaak een gevaarlijke veronderstelling, straks gebruik je dat werkblad een maand niet en dan ben je die basisregel vergeten.
Ongeacht je huidig actieve cel, door die offset wordt je referentie de A-kolom van diezelfde rij.
Het maakt je macro wat veiliger.

nog een poging, ik denk dat we hiermee onze referentie los maken van het probleem van dat invoegen van die rij, door voor een cel uit de daar voorgaande rij te kiezen.
Code:
Sub Btw_rij()
   With ActiveCell.Offset(-1, 1 - ActiveCell.Column)  '---->A-cel van de rij boven huidige rij
      .offset(1).EntireRow.Insert Shift:=xlDown            'nieuwe rij invoegen, huiidge rij naar beneden
      .Offset(-4).Resize(, 5).Copy .Offset(-3).Resize(5, 5)
      .Cells(0, 6).Value = "1520"                'nieuw rekeningnummer
   End With
End Sub
 
Dank voor je pogingen.
Maar deze gaat helemaal niet goed.
Er komen verspringingen in de functies in kolommen A tm D en 1520 wordt 2 regels hoger neergezet.

De code uit bericht #21 werkt goed en die begrijp ik nu door je uitleg dus daar hou ik het maar bij.
Mede ook door wat je stelt dat je mogelijk niet in kolom F staat en de boel dan hierdoor niet fout zal gaan.

Nogmaals dank.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan