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

Variabelen declareren

Status
Niet open voor verdere reacties.

tkint

Gebruiker
Lid geworden
5 dec 2011
Berichten
754
In de macro's van het bijgevoegd bestand declareer ik op bladniveau 2 variabelen als public met de bedoeling ze te op te vragen op workbookniveau. Dat lukt niet en andersom lukt het ook niet. Declareer ik de variabelen verkeerd en (of) op de verkeerde plaats?
Ik heb dit probleem omzeild door de waarde van de variabele in de cel Z1 weg te schrijven.
Peter B heeft mij een subroutine aangereikt om de gebruiker te verplichten een kruisje in kolom D te plaatsen vooraleer er in de kolommen E tot H een keuze kan gemaakt worden. Dat werkt perfect.
Ik zou nu ook willen verhinderen dat een vooraf ingevuld kruisje kan verwijderd worden. Hoe pak ik dat probleem aan?
 

Bijlagen

  • risico-analyse_versie 13 forum.xlsm
    42,5 KB · Weergaven: 46
Public variabelen die je in iedere sectie wilt gebruiken moet je declareren in een Module. Verder declareer je variabelen ook zonder er een datatype aan mee te geven, dan neemt deze het datatype aan van de eerste waarde die hij krijgt en kan je verder in je programma ineens worden geconfronteerd met een Error 13 foutmelding waar je je dan vervolgens rot naar zoekt.

Gebruik, zoals ik wel vaker zeg en regelmatig op tegengesproken wordt, altijd Option Explicit.
Dan was de oorzaak van je probleem al lang duidelijk geweest.

Zie ook:
http://www.excel-easy.com/vba/examples/option-explicit.html
 
Laatst bewerkt:
Beste,

Ik behoud dus alleen de subroutine open, before save, before save, before print op het niveau workbook, de routines change en selection change op werbladniveau. Alle andere routines plaats ik een module en gebruik de option explicit zodat ik verplicht ben de variabelen te declareren. Correct geformuleerd?
Heb je een idee hoe ik het verwijderen van de kruisjes kan verhinderen? Ik wil de gebruiker waarschuwen dat het verwijderen niet kan.
 
Je hoeft niks te verplaatsten, alleen die Public variabelen declareren in een Module. Option Explicit verplicht je inderdaad je variabelen te declareren. Dat zal je dan ook moeten doen voor variabelen die nog niet zijn gedeclareerd. Dat hoeft niet verplicht in een module.
 
Laatst bewerkt:
Je kunt in "mijn" subroutine de volgende aanpassingen doen (in rood).

In het event SelectionChange moet je de te controleren range uitbreiden. Dit was F13:H90, moet nu dus worden C13:H90.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Range("[COLOR="#FF0000"]C13[/COLOR]:H90"), Target) Is Nothing And Target.Cells.Count = 1 Then
    origValue = Target.Value
End If
End Sub

In het event Change moet je de extra contole inbouwen. Dus in de range C13:H90 ga je een controle inbouwen of de originele waarde een "x" was. Zo ja, dan krijg je een melding (Dat mag niet) en wordt de "x" teruggezet.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("F13:H90"), Target) Is Nothing And Target.Cells.Count = 1 Then
    Application.EnableEvents = False
    If Cells(Target.Row, 4).Value <> "x" Then
        Target.Value = origValue
    End If
    Application.EnableEvents = True
End If
[COLOR="#FF0000"]If Not Intersect(Range("C13:E90"), Target) Is Nothing And Target.Cells.Count = 1 Then
    Application.EnableEvents = False
    If origValue = "x" Then
        MsgBox "Dat mag niet"
        Target.Value = origValue
    End If
    Application.EnableEvents = True
End If[/COLOR]
End Sub

Om te voorkomen dat men per ongeluk meerdere cellen selecteert en vervolgens verwijderd kun je het SelectionChange event uitbreiden met een controle op meerdere cellen (weer in rood)
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Range("[COLOR="#FF0000"]C13[/COLOR]:H90"), Target) Is Nothing And Target.Cells.Count = 1 Then
    origValue = Target.Value
End If
[COLOR="#FF0000"]If Target.Cells.Count > 1 Then
    MsgBox "Selectie van meer dan 1 cel is verboden", vbCritical
    ActiveCell.Select
End If
[/COLOR]End Sub

LET OP! Waterdicht krijg je dergelijke controles niet/ niet alleen met VBA. Want wat als men besluit het bestand te openen zonder macro's enabled?
 
Nog een kleine aanvulling op het declaratieverhaal. In de volgende declaratie is alleen de laatste variabele (tvcontrole2) gedeclareerd als Integer. De overige variabelen worden gedeclareerd als variant.
Code:
Public rij, tvcontrole1, tvcontrole2 As Integer
Hier ben ik ooit na lang speuren achter gekomen. Zie voor wat achtergrond het volgende artikel: http://dailydoseofexcel.com/archives/2013/07/02/vba-best-practices-that-ill-never-do/. Hierin staan nog meer goede tips om bepaalde valkuilen te vermijden.
 
Beste Peter B.

Bedankt voor de doorgestuurde aanpassingen in de macro's. Ik waardeer in het bijzonder de commentaar (uitleg) die je daar bijvoegt. Uit jouw laatste reactie heb ik begrepen dat je elke variabele afzonderlijk moet declareren indien je daaraan een specifiek type wil toekennen. Heb je soms een link met een Nederlandse uitleg over declareren van variabelen want mijn Engelse woordenschat is beperkt?
Ik probeer zo meteen jouw code uit.
 
Beste Peter B.

Bedankt voor de doorgestuurde aanpassingen in de macro's. Ik waardeer in het bijzonder de commentaar (uitleg) die je daar bijvoegt. Uit jouw laatste reactie heb ik begrepen dat je elke variabele afzonderlijk moet declareren indien je daaraan een specifiek type wil toekennen. Heb je soms een link met een Nederlandse uitleg over declareren van variabelen want mijn Engelse woordenschat is beperkt?
Ik probeer zo meteen jouw code uit.
 
Wees verstandig en gebruik een userform.

Daarin laat je de gebruiker geldige keuzes maken.
Het resultaat schrijf je weg in een verborgen werkblad als het userform gesloten wordt.
Dan kan de gebruiker niets aan het werkboek zelf verprusten.

Je zult zien dat je dan nauwelijks variabelen nodig hebt, en al zeker geen met een public scope.
 
@snb
ik had in eerste instantie de waarde van de variabele weggeschreven in een cel buiten het bereik van de schermafbeelding. Maar ik dacht dat het een "amateur"-oplossing was. Jij stelt dus voor om geen inputbox te gebruiken om het wachtwoord in te voeren.
@Peter B
De uitleg in de Nederlandstalige pagina is uitgebreider dan in de vorige link. Bedankt.
 
lees mijn bericht nog eens rustig door.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan