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

Doorkopiëren met macro op ander werkblad

Status
Niet open voor verdere reacties.
Rudi,
Moest even puzzelen waar ik dat nou neer moest zetten, maar heb het uiteindelijk zo gedaan:
Sub FormCopy1()
Application.ScreenUpdating = False
Sheets("Lijst").Range("e3:m3").Copy 'e bevat te copieren formules
Sheets("Lijst").Range("e4", "m" & Sheets("Lijst").UsedRange.Rows.Count).PasteSpecial Paste:=xlPasteFormulas
With Sheets("Gegevens")
.Range("A2:A" & .Cells(Rows.Count, 2).End(xlUp).Row).FillDown
.Range("G2:G" & .Cells(Rows.Count, 8).End(xlUp).Row).FillDown
End With
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

Het werkt zo prima; cellen worden precies doorgekopieerd tot laatst ingevulde cel van kolom ernaast.

Vwb het doorkopiëren tot die 10520ste regel; daar kwam ik ook telkens als ik ctrl-end indrukte. Begrijp niet waarom want er stond verder helemaal niets. Heb voor alle zekerheid toch maar alle lege regels en kolommen "verwijderd" en nu pakt-ie inderdaad gewoon de echte laatste cel die ingevuld is. Bestandje is ook meteen een stukje kleiner dus er zal toch wel ergens wat gestaan hebben. Vreemd, maar 't is opgelost.

Nu ga ik weer verder puzzelen met het in elkaar plakken van die codes zodat alles met één knop gedaan kan worden.

Vooralsnog bedankt!:thumb:
 

Bijlagen

  • Telling_template_test3.zip
    34,5 KB · Weergaven: 11
Marcel,

Volgens mij moet onderstaande code voldoende zijn om onder knop 1 te kunnen werken:
Code:
Sub TekstToValue()
    With Sheets("Lijst")
        .Range("A3:A65536").NumberFormat = "0"
        .Range("D3:D65536").NumberFormat = "0"
    End With
End Sub
 
Marcel,

Mogelijk een tweede oplossing voor knop 1:

LET OP!, vul de juiste bladnaam in en kijk even of de eerste regel 3 is.

Code:
Sub TekstToValue()
    With Sheets("Blad1")
        .Range("Z3:Z" & .Cells(Rows.Count, 1).End(xlUp).Row).FormulaLocal = "=WAARDE(A3)"
        .Range("Z3:Z" & .Cells(Rows.Count, 15).End(xlUp).Row).Copy
        .Range("A3").PasteSpecial Paste:=xlPasteValues
        .Columns("A").NumberFormat = "0"
        .Columns("Z").Delete Shift:=xlShiftToLeft
        .Range("Z3:Z" & .Cells(Rows.Count, 14).End(xlUp).Row).FormulaLocal = "=WAARDE(D3)"
        .Range("Z3:Z" & .Cells(Rows.Count, 15).End(xlUp).Row).Copy
        .Range("D3").PasteSpecial Paste:=xlPasteValues
        .Columns("D").NumberFormat = "0"
        .Columns("Z").Delete Shift:=xlShiftToLeft
    End With
End Sub
 
Marcel,

Volgens mij moet onderstaande code voldoende zijn om onder knop 1 te kunnen werken:
Code:
Sub TekstToValue()
    With Sheets("Lijst")
        .Range("A3:A65536").NumberFormat = "0"
        .Range("D3:D65536").NumberFormat = "0"
    End With
End Sub

Nee, helaas, dat krijg ik niet werkend.

gr.
Marcel
 
Probeer de tweede code dan eens.
zie #23
 
Laatst bewerkt:
ik heb het geprobeerd. In 1e instantie werden cellen d3/4/5 wel geonverteerd en A5 ook, maar A3/4 werden leeggemaakt. Kwam volgens mij doordat hier: ".Range("Z3:Z" & .Cells(Rows.Count, 1).End(xlUp).Row).FormulaLocal = "=WAARDE(A3)"" 14 moest staan ipv 1 na "Rows.Count".
Toen ik dat veranderd had werden ook de cellen A3/4/5 geconverteerd.
Maar verder dan regel 5 gaat "t niet. Ik begrijp uit je code dat je eerst in kolom Z de waardes zet van kolom A of D, dat gaat goed. Maar hoe het nou komt dat die opmaak niet verder gaat dan resp. A5 of D5 is me niet duidelijk.
 
Marcel,

14 was idd verkeerd, daar heb ik mee getest, dit moet 4 zijn (kolom D)
1 is kolom A en die staat in de eerste formule.

In beide gevallen moet de 15 omgezet worden naar 26.

Ik heb getest met kolom O en dat is 15.
De code omgezet naar kolom Z en dan moet het dus 26 worden.

Mijn fout, niet meer getest na het omzetten.

Dus:
Code:
Sub TekstToValue()
    With Sheets("Blad1")
        .Range("Z3:Z" & .Cells(Rows.Count, 1).End(xlUp).Row).FormulaLocal = "=WAARDE(A3)"
        .Range("Z3:Z" & .Cells(Rows.Count, 26).End(xlUp).Row).Copy
        .Range("A3").PasteSpecial Paste:=xlPasteValues
        .Columns("A").NumberFormat = "0"
        .Columns("Z").Delete Shift:=xlShiftToLeft
        .Range("Z3:Z" & .Cells(Rows.Count, 4).End(xlUp).Row).FormulaLocal = "=WAARDE(D3)"
        .Range("Z3:Z" & .Cells(Rows.Count, 26).End(xlUp).Row).Copy
        .Range("D3").PasteSpecial Paste:=xlPasteValues
        .Columns("D").NumberFormat = "0"
        .Columns("Z").Delete Shift:=xlShiftToLeft
    End With
End Sub
 
Laatst bewerkt:
"Superzeeuw" en Rudi,

Nog paar uurtjes gepuzzeld en 't is allemaal gelukt volgens mij; met één druk op de knop wordt alles nu geregeld en 't is nog veel sneller ook. Mocht je nog het eindresultaat willen zien; zie bijlage.

Ontzettend bedankt voor je hulp (en geduld)! :thumb::thumb:
 

Bijlagen

  • Telling_template_test6.zip
    97,3 KB · Weergaven: 12
Marcel,

Dat ziet er al veel beter uit.

Maar.....
Als je het bestand schoon van fouten wilt houden waarom laat je de macro dan ook niet de kopie slag maken van de drie bestanden die aangemaakt worden door de gebruikers?
Punten 2, 4 en 6
Wellicht is de export naar Excel ook nog te regelen wie weet?
Punten 1, 3 en 5

Het zijn maar ideeën.
 
Nogmaals bedankt voor 't meedenken, maar ik sla het op als een "alleen-lezen"-bestand dus 't origineel blijft wel bewaard.
't Is bedoeld om voorraadcontrolebestanden te maken voor winkels dus dat moeten dan toch telkens andere bestanden zijn die voor eenmalig gebruik zijn. Kwestie van invullen en naar winkels versturen. 't Zijn dus niet bestanden die continue in gebruik blijven.

V.w.b. het automatisch exporteren vanuit SAP naar dit bestand; zal misschien best mogelijk zijn, maar je wilt niet weten hoe lastig SAP in gebruik is met dat soort dingen.

Ik ben al hartstikke blij dat ik (met jouw hulp) al zover gekomen ben!:)
 
Test deze eens als je wilt
 

Bijlagen

  • Telling_template_test6.zip
    88,4 KB · Weergaven: 26
Rudy,

Lijkt ook prima te werken. Knap hoor. 't Oogt vooral wat rustiger als ik op de knop klik dan in mijn laatste versie. Wat heb je daar nou voor aangepast?:thumb:

gr.
Marcel
 
Alle formule, kopie en plakbewerkingen vervangen door de bewerkingen uit te voeren in matrixen en in 1 bewerking weg te schrijven naar het werkblad.
Alle Select en Selection vervangen door With ... End With lussen
Screen updating afzetten bovenaan je code (moet je nog terug aanzetten want dat ben ik vergeten in de code)
 
Rudi, dit is voor mij toch nog veel te hoog gegrepen; ik heb geen idee wat dat allemaal inhoudt.:eek: Hoe dan ook; ik heb er wel veel bewondering voor!
Waarom is het noodzakelijk screenupdating aan te hebben? Lijkt zo toch ook prima te gaan en ziet er rustiger uit.

gr.
Marcel
 
De regel is dat wat je afzet in je code moet je ook terug aanzetten, zij het nu schermwisselingen, berekenen, foutmeldingen want dit heeft gevolgen voor het verdere gebruik van je bestand.
 
Marcel,

Wat Rudi bedoelt is zet als laatste regel in je code de volgende regel:
Code:
Application.Screenupdating = True

Hiermee zorg je ervoor dat het scherm ook ververst als je gegevens ingeeft, muteert of berekent anders gebeurd dat niet.
 
Bedankt voor je reactie. In principe lijkt 't nu prima te werken maar heb ik nog één vraagje; ik denk niet dat er iets aan te doen is maar jullie kunnen nogal eens creatief zijn.

Ik heb 't eens geprobeerd met een praktijkgeval van een hoop artikelen. Dan heb je 't over ruim 1000 artikelen op het 1e tabblad en waarvan dan op 2e tabblad 16000 regels gegevens in kolommen B-E staan en ruim 65000 regels gegevens in de kolommen H-K.

In de macro heb ik opgenomen dat automatisch berekenen aan het begin uit gaat en aan het eind van al die bewerkingen weer aan. Dat scheelt een klein beetje tijd.

Toch lopen zowel de maker van het bestand als de eindgebruiker dan tegen het feit aan dat ze 2x moeten wachten op het berekenen:

Zoals het nu is drukt degene die het bestand maakt met die hoeveelheid gegevens op de knop en zit dan 2,5 minuut te wachten tot-ie klaar is, en als het klaar is dan moet ik 'm nog opslaan en zit ik weer 1,5 minuut te wachten op het berekenen. Het weer aanzetten van berekenen in de macro weglaten is volgens mij geen optie (dan zou berekenen namelijk alleen maar plaatsvinden bij opslaan) aangezien dat dan voor de eindgebruiker ook nog uit staat en dat mag niet.

Vervolgens heb je als eindgebruiker het volgende; je vult in het blauwe vakje je vestigingsnummer in en drukt op Enter, dan gaat-ie 1,5 minuten berekenen. Vervolgens moet je in kolom E filteren op -niet-lege-cellen- en dan gaat-ie wéér 1,5 minuten rekenen.

't Is wel werkbaar maar een beetje irritant dus.
Nog creatieve ideeën in dit kader?

gr.
Marcel
 

Bijlagen

  • Telling_template_test8_2.zip
    88,1 KB · Weergaven: 8
Marcel,

Het scheelt al om het volgende toe te passen:
Code:
With Application
    .Calculation = xlAutomatic
    .MaxChange = 0.001
End With
Application.ScreenUpdating = True

Application.screenupdating echt als laatste regel.

WAAROM gebruik jij .Maxchange = 0.001 ????????????
 
Ik heb het omgedraaid zoals je aangaf waardoor screenupdating helemaal aan het eind staat. Scheelde zo'n 40 seconden in de verwerking van "de knop". die hebben we alvast weer verdiend.

V.w.b. je vraag " WAAROM gebruik jij .Maxchange = 0.001 ???????????? "..........:eek:........geen idee; zoals gezegd; ik ben nog maar een beginneling (al moet ik zeggen dat ik wel veel geleerd heb de afgelopen dagen); als ik niet weet hoe ik iets moet schrijven dan neem ik gewoon een macro op en plak die ertussen. Als je dat doet voor het aan- of uitschekelen van berekenen dan staat dat er dus ook tussen. Is dat fout? Wat doet dat dan?

gr.
Marcel
 

Bijlagen

  • Telling_template_test8_2.zip
    88,1 KB · Weergaven: 20
Marcel,

Ik heb het opgezocht en het heeft te maken met iteraties, verschillen tussen waarden die niet groter mogen zijn in jouw geval dan 0.001.
Komt bij jou nooit voor dus haal vooraan en achter die regel even weg.

Dat kan ook met een apostrof
.MaxRange = 0.001
Uitschakelen doe je dan zo
'.MaxRange = 0.001 (let op het eerste karakter)

In het onderste geval staat de regel er nog maar wordt door VBA als commentaar gezien en doet dus niet meer mee in de code afhandeling.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan