Toon posts:

[Excel] Macro automatisch starten

Pagina: 1
Acties:

Onderwerpen


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Uit één van de genoemde reacties heb ik het voorbeeld genomen om de macro automatisch te starten en dat op een nieuw leeg Excel blad met op $A$1 de cel waar ik handmatig een nummer in verander.

Private Sub Worksheet_Change(ByVal Target As Range)
If ActiveCell.Address = "$A$1" Then
StartMacro Week
End If
End Sub

Opdracht ook geprobeerd met Call Week met hetzelfde onderstaande resultaat

Als ik nu in cel A1 het nummer verander geeft het deze melding Sub of Function is niet gedefinieerd.

Verder heb ik in cel A5 een tekst staan en ook in cel C5.
Als bovenstaande code zou werken zou de macro Week moeten starten met als gevolg dat cel C5 gekopieerd wordt en geplakt wordt in cel A5 en dan cel C5 leeg gemaakt wordt en de sessie eindigt met dat de cursor weer in cel A5 staat.


Sub Week()
'
' Week Macro
'
' Sneltoets: Ctrl+k
'

Range("C5").Select
Selection.Copy
Range("A5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C5").Select
Application.CutCopyMode = False
Selection.ClearContents
Range("A5").Select

End Sub


Handmatig doet de macro precies wat de opdracht is en dat is het probleem niet, maar de automatisch start wel

Op mijn indeling staat het volgende en waarschijnlijk niet goed maar hoop dat te horen

VBA Project (Test weekwissel.xlsm
Microsoft Excel objecten
Blad1 (weekwissel) ---------------------------------------------------------- Hier staat Private Sub Programma
This Workbook --------------------Algemeen ------------------------------Hier staat macro Week

Modules

Module 1 ----------------------- leeg
Module 2 ---------------------- leeg
Module 3 ---------------------- leeg
Module 4 ----------------------- leeg

Kan ik het probleem oplossen door de macro te verplaatsen of is er meer aan de hand.?

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 30-01 17:22

g0tanks

Moderator CSA
@wopmill ik heb je reactie in [excel] Macro starten mbv een formule. verplaatst naar een nieuw topic. We hebben liever dat je voor een nieuw probleem dan wel net wat andere situatie een nieuw en eigen topic opent. ;)

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Het is bedoeld om voor mijn eerste probleem de oplossing te vinden, maar hopelijk kom ik er zo ook , zal dit meenemen als ik weer wat vragen heb,, dank je wel

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Een weeknummer verandert slechts 1 x per week. Bij openen van je Excelfile kun je laten controleren of het weeknummer (bv. in A1) gelijk is aan het weeknummer van die dag (de dag bij openen). Is het gelijk, dan moet het weeknummer niet wijzigen en de macro niet worden uitgevoerd. Is het weeknummer niet het nummer dat bij de dag van openen hoort, dan laat je de openingsmacro het weeknummer met 1 verhogen en laat je de macro wel uitvoeren. Die macro hoef je overigens niet afzonderlijk in een module te plaatsen, die is zo kort dat die samen met controle van het weeknummer in het blad behorend bij ThisWorkbook kan worden geplaatst.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Dit lijkt goed en zal kijken of ik dit voor elkaar krijg, ik moet iets bedenken dat ik iets start wanneer het weeknummer is verandert, probleem is wanneer ik iets werkelijk in een cel type dat ik dan een macro kan starten die kopieert en plakt, maar zo gauw als die cel gevuld wordt met de uitkomst van een formule komt er geen reactie, maar ga eens proberen of het kan zoals jij aangeeft

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Met je gegevens van hierboven kan het bv. met de macro hieronder. De code kijkt bij openen van het bestand of het weeknummer in A1 gelijk is aan het huidige weeknummer ( 8 ). Indien niet gelijk, wordt in A1 het huidige weeknummer geplaatst en wordt ook de rest van de macro uitgevoerd. Indien wel gelijk, gebeurt er niets. Als datum (om het weeknummer te bepalen) wordt de systeemdatum van de computer gehanteerd.
code:
1
2
3
4
5
6
7
8
9
10
11
Private Sub Workbook_Open()
Dim w As Long
With Sheets("Blad1")
w = WorksheetFunction.WeekNum(Date)
If .Range("A1").Value <> w Then
.Range("A1").Value = w
.Range("A5").Value = .Range("C5").Value
.Range("C5").ClearContents
End If
End With
End Sub

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

dix-neuf schreef op zaterdag 19 februari 2022 @ 13:45:
code:
1
2
3
4
Private Sub Workbook_Open()
Dim w As Long
With Sheets("Blad1")
w = WorksheetFunction.WeekNum(Date)
Nog een speciale reden om een worksheetfunctie te gebruiken ipv het ingebouwde VBA statement datepart?
code:
1
 w= datepart("ww";date)


tamelijk onhandig dat er nu twee topics over hetzelfde onderwerp lopen

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Lustucru schreef op zaterdag 19 februari 2022 @ 14:35:
Nog een speciale reden om een worksheetfunctie te gebruiken ipv het ingebouwde VBA statement datepart?
Nee hoor, het was gewoon het eerste waar ik aan dacht.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik ga er mee bezig om het in het verhaal te maken wat ik zelf al klaar had en ik ben ontzettend blij met deze hulp en laat het weten of het allemaal lukt, maar heb wel even tijd nodig, dus even geduld.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik heb het programma geïnstalleerd, eerst maar in een proef opzetje en het werkt perfect, maar het weeknummer wat aangegeven wordt is negen, terwijl de komende week week 8 is.

Het mooiste was wanneer de week op maandag begint, want ik denk dat dat nu zondag is en dat we in de goede week terecht komen.

Is hier nog een oplossing voor?

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik heb inmiddels de volgende verandering gemaakt en dat lijkt goed en anders graag een andere oplossing.
w = WorksheetFunction.WeekNum(Date) verandert in w = WorksheetFunction.isoWeekNum(Date)

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

wopmill schreef op zondag 20 februari 2022 @ 14:16:
Ik heb inmiddels de volgende verandering gemaakt en dat lijkt goed en anders graag een andere oplossing.
w = WorksheetFunction.WeekNum(Date) verandert in w = WorksheetFunction.isoWeekNum(Date)
Dat werkt, mijn voorkeur zou zijn
code:
1
w=datepart("ww",date,vbMonday)


Niet dat je het verschil zult merken, maar het scheelt weer een aanroep naar application.worksheetfunction. :)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Lustucru schreef op zondag 20 februari 2022 @ 19:57:
mijn voorkeur zou zijn
code:
1
w=datepart("ww",date,vbMonday)
Dat is - denk ik - niet volledig, want om aan de ISO-norm m.b.t. weeknummer te voldoen is niet alleen vereist dat de maandag als eerste dag van de week wordt beschouwd, maar ook dat de eerste week van het jaar minstens 4 dagen van het nieuwe jaar moet bevatten. Beter lijkt mij daarom:
code:
1
2
3
=Datepart("ww",Date,vbMonday,vbFirstFourDays)
of (iets korter):
=Datepart("ww",Date,2,2)

en ook dat is nog niet 100% juist, want daarmee kan het 1 x per 400 jaar fout gaan.
Om dat te verhelpen is de formule wel uit te breiden, maar ik laat het hier bij.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik heb de macro laten draaien met wat proefprogrammaatjes en dat gaat helemaal goed, heb ik nog drie dingen en dat is,

ik heb twee tabbladen en ik zal ("Blad1") moeten aanpassen en denk dat op onderstaande manier goed te doen, maar moeten de namen met een underscore verbonden zijn Planlijst_deze_week of is dat niet nodig en een punt komma tussen de twee namen van de tabbladen is de goede manier , zie hieronder ?


Moet ik
Private Sub Workbook_Open()
Dim w As Long
With Sheets("Blad1") Kan ik dit zo aanpassen With Sheets( " Planlijst deze week; Planlijst volgende week").
w = DatePart("ww", Date, 2, 2)
If .Range("J3").Value <> w Then
.Range("J3").Value = w
.Range("Planlijst deze week;G5:P52").Value = .Range("Planlijst volgende week;G5:P52").Value
.Range("Planlijst volgende week;G5:P12;G15:P22;G25:P32;G35:P42;G45:P52").ClearContents
End If
End With
End Sub

Dan staat er tussen elke dag een beveiligde rij waardoor ik niet het hele blad in één keer kan kopiëren en kan ik dit oplossen door in de macro aan te geven dat de beveiliging even uit moet en na het kopiëren weer aan met Selection.Locked = False/True en zet ik dit boven en onder de twee onderste Range regels.

Hetzelfde is met de opmerking die ik krijg als ik handmatig de boel kopieer, dat er al gegevens in het te plakken gebied staan en of die overschreven kunnen worden en kan dit uitgezet worden met
Application.DisplayAlerts = False/True en kan dit samen met de beveiliging?


Zo,nregel staat tussen elke dag en is beveiligd, ik kan de boel zo plakken in deze week en die past vanuit de kopregel de datum weer aan en dat is dus geen probleem

Transport woensdag 23 februari 2022 Naam Tijd

Het zo mooi zijn als jullie dit laatste stukje nog willen bekijken en daar antwoord op willen geven dan is het prachtig opgelost.

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Of je code wel of niet goed is, kun je altijd meteen zien door je macro uit te voeren. Een coderegel die niet juist is, wordt doorgaans geel gemarkeerd.
De naam van een werkblad schrijf je als: Sheets("Naam van het blad") of Worksheets("Naam van het blad"), een bereik als (bv.): Range("A1:C10"). Samen schrijf je ze als (bv.):
Sheets("Naam van het blad").Range("A1:C10"). Let op de (plaats van) de aanhalingstekens.
Het lijstscheidingsteken in vba is een komma, geen puntkomma.
'With Sheets("Blad1") Kan ik dit zo aanpassen With Sheets( " Planlijst deze week; Planlijst volgende week").
Nee! Geen spaties en zie verder mijn tekst hierboven.
Wil je in twee bladen dezelfde bewerkingen uitvoeren? Indien ja, gebruik dan bv. een for-nextlus.

De beveiliging van een blad opheffen en weer instellen kan met de opdrachten Protect en Unprotect, zie de vba-helpfile. Wat bepaalde opdrachten doen (zoals bv. 'DisplayAlerts'), daarop geeft de helpfile je meteen het antwoord.

In een bericht hierboven gaf je aan dat je 1 celwaarde gelijk wilde maken aan een andere en daarop gaf ik als antwoord: .Range("A5").Value = .Range("C5").Value . Wil je een groot bereik kopiëren (of verplaatsen), dan kun je beter copy (of cut) gebruiken.
Zo,nregel staat tussen elke dag en is beveiligd, ik kan de boel zo plakken in deze week en die past vanuit de kopregel de datum weer aan en dat is dus geen probleem
Transport woensdag 23 februari 2022 Naam Tijd
Daar begrijp ik niets van.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Laten het laatste even rusten en ga ik eerst proberen de genoemde tips die je geeft uit te voeren en zien of dat lukt en ik kan je niet genoeg bedanken voor je hulp dus bij deze maar weer bedankt.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik had het idee dat het laatste stukje geen probleem zou zijn, maar de werkelijkheid is anders, ik heb twee pagina's 1 x (Blad1) en 1 x (Blad2)

Blad1 is de lopende week en blad 2 is de komende week
Wanneer de macro de week opschuift is de bedoeling dat de inhoud ook mee gaat.
Blad2 kopiëren en plakken in Blad1 en Blad2 leeg maken

Ik dacht het zo goed te doen, maar krijg de volgen situatie:

Private Sub Workbook_Open()
Dim w As Long
With Sheets("Blad1", "Blad2")

En zegt daarvan terwijl de eerste regel geel wordt Sub of Funcfion niet gedefinieerd.

Over het kopiëren van de inhoud zou misschien ook goed gaan met knippen van de inhoud van Blad2 naar Blad1 en daar weer plakken en dat zijn allemaal onbeveiligde cellen en heb ik niets te doen met de beveiliging opheffen en weer aanzetten, ga ik bekijken.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik heb geprobeerd om de pagina te knippen en plakken, maar het probleem is dat de pagina's zijn vijf kopregels die beveiligd zijn met daaronder acht regels om tekst in te plakken die ik dan over wil zetten en dat wil alleen als ik dit per blok doe (die acht regels), het kan niet om de blokken in één keer te selecteren omdat de beveiligde kopregels er tussen staan die beveiligd zijn.

Het was mooi als ik het bestand hier kon plakken dat maakt alles veel duidelijker, maar ik weet niet hoe ik dat moet doen, dus als je me dat kan aangeven kan ik dat doen.

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Zoals ik in mijn vorig bericht al schreef, gaat dat niet op die manier.
Als je op twee werkbladen dezelfde code wil uitvoeren, dan kan dat (bijvoorbeeld) met een for-nextlus.
Maar waarom je op 2 bladen dezelfde code uit zou willen voeren, is me niet duidelijk.

[Voor 12% gewijzigd door dix-neuf op 22-02-2022 12:23]


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik heb even moeite om duidelijk te krijgen wat ik wil en probeer het even zo.

Blad1 is van maandag tot vrijdag in gebruik als deze week en blad2 zal in de loop van de week steeds meer ingevuld worden als de volgende week.

Wanneer de macro het weekcijfer verhoogt ( dus bv van week 8 naar week 9 gaat ) dan is de bedoeling dat de inhoud van deze week verdwijnt (Blad1) en dat daar de ingevulde inhoud van (Blad2) komt te staan.

deze week volgende week
Blad1 Blad2
Blad2 is nu Blad1 Blad2 is weer leeg en kan in de loop van de week weer ingevuld worden
Blad2 is nu Blad1 Blad2 is weer leeg en kan in de loop van de week weer ingevuld worden

Dus ik denk de inhoud van Blad2 kopiëren, plakken in Blad1 en Blad2 leeg maken en dat gebeurd elke keer als de macro een nieuwe week signaleert.

Ik hoop echt dat het zo wat duidelijker heb gemaakt en laat het anders maar weer weten.

  • heuveltje
  • Registratie: Februari 2000
  • Laatst online: 01:03

heuveltje

KoelkastFilosoof

kleine Hint
In plaats van met blad 1 en 2 te rommelen, laat die hernoemen naar Week9 Week10 etc... dat houd het veel overzichtelijker wat wat is.
sheets("blad1").name = weeknr

Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel Pentium 233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600


  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Je zou ook met ingang van een nieuwe week Blad1 kunnen verwijderen.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

heuveltje schreef op dinsdag 22 februari 2022 @ 13:36:
kleine Hint
In plaats van met blad 1 en 2 te rommelen, laat die hernoemen naar Week9 Week10 etc... dat houd het veel overzichtelijker wat wat is.
sheets("blad1").name = weeknr
dix-neuf schreef op dinsdag 22 februari 2022 @ 14:18:
Je zou ook met ingang van een nieuwe week Blad1 kunnen verwijderen.
Imho goede suggesties. Je kunt het nog mooier maken door in het begin van het jaar 53 bladen klaar te zetten en dan iedere week twee (of meer) bladen zichtbaar te maken en de rest te verbergen. Heb je ook meteen je hele jaararchief klaar. :)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik vind het hele mooie suggesties en het zou heel mooi kunnen werken door het blad te benoemen met het weeknummer (bv week8) en dan als die voorbij is week9 klaar staat en zo elke keer het actuele blad met het volgende blad te bewerken zijn, dus week9 is actueel met week10 als volgende.

Maar nu wordt het voor mij weer heel moeilijk want in wat voor richting moet ik dan denken en wil er best veel werk voor doen om dat uit te zoeken, maar waar moet ik aan denken voor deze oplossing.

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
wopmill schreef op dinsdag 22 februari 2022 @ 17:45: maar waar moet ik aan denken voor deze oplossing.
Zoiets als dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Workbook_Open()
Dim w As Long
w = DatePart("ww", Date, 2, 2)
If Sheets(1).Range("A1").Value <> w Then
With Sheets(2)
.Name = "Week " & w
.Range("A1").Value = w
End With
With Application
.DisplayAlerts = False
Sheets(1).Delete
Sheets.Add After:=Sheets(1)
.Goto Sheets(1).Range("A1")
.DisplayAlerts = True
End With
End If
End Sub

Het nieuw aangemaakte tweede blad kun je eventueel nog een naam meegeven (standaard krijgt dat de naam Blad1).

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Heb nog geen tijd gehad om te installeren, maar alweer super bedankt en heb er veel vertrouwen in dat dit goed komt, nogmaals dank.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Is het nu ook mogelijk zonder het programma te verstoren om ergens wat in te voeren (bv weeknummer) om te testen of alles gaat zoals bedoelt.

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Bedoel je invoer in een werkblad of wijziging in de macro?
Of 'het gaat zoals bedoelt' kun je snel zien: de macro doet niet meer dan controleren of bij aanvang in het eerste blad (het eerste blad bij opstarten) in A1 het lopende weeknummer staat. Indien niet wordt het juiste weeknummer in A1 van het tweede blad geplaatst en krijgt de naam van dat tweede blad de naam van het lopende weeknummer, en wordt het eerste blad verwijderd. Staat bij aanvang in het eerste blad in A1 al het juiste weeknummer, dan gebeurt er helemaal niets. Juiste weeknummer in A1 en juiste weeknummer als bladnaam gaan altijd samen. Wijzig je handmatig 1 van de twee, dan zal er een foutmelding komen. Die melding is wel te voorkomen, maar als je dat doet dan zie je niet dat je wat fout hebt gedaan (niettemin zou foutafhandeling door toevoeging van enkele regels code, fraaier zijn).

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Of je verzet de systeemdatum...

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Systeemdatum is misschien de beste optie omdat er anders een foutmelding komt die je zelf veroorzaakt het niet meteen duidelijk maakt of het anders goed gaat .

Of misschien even het stukje loslaten wat de weeknummers automatisch verhoogd en hier een datum cel met een koppeling met weeknummers gebruiken, dat wanneer je handmatig een datum in een cel invoert er dan automatisch een koppeling is met het weeknummer en kun je snel zien wat de reactie is om het blad te wisselen.

En als laatste zou ik ook gewoon kunnen wachten tot maandag en eens zien wat er dan gebeurt.

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Je kunt toch een kopie van je bestand opslaan en daar zoveel wijzigingen in aanbrengen als je wil? Dan zie je meteen wat de gevolgen van die wijzigingen (kunnen) zijn en je bent geen gegevens kwijt, want je hebt je originele bestand nog.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ja, prima idee en ga wat experimenteren om zien wat het beste werkt, dank je wel.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik ben echt heel veel aan het experimenteren geweest maar loop toch vast en dat ligt echt wel aan mijn geringe kennis van vba en dus zet ik hieronder een macro neer die niet werkt en dat zal voor jullie geen verrassing zijn, maar dat is mij wel duidelijk, maar het geeft volgens mij wel weer wat of ik nu graag zou willen.

Private Sub Workbook_Open()
Dim w As Long
With Sheets("dezeweek,volgendeweek") 'Hier wordt de regel geel en niet duidelijk waarom
w = DatePart("ww", Date, 2, 2)
If .Range("J3").Value <> w Then
.Range("J3").Value = w
Selection.Locked = False 'Hier zou ik graag de beveiliging er even af willen hebben
DisplayAlerts = False 'Hier graag de meldingen even uitzetten om te voorkomen dat hij
daarom in de macro blijft hangen
Worksheets("volgendeweek").Range("G5:P52").Value = Worksheets("dezeweek").Range("G5:P52").Value
'Hier graag de volgende week kopiëren naar deze week
Worksheets("volgendeweek").Range("G5:P12,G15:P22,G25:P32,G35:P42,G45:P52").ClearContents
'Dan hier de volgende week weer inhoud wissen
Selection.Locked = True 'De beveiliging aanzetten
DisplayAlerts = True 'De meldingen mogen ook weer doorkomen
End If
End With
End Sub


Om het blad te verwijderen gaat op zich wel goed, maar dan moet er wel weer een nieuw blad voor de volgende week gemaakt, dus denk ik dan in mijn simpelheid dat de bovenstaande oplossing ook zou kunnen werken, maar dan op een manier die jullie hoop ik kunnen invullen.
Op zich gaat het bovenste gedeelte goed, als ik dit even in een los programmaatje stop dan werkt dit prima en dat hier een regel geel wordt zal met het feit te maken hebben dat ik de Tabbladen niet goed benoem.

Het zou mooi zijn als jullie hier nog eens even naar willen kijken om het laatste stukje van de macro werken te krijgen.

Alvast weer mijn dank

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
With Sheets("dezeweek,volgendeweek") 'Hier wordt de regel geel en niet duidelijk waarom.
In vorige berichten probeerde ik je twee keer(!) duidelijk te maken dat dat op die manier niet kan. En ik voegde eraaan toe: Wil je in twee bladen dezelfde bewerkingen uitvoeren? Indien ja, gebruik dan bv. een for-nextlus."
Selection.Locked = False 'Hier zou ik graag de beveiliging er even af willen hebben.
In een vorig bericht schreef ik:
"De beveiliging van een blad opheffen en weer instellen kan met de opdrachten Protect en Unprotect, zie de vba-helpfile."'Locked' is voor een checkbox, combobox, commandbutton, e.d. (zie de helpfile!).
Worksheets("volgendeweek").Range("G5:P52").Value = Worksheets("dezeweek").Range("G5:P52").Value
In een vorig bericht schreef ik:
"Wil je een groot bereik kopiëren (of verplaatsen), dan kun je beter copy (of cut) gebruiken."De helpfile geeft daar letterlijk een voorbeeld van.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Natuurlijk heb je groot gelijk met jouw reactie en neem me niet kwalijk, mijn excuses daarvoor en waardeer jouw hulp enorm.

Zoals ik het nu zie denk ik dat het meest onduidelijke voor mij is de for-nextlus.

De helpfile wat je noemt is dat de Help functie bovenaan de pagina?

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
wopmill schreef op dinsdag 1 maart 2022 @ 08:46:
De helpfile wat je noemt is dat de Help functie bovenaan de pagina?
Excel heeft twee helpfiles:
1. Voor gebruik in de werkbladen: druk op F1 als je een werkblad voor je hebt.
2. Voor gebruik van vba: druk F1 als je in de VBA-editor bent (daar waar de code staat).
Die laatste is zeer uitgebreid en geeft o.a. een overzicht van alle mogelijke opdrachten, vaak met 1 of meer voorbeelden. Je kunt je daar makkelijk een aantal jaren mee bezighouden ;)

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Even aanvullend @dix-neuf qua With... End with.

With...end with is nooit nodig maar enkel een korte notatie als je een serie bewerkingen op hetzelfde object (range, worksheet etc) wilt doen.

Bv ipv
code:
1
2
3
Range(“A1”)=10
Range(“A1”).interior.color=vbRed
Range(“A1”).copy

Mag je schrijven:

code:
1
2
3
4
5
with Range(“A1”)
.value=10
.interior.color=vbRed
.copy
End With


Er kan altijd maar een With...end with actief zijn. In jouw geval is het advies niet gebruiken totdat je je eigen code snapt.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik denk dat dat laatste het belangrijkste is, en moet ik mee aan de gang, dank je wel

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik heb alles wat uit elkaar getrokken om wat duidelijker te krijgen wie wat doet en denk het zo goed te doen en door er een paar macro's bij te plaatsen die doen wat ik graag wil hoop ik door deze er bij in te plakken dat er uiteindelijk een programma uit komt wat ik voor ogen heb.

Nu komt de vraag, kan ik deze lijst zo aan elkaar zetten dat er uiteindelijk een opdracht lijst komt die achter elkaar de opdrachten uitvoert , of moet er een Sub weggehaald worden en is dat alleen voldoende of zijn er meer aanpassingen nodig.

Ik hoop niet dat ik nu weer dingen aan haal die jullie al aangegeven hebben dat dat niet kan en als dat zo is dan komt dat door gebrek om het beter uit te leggen en mijn onervarenheid en zoals al genoemd ik kan nog wel jaren vooruit op de help site.

Even heel kort, maar voor alle duidelijkheid de week schuift elke maandag op en zet dan de week die vooraan staat achteraan en dat blad wordt dan inhoud van gewist en dan weer naar in dit geval week 10 om eventueel weer wat te kunnen invullen voor de planning.


Private Sub Workbook_Open() 'Dit werkt allemaal
Dim w As Long
w = DatePart("ww", Date, 2, 2)
If Sheets(1).Range("A1").Value <> w Then


With Application 'Waarschuwingen uitzetten
.DisplayAlerts = False

.Goto Sheets(1) 'Om er zeker van te zijn dat het begint op Sheet1 (Week9) in deze week


Sub MoverToEnd() 'Hier wordt op Maandag achter de bovenstaande macro de lopende week gewisseld met de volgende week (Week9,wordt Week10 en 10 wordt 11)
ActiveSheet.Move _
After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
End Sub


Sub LedigOnbeveiligd() 'Hier moet de nieuwe week (Week11) worden leeg gemaakt
On Error Resume Next 'Deze macro kan een beveiligd werkblad de onbeveiligde
'cellen leeg maken.
ActiveSheet.UsedRange = ""
On Error GoTo 0
End Sub


With Sheets(1) 'Hier wordt de naam van het Tabblad aangepast aan het nieuwe Weeknummer
.Name = "Week " & w
.Range("A1").Value = w
End With

With Sheets(2) 'Ook hier de aanpassing van de Tabblad naam
.Name = "Week " & w
.Range("A1").Value = w
End With


.Goto Sheets(1).Range("G5") 'Hier weer naar Week10 ( deze week )


.DisplayAlerts = True 'Waarschuwingen weer aanzetten

End With 'Einde verhaal
End With
End With
End Sub

En ik hoop weer op een reactie

Acties:
  • 0Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Het wordt er allemaal niet beter op... In plaats van gegoochel met copy, alerts, opheffen van beveiligingen etc kan het allemaal veel simpeler. Omdat je ook vroeg wanneer zet je welke code waar hier een verder uitgewerkt voorbeeld.

1: wat wil je bereiken?
Bij het openen van een bestand moet hij controleren of het voorlaatste blad de huidige week voorstelt. Als dat niet het geval is moet dat blad verwijderd of onzichtbaar worden en moet er een nieuwe week klaargezet worden.

2: de makkelijkste manier is dan om een leeg standaardblad klaar te zetten, en dat te copieren. Het zou ook makkelijk zijn als we aan een worksheet als het ware kunnen vragen 'ben jij van deze week?'

3: De oplossing:
Maak een blad met daarin de layout, bescherming, etc. voor een lege week. Noem dat blad bv 'template'. Dat lege blad gaat ook de code bevatten of het blad actueel is en om een kopie te maken. Open de vba editor en plak de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
Public Function IsActueel()
    IsActueel = (Range("A1") = DatePart("ww", Date, vbMonday, vbFirstFourDays))
End Function
Public Sub MakeNewWeek(Weeknr As Long)
    Me.Copy after:=Worksheets(Worksheets.Count)
    With Worksheets(Worksheets.Count)
        .Name = "Week " & Weeknr
        .Range("A1") = Weeknr
        .Visible = True
    End With
End Sub

test de code door in venster direct (Vba editor, ctrl+G) te tikken:
worksheets("template").MakeNewWeek 8 en
worksheets("template").MakeNewWeek 9

Als alles goed is gegaan heb je nu bestand met drie werkbladen: template, week 8 en week 9.

De code voor workbook open is nu simpel:
code:
1
2
3
4
5
 If Not Worksheets(Worksheets.Count - 1).IsActueel Then
        Worksheets("template").MakeNewWeek DatePart("ww", Date, vbMonday, vbFirstFourDays) + 1
        Worksheets(Worksheets.Count - 1).Activate
        Worksheets(Worksheets.Count - 2).Visible = False
 End If


Wil je het blad liever verwijderen dan laat je de regel met visible = false weg en vervang je die door

code:
1
2
3
        Application.DisplayAlerts = False
        Worksheets(Worksheets.Count - 2).Delete
        Application.DisplayAlerts = True


Tot slot verberg je het blad template.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Fijn dat je reageert en wil graag jouw oplossing maken, maar ik ga naar ontwikkelaars en dan naar beeld en dan naar Venster direct en er gebeurt dan niets, kun je misschien aangeven wat of ik dan fout doe.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Wat verwacht je dan dat er gebeurt??? Je hebt een prompt en je moet iets intikken. Doen eens gek en tik wat?

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik wil aangeven dat het venster direct schermpje niet tevoorschijn komt, ik neem aan dat dit een venster is die zich opent als ik via beeld dit bij venster direct dit aan klik.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Nog even ter verduidelijking Ctrl+G en er gebeurt niets

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Dan staat het al in beeld... venster direct... meestal onderaan je scherm.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik krijg dit niet op deze computer en dat komt denk ik door Windows 11, daar kun je de taakbalk niet meer naar de zijkant zetten en ik denk dat venster direct net achter de taakbalk zit als ik dit bekijk op een computer met Windows 10.Daar zie ik wel venster direct.

Morgen kijken of ik het op die computer verder kan installeren, bedankt maar weer.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Oplossing gevonden door de taakbalk te verbergen, toen kwam venster direct in beeld en deze hoger gemaakt en nu gaat het goed, dit even ter info

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik heb het volgende gedaan, in de worksheet "template" staat het eerste gedeelte van jouw voorstel

Public Function IsActueel()
IsActueel = (Range("A1") = DatePart("ww", Date, vbMonday, vbFirstFourDays))
End Function
Public Sub MakeNewWeek(Weeknr As Long)
Me.Copy after:=Worksheets(Worksheets.Count)
With Worksheets(Worksheets.Count)
.Name = "Week " & Weeknr
.Range("A1") = Weeknr


.Visible = True
End With
End Sub

Dan komt er in This workbook het volgende
Private Sub Workbook_Open()
If Not Worksheets(Worksheets.Count - 1).IsActueel Then
Worksheets("template").MakeNewWeek DatePart("ww", Date, vbMonday, vbFirstFourDays) + 1
Worksheets(Worksheets.Count - 1).Activate
Application.DisplayAlerts = False
Worksheets(Worksheets.Count - 2).Delete
Application.DisplayAlerts = True

End If
End Sub

De indeling wat aangegeven wordt in het venster van vba is

VBA Project (WeekC.xlsm)
Blad3 template
Blad4 Week10
Blad5 Week11
ThisWorkbook

Wat er nu gebeurde is dat elke keer als ik het programma opende werd er een kopie gemaakt en kreeg ik template(2),template(3) enz.
Deze laatste heb ik verwijdert en ik krijg een gele lijn in de opdracht , nl de volgende

If Not Worksheets(Worksheets.Count - 1).IsActueel Then

Is het nu zo dat met de indeling zoals die nu is dat dit If Not Worksheets(Worksheets.Count - 2).IsActueel Then moet zijn omdat de actuele week op dit moment Week 10 is of zie ik dat verkeerd.

Verder zou ik graag in de cel "J4" het betreffende week nummer willen zien, alleen bv 10 of 11 verder niets en kan de datum van die week die op maandag begint ook getoond worden in een cel en dat die dan de hele week gewoon blijft staan.

Als laatste moet ik nog wat met de beveiliging, want die moet er nu wel af als ik wat wil kopiëren en weer aan als dat klaar is.

Ik weet het is een heel lijstje en ik hoop dat je me uit wil leggen wat er gebeuren moet, alweer bedankt.

En als

Acties:
  • +1Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

wopmill schreef op dinsdag 8 maart 2022 @ 13:14:
[...]Ik weet het is een heel lijstje en ik hoop dat je me uit wil leggen wat er gebeuren moet, alweer bedankt.
Probeer de code te lezen en te begrijpen wat er staat. Dan zie je zelf wat er moet gebeuren. Dat je niet direct code kunt schrijven is niet zo erg, maar code die je zelf niet snapt moet je niet eens willen gebruiken.
Wat er nu gebeurde is dat elke keer als ik het programma opende werd er een kopie gemaakt
Dat betekent dus dat het voorlaatste weekblad niet het juiste weeknummer bevat. Maar in welke cel staat dat en naar welke cel kijkt de functie Isactueel()?
en kreeg ik template(2),template(3) enz.
Hoe zou dat komen dat hij niet meerdere keren een blad 'week 11' kan aanmaken?
of zie ik dat verkeerd.
Ja.
Verder zou ik graag in de cel "J4" het betreffende week nummer willen zien, alleen bv 10 of 11 verder niets en kan de datum van die week die op maandag begint ook getoond worden in een cel en dat die dan de hele week gewoon blijft staan.
Kijk eens naar welke cel het weeknummer wordt geschreven... En natuurlijk kun je op dat moment ook code invoegen die de datum van maandag wegschrijft. Hoe zou je de datum van maandag bepalen als je het weeknummer weet?
Als laatste moet ik nog wat met de beveiliging, want die moet er nu wel af als ik wat wil kopiëren en weer aan als dat klaar is.
Nee. Tenzij je de cel beveiligd hebt waar de macro het weeknummer in weg wil schrijven. Dat verklaart misschien wel al je problemen.

En nu zelf gaan nadenken!

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • LievenD
  • Registratie: Juli 2005
  • Laatst online: 20:19
Antwoord op de topicstart:

code:
1
2
3
4
5
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        Call ThisWorkbook.Week
    End If
End Sub

[Voor 11% gewijzigd door LievenD op 27-03-2022 22:02]


  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Om een van alles te proberen ben ik veel aan het experimenteren geweest en nu zover gekomen dat alles precies gaat zoals ik het graag hebben wil, maar nu is het programma zo enthousiast dat er geen ophouden in zit als het gedaan heeft wat het moest doen, nl de volgende week (Blad2) in deze week(Blad1) zetten en de nieuwe volgende week leeg maken, helemaal goed.
Wat er nu gebeurd dat als ik het programma op sla er weer dezelfde handeling wordt uitgevoerd en dat gaat maar door terwijl het de bedoeling is dat het alleen gebeurd als er een nieuwe week begint.
Ik heb van alles geprobeerd, maar hier kom ik niet verder mee en dus is de vraag of jullie hier nog eens naar willen kijken, ongetwijfeld zullen jullie zoiets anders maken, maar ik ben al blij dat ik zover gekomen ben en dat zeker dank zij jullie hulp en nu nog deze laatste hobbel wegwerken zou mooi zijn.
Hieronder wat ik gemaakt heb.

Private Sub Workbook_open()
Dim w As Long
w = DatePart("ww", Date, 2, 2)
If Sheets("Deze_Week").Range("J3").Value <> w Then
Sheets("Deze_Week").Unprotect
Sheets("Volgende_Week").Unprotect
Application.DisplayAlerts = False
Sheets("Volgende_Week").Select
Range("G5:P52").Select
Selection.Copy
Sheets("Deze_Week").Select
Range("G5").Select
ActiveSheet.Paste
Sheets("Volgende_Week").Protect
Sheets("Deze_Week").Protect
On Error Resume Next
Sheets("Volgende_Week").UsedRange = ""
On Error GoTo 0
Application.DisplayAlerts = True
End If
End Sub

In J3 van de sheet Deze_Week staat het weeknummer.

B.v.d. Wopmill

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Nog even aanvullende informatie is dat ik in cel A3 heb staan =vandaag() en in J3 staat =ISO.WEEKNUMMER(A3) en ik denk dat hier het probleem zit, maar waar.

  • wopmill
  • Registratie: Februari 2022
  • Laatst online: 05-06-2022
Ik denk dat ik de oplossing van mijn probleem weet en dat ik een verkeerde test manier gebruikte door de eerste 2 van Datepart op 4 te zetten komt er een reactie dat er gekeken wordt naar welke dag of het is (Woensdag) ipv de maandag die ik wil gebruiken en door de 4 te laten staan komt er elke keer weer een reactie en zal kijken of ik de suggestie van Lustucru kan gebruiken om de systeemdatum van de computer te veranderen.
Of anders de maandag af te wachten.
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee