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

ThisWorkbook vs Module

Status
Niet open voor verdere reacties.

Ralf1991

Gebruiker
Lid geworden
10 okt 2014
Berichten
61
Beste helper,

Ik heb een code gemaakt die prima werkt wanneer ik dit plaats in een Module. Echter wanneer ik de code plaats in ThisWorkbook als een BeforeSave event loopt de code vast bij het activeren van een ander Excel bestand die reeds is geopend. Onderstaand in geel gemarkeerd waar de code vast loopt.

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)


Application.ScreenUpdating = False

Sheets("Traffic_File_ASW").Visible = True

    Workbooks.Open Filename:= _
        "X:\Applications\Upload_Templates\Traffic_File_ASW.xlt", Editable:=True
    
    Windows("Traffic file V2.xlsm").Activate
    Sheets("New opzet traffic file").Select
    Range("D1").Select
    ActiveSheet.Range("$A$1:$Z$3000").AutoFilter Field:=4, Criteria1:=">=" & Format(Worksheets("Traffic_File_ASW").Range("A1").Value, "mm/dd/yyyy"), Operator:=xlAnd
    ActiveSheet.Range("$A$1:$Z$3000").AutoFilter Field:=25, Criteria1:="<>"
    Range("D1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Traffic_File_ASW").Select
    Range("B1").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("C2").Select
    ActiveCell.FormulaR1C1 = _
        "=CONCATENATE(TEXT(RC[-1],""jjj""),TEXT(RC[-1],""mm""),TEXT(RC[-1],""dd""))"
    Range("F1").Select
    ActiveCell.FormulaR1C1 = "=COUNT(C[-4])"
    Range("C2").AutoFill Range("C2").Resize(Range("F1"))
    
    Sheets("New opzet traffic file").Select
    Range("Y1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    [COLOR="#FFFF00"]Windows("Traffic_File_ASW.xlt").Activate[/COLOR]
    Range("A2").Select
    ActiveSheet.Paste

    Windows("Traffic file V2.xlsm").Activate
    Sheets("Traffic_File_ASW").Select
    Range("C2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Windows("Traffic_File_ASW.xlt").Activate
    Range("U3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Rows("2:2").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    
    Windows("Traffic file V2.xlsm").Activate
    Sheets("Traffic_File_ASW").Select
    
    Columns("B:C").Select
    Selection.Delete Shift:=xlToLeft
    Range("D1").Select
    Selection.ClearContents
    Sheets("New opzet traffic file").Select

    ActiveSheet.Range("$A$1:$Z$1619").AutoFilter Field:=4
    ActiveSheet.Range("$A$1:$Z$1619").AutoFilter Field:=25
    Range("A27").Select
    Selection.End(xlDown).Select
    
     Sheets("Traffic_File_ASW").Visible = False
     
     Windows("Traffic_File_ASW.xlt").Activate
     Application.Run "Traffic_File_ASW.xlt!Sheet1.CommandButton1_Click"
     
Application.ScreenUpdating = True
    


End Sub


Bedankt!
 
Toch zou ik

- eerst eens beginnen de code op te schonen: verwijder alle 'selects' en 'activates' en 'copy-opdrachten'
- kijk ook of die R1C1 formule nodig heb: die waarde kun je met VBA ook direkt in een cel zetten.
- het activeren van een macro met de opdracht 'run' maakt de situatie niet echt stabieler: probeer dat te vermijden
- waarom zou je hiervoor geen opdrachtknop maken in plaats van de beforesave-gebeurtenis ?
 
Hoi snb,

Bedankt voor je tips.

De rede dat ik geen opdrachtknop heb gemaakt is omdat ik na elke save wil dat de macro wordt uitgevoerd zodat de wijzigingen direct worden geupload naar ons systeem.

Maar dit schijnt niet te werken terwijl het wel werkt als ik de macro in een Module stop. Hoe kan dit?
 
Het maakt voor de gebruiker niet uit of hij/zij op een 'save' icoon/opdracht moet klikken of op een knop die hetzelfde bewerkstelligt.
Breek je hoofd niet over de ontwerpgedachten achter Excel maar gebruik het voor je doel.,
 
Ik doe dit omdat de gebruiker het niet kan "vergeten" om de informatie naar ons systeem te uploaden.

Maar wat is nu de rede waarom de code wel werkt in een module en niet in bovenstaand voorbeeld waarbij de code in ThisWorkbook staat?
 
De reden is het voortdurend selecteren en activeren zodat hij de focus verliest van het bestand waar je eigenlijk mee bezig bent.
Je kan perfect de code achter een button hangen en er een sleutel inbouwen die je gebruikt in het Before_Save event.
Die checkt of de button is gedrukt zoniet krijg je een waarschuwing.
 
Los van de suggestie uit post#4, maar als antwoord op jouw vraag uit post#5: (volgens mij) het is een timings-kwestie, plaats de opgeschoonde code in een module en roep deze (eventueel) aan in het BeforeSave-event
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan