• 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 die plakt in een nieuw workbook

Status
Niet open voor verdere reacties.

Roy 1977

Gebruiker
Lid geworden
8 jun 2010
Berichten
158
Hallo allemaal,

ik heb een simpele macro opgenomen die in een bestaand workbook een selectie kopieert en dan in een nieuw workbook ze plakt. Hij loopt vast omdat de macro (als ik de 2e keer plak) op zoek gaat naar een workbook met een bepaalde naam, maar die naam is dus niet altijd hetzelfde.

Weet iemand hoe ik dat snel en netjes kan oplossen? Dank!

Zie: http://prntscr.com/cmvseq

Sheets("Weekdashboard").Select

Range("C4:T14").Select
Selection.Copy
Workbooks.Add
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Cells.Select
Cells.EntireColumn.AutoFit
Windows("Weekdashboard_week39.xlsm").Activate
Sheets("Subdashboard").Select
Range("C4:AA51").Select
Application.CutCopyMode = False
Selection.Copy
Windows("Map1").Activate
Range("A16").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Cells.Select
Cells.EntireColumn.AutoFit
Range("K18").Select

Sheets("Uitleg").Select
Range("B55").Select
End Sub
 
Zonder excel voorbeeld kunnen we oplossingen niet testen..
1 ding macrorecorder is leuk als startpunt, maar je loopt al snel vast bij iets complexere handelingen.
De meeste .selects of activates niet nodig in VBA. Je kunt gewoon VBA in 1x vertellen waar de data opgehaald moet worden en waar het geplaatst moet worden.

dus hier "op de gok" de ingekorte code. Doordat je niet steeds wisselt van selectie of tabblad zal alles netjes in het nieuwe workbook geplakt worden. omdat na workbook.add dat het actieve workbook wordt voor vba.

Code:
sheets("weekdashboard").range("c4:t14").copy
    workbooks.add
    selection.pastespecial paste:=xlpastevalues
    selection.pastespecial paste:=xlpasteformat
    cells.entirecolumn.autofit
    sheets("subdashboard").range("c4:aa51").copy 
    range("a16").select
    selection.pastespecial paste:=xlpastevalues
    selection.pastespecial paste:=xlpasteformats
    cells.entirecolumn.autofit

    sheets("uitleg").select
    range("b55").select
end sub[/quote]
 
Je hebt gelijk en idd schiet mijn macro kennis tekort om veel verder te gaan dan het recordertje :)

Ik heb een voorbeeld bijgevoegd. Nog 1 note: de naam van het bronbestand is niet altijd hetzelfde. In week 38 heet hij "Weekdashboard wk38" in 39 dus "Weekdashboard wk 39" etc

Zoals jij hem nu maakt loopt hij ook vast in ieder geval: http://prntscr.com/cmwdeb
 

Bijlagen

  • voorbeeld.xlsm
    17,9 KB · Weergaven: 35
Ach ja code blind aanpassen is gedoemd om te mislukken :)
er is niks mis met de macrorecorder gebruiken voor de eerste opzet.
en door nu de opgenomen code te vergelijken met een opgeschoonde code kun je een hoop leren van de werking.

het probleem van wisselende namen is voor vba vrij makkelijk te ondervangen door geen .select of .activate te gebruiken want dit zijn harde verwijzingen.
Elk werkblad heeft naast de naam die zichtbaar is ook nog een naam "onderwater" die kun je zien in de VBA editor projectverkenner daar zie je staan Blad1(weekdashboard).
als je tabnaam wijzigt kun je ook Blad1. gebruiken als verwijzing.

zoals ik al zei zodra je workbook.add gebruikt wordt de nieuwe werkmap de actieve werkmap en sheet, daardoor kun je activesheet gebruiken om het doel aan te wijzen.
terwijl je nog steeds de ranges uit de template werkmap kan aanroepen omdat VBA de ranges in de template zoekt tenzij een andere werkmap wordt opgegeven, daarom hoef je niet eerst weer jou template of specifiek tabblad actief te maken met select of activate om te kunnen kopieren. Er kan daarom veel code uit.

op basis van jou voorbeeldje probeer deze code eens.

Code:
Sub kopieer()
'
' kopieer Macro
'

' kopieer en plak het weekdashboard
    Blad1.Range("C4:T14").Copy
    Workbooks.Add     
    With ActiveSheet.Range("B3")
        .PasteSpecial Paste:=xlPasteValues
        .PasteSpecial Paste:=xlPasteFormats
    End With

'kopieer en plak het subdashboard.
    Blad2.Range("C4:AA51").Copy
    With ActiveSheet.Range("B17")
        .PasteSpecial Paste:=xlPasteValues
        .PasteSpecial Paste:=xlPasteFormats
    End With
    
    Cells.EntireColumn.AutoFit

End Sub
 
Ja dit werkt dus! Helemaal super en weer wat geleerd. Zeer bedankt!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan