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

Code onder werkblad en kopie dus meerdere x zelfde code

Status
Niet open voor verdere reacties.

glda19

Terugkerende gebruiker
Lid geworden
14 jan 2008
Berichten
1.064
Hi
Ik heb een blad waarvan in telkens in het begin van het jaar een kopie neem.
Maar ook de code die in de in de vba staat onder het werkblad word gekopieerd.
Is het verstandig om die code onder ieder gekopieerd werkblad te hebben staan.

Is dit beter of niet
de sub en end sub met verwijzing naar een module.
Dus code dan maar 1x
 
Zou niet uit moeten maken. Ligt er ook aan wat de functie is van die macro.
 
dit is de marcro
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

' Afhankelijk van de soort te werkstelling de inhoud van het bereik x10:aa10 aapassen
' en indien nodig de eerste waarde van de gegevens validatie ophalen om aan te tonen wat moet komen.

Dim RngCelBereik As Range
If Target.Address = "$Y$9" Then

    Range("x10:aa10").Locked = True
    Select Case Target.Value

        Case "Voltijds"
            Range("x10:z10").ClearContents
            Range("Aa10").Font.Color = vbWhite
        Case "4/5"
            Range("x10").Locked = False
            Range("x10").Value = ThisWorkbook.Names("weekdagen").RefersToRange.Cells(1, 1)
            Range("y10:z10").ClearContents
            Range("Aa10").Font.Color = vbWhite
            
         Case "Halftijds"
            Range("x10:aa10").Locked = False
           Range("x10").Value = ThisWorkbook.Names("weekdagen").RefersToRange.Cells(1, 1) 'Maandag
            Range("y10").Value = ThisWorkbook.Names("weekdagen").RefersToRange.Cells(2, 1) 'Dinsdag
            Range("z10").Value = ThisWorkbook.Names("weekdagen").RefersToRange.Cells(3, 1) 'Woensdag
            Range("aa10").Font.Color = RGB(0, 176, 240) 'licht blauw
        End Select
End If
End Sub
 
Ik neem aan dat je deze code in de de gekopieerde werkboeken ook werkend wil hebben. Dan moet je de code laten staan
 
zou dit toch in een module kunnen zetten en die aanroepen
 
Dit wordt aangeroepen door een Worksheet_Change.
 
Echt nut heeft het niet, maar dit achter je werkblad:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$Y$9" Then Call Werkblad_Gewijzigd(Target)
End Sub
En dan dit in een module:
Code:
Sub Werkblad_Gewijzigd(ByVal Target As Range)
    [COLOR="#008000"]' Afhankelijk van de soort te werkstelling de inhoud van het bereik x10:aa10 aapassen[/COLOR]
    [COLOR="#008000"]' en indien nodig de eerste waarde van de gegevens validatie ophalen om aan te tonen wat moet komen.[/COLOR]
    Range("x10:aa10").Locked = True
    Select Case Target.Value
        Case "Voltijds"
            Range("x10:z10").ClearContents
            Range("Aa10").Font.Color = vbWhite

        Case "4/5"
            Range("x10").Locked = False
            Range("x10").Value = ThisWorkbook.Names("weekdagen").RefersToRange.Cells(1, 1)
            Range("y10:z10").ClearContents
            Range("Aa10").Font.Color = vbWhite
            
         Case "Halftijds"
            Range("x10:aa10").Locked = False
            Range("x10").Value = ThisWorkbook.Names("weekdagen").RefersToRange.Cells(1, 1) [COLOR="#008000"]'Maandag[/COLOR]
            Range("y10").Value = ThisWorkbook.Names("weekdagen").RefersToRange.Cells(2, 1) [COLOR="#008000"]'Dinsdag[/COLOR]
            Range("z10").Value = ThisWorkbook.Names("weekdagen").RefersToRange.Cells(3, 1) [COLOR="#008000"]'Woensdag[/COLOR]
            Range("aa10").Font.Color = RGB(0, 176, 240) [COLOR="#008000"]'licht blauw[/COLOR]
        End Select
End Sub
 
Laatst bewerkt:
Moet telkens je dat werkblad kopieert diezelfde macro lopen of zal in de loop der jaren een zekere evolutie zijn in die macro ?
In personeelszaken is dat kwasie een certitude, je wekelijkse vrije dag zal vermoedelijk niet constant zijn, je feestdagen ook niet.

Daarom zou ik op bladniveau je change_event laten verwijzen naar een bepaalde macro met een versienummer en desnoods ook die target meenemen en dan meerdere macro's maken al naargelang de situatie zich anders voordoet. Anderzijds staan er weinig spectaculaire dingen in die ene macro, dus zal je aan 1 versie vermoedelijk genoeg hebben.

Dus het is zo ongeveer opnieuw, volgens hoe stel je de vraag, dat je een antwoord krijgt, dus het zal zowel de mossel als de vis zijn of geen van beiden.
Filosofische vragen, wat is er het eerst, de kip of het ei ?
Op dit soort vragen kunnen wij nooit scoren, want je kent je eigen einddoel nog zelf niet.

Dus een mogelijks foute voorzet,

Code:
in een algemene module
Sub Versie2020juli(MijnTarget As Range)
   blablabla...
End Sub

in een bladmodule
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Address = "$Y$9" Then Versie2020juli Target
End If
 
Extra info m.b.t. bovenstaande:

"
Uit onderzoek blijkt dat de kip er wel degelijk eerder was dan het ei.
De samenstelling van de eierschaal bevat namelijk een proteïne die alleen voorkomt in de eierstokken van een kip.
Dat betekent dat een ei alleen kan bestaan als het eerst in een kip heeft gezeten.
"

:D
 
@Edmoor,
gek, ik heb >20 minuten nodig om in grote lijnen net hetzelfde antwoord te geven als jijzelf, behalve die extra comment.
En dan heb jij exact 3 minuten nodig om het "kip-ei" verhaal voor mij op te lossen.

Echte klasse en dat op een zondagavond !!! :thumb:
 
Die Macro is op elkaar het zelfde.
Die macro moet enkel de vakjes leeg maken of de nodig dagen terug zetten afhankelijk van of voltijds 4/5 of halftijds gekozen is.

En die macro wijzig per jaar niet. Dus zou ik de code tussen de sub en end sub eigenlijk in een module kunnen plaatsen en dan onder het werkblad juist de aanroep naar de macro zetten
 
Laatst bewerkt:
En dat is precies wat er in #7 staat.
 
sorry edmoor had post #7 niet gezien
Maar je schrijft daar echt nut heeft het niet? Wat bedoel je daar mee?
Wat is dan beter. of ben ik even het noorden kwijt ?
Hoe zou ik ander als cell y9 wijzigt de cellen x10:aa10 laten veranderen . Zonder dat ik post #7 gebruil
 
Ik bedoel dat het splitsen naar een module geen zin heeft.
Je kan het net zo goed in z'n geheel achter dat werkblad laten staan, zoals in #3 dus.
Waarom zou je dat in een module willen?
 
Waarom wil je de code niet gebruiken als het een functie heeft?
 
omdat de code dan er op termijn 5 keer gaat instaan. Daar ze 5 jaar in tijd kunnen terug keren
 
Je doet in die code niks met een jaartal, dus dat zie ik even niet.
 
staat wel onder het werkblad dus iedere nieuw jaar voeg ik een nieuw jaar toe. En dit max 5 jaar na elkaar bij het 6de jaar verwijder ik het eerste jaar. Dus er staan max 5 jaar kalenders in het bestand met 5 x deze code onder het werkblad
 
Op die manier.
Dan kan je het doen zoals ik in #7 liet zien.
 
Of de code verwijderen,
Je bladnaam in de code zal variabel moeten worden.

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
 With ThisWorkbook.VBProject.VBComponents("Blad1").CodeModule
    .DeleteLines .ProcStartLine("Worksheet_Change", 0), .ProcCountlines("Worksheet_Change", 0)
End With
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan