gegevensvalidatie met messagebox

Status
Niet open voor verdere reacties.

Aurelie90

Gebruiker
Lid geworden
27 sep 2008
Berichten
33
hoi

hoe kun je van een selectie de gegevens niet wijzigen?
Enkel de toegelaten codes (L1, V1, -, R-1, ...) mogen in een cel ingevuld worden. De controle dient te gebeuren na elke wijziging van een cel. Bij een foutieve code krijgt de gebruiker een melding aan de hand van een messagebox. Daarna wordt de foutieve invoer gewist. Hoe kan ik dit probleem oplossen? Ik probeer het met gegevensvalidatie, maar het lukt mij niet...

Grts
 

Bijlagen

Zie bijlage Aurelie. Ik heb enkel gegevensvalidatie gebruikt.

Geen VBA nodig.

Wigi

Bedankt, maar lukt dit ook zonder een lijst te gebruiken (bv bij gegevensvalidatie in plaats van lijst Aangepast te gebruiken), en de foutmelding te wijzigen in enkel een OK-knop en tekst?
Ik heb namelijk mijn selectie een naam gegeven, en bij aangepast deze naam gezet, maar dan toont hij telkens die foutmelding.
 
Hang jouw voorbeeldje bij zodat ik in detail kan zien wat je hebt bij Aangepast.
 
Hang jouw voorbeeldje bij zodat ik in detail kan zien wat je hebt bij Aangepast.

In bijlage de eigenlijke versie.
dus in werkblad 1 vind je allerlei waarden (normaal een ander bestand, maar was veel te groot, dus dit zijn enkele waarden)
op deze selectie mogen de waarden niet veranderen. Ik heb gegevensvalidatie gewerkt, maar het klopt niet precies.
Deze waarden mogen alleen maar in de selectie staan:
-; V1; V2; V3; V4; V5; V6; V7; L1; L2; L3; L4; L5; L6; L7; D1; D2; D3; D4; D5; D6; D7; ADV1; ADV2; ADV3; V1+; V2+; V3+; V4+; V5+; V6+; V7+;L1+; L2+; L3+; L4+; L5+; L6+; L7+;D1+; D2+; D3+; D4+; D5+; D6+; D7+;V1-; V2-; V3-; V4-; V5-; V6-; V7-;L1-; L2-; L3-; L4-; L5-; L6-; L7-;D1-; D2-; D3-; D4-; D5-; D6-; D7-; V10; L19; DD; A1; K30; K31; V10+; L19+; DD+; A1+; K30+; K31+; V10-; L19-; DD-; A1-; K30-; K31-; AFW; BF; CZH; DFR; EDV; EXTRA?; JV; KV; LOS; OBV; OPL; OV; PNV; R-; R+; TK; VA; Z; ZWV; V11; V12; V13; L11; L12; L13; D11; D12; D13;V11+;V12+;V13+;L11+;L12+;L13+;D11+;D12+; D13+; V11-;V12-;V13-;L11-;L12-;L13-;D11-;D12-; D13-

Ik heb deze ook al bij aangepast gezet, maar het zijn teveel waarden...
Hopelijk vind jij iets...
 

Bijlagen

Eventueel:

=aantal.als(gegevens;A56)>0

voor cel A56 bij Aangepast.

Waarom staat er ook validatie op de cel van het bereik gegevens?
 
Eventueel:

=aantal.als(gegevens;A56)>0

voor cel A56 bij Aangepast.

Waarom staat er ook validatie op de cel van het bereik gegevens?

Omdat het bereik Gegevens de gegevens zijn :p
maar waarom gebruik jij cel A56?
 
- In welke cellen staan de keuzes die men mag maken?
- In welke cellen moet er validatie zijn die checkt of de keuze goed is?

En is het echt nodig dat je zulk een groot bereik hebt met mogelijke keuzes? :eek:
 
- In welke cellen staan de keuzes die men mag maken?
- In welke cellen moet er validatie zijn die checkt of de keuze goed is?

En is het echt nodig dat je zulk een groot bereik hebt met mogelijke keuzes? :eek:

de ingevulde cellen zijn de waarden die niet mogen veranderen, dus van A1 tot AA63.
Deze codes staan vast, dus maw. alleen deze codes mogen in de cellen tevoorschijn komen. Als de gebruiker een andere waarde dan deze codes invult in het bereik, moet er een messagebox tevoorschijn komen (gelijkaardig zoals de foutmelding van gegevensvalidatie). Dit zijn de codes:
-; V1; V2; V3; V4; V5; V6; V7; L1; L2; L3; L4; L5; L6; L7; D1; D2; D3; D4; D5; D6; D7; ADV1; ADV2; ADV3; V1+; V2+; V3+; V4+; V5+; V6+; V7+;L1+; L2+; L3+; L4+; L5+; L6+; L7+;D1+; D2+; D3+; D4+; D5+; D6+; D7+;V1-; V2-; V3-; V4-; V5-; V6-; V7-;L1-; L2-; L3-; L4-; L5-; L6-; L7-;D1-; D2-; D3-; D4-; D5-; D6-; D7-; V10; L19; DD; A1; K30; K31; V10+; L19+; DD+; A1+; K30+; K31+; V10-; L19-; DD-; A1-; K30-; K31-; AFW; BF; CZH; DFR; EDV; EXTRA?; JV; KV; LOS; OBV; OPL; OV; PNV; R-; R+; TK; VA; Z; ZWV; V11; V12; V13; L11; L12; L13; D11; D12; D13;V11+;V12+;V13+;L11+;L12+;L13+;D11+;D12+; D13+; V11-;V12-;V13-;L11-;L12-;L13-;D11-;D12-; D13-

In dit ganse bereik (A1:AA63) moet er een validatie zijn.
Het originele bestand is te groot om up te loaden, dit zijn slechts de helft van de gegevens.
Ja, dit is nodig, want dit is voor een ziekenhuisbedrijf, en iedere kolom staat voor een datum, en iedere rij staat voor een patient.

Daarom, is dit niet makkelijker in macro of een andere manier dan met gegevensvalidatie? want ik heb de gegevensvalidatie in VB gezet, maar dit werkt niet perfect, hij geeft op elke cel de melding:

Sub gegevensvalidatie()
Range("A1:AA63").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="-;V1; V2; V3; V4; V5; V6; V7; L1; L2; L3; L4; L5; L6; L7; D1; D2; D3; D4; D5; D6; D7; ADV1; ADV2; ADV3; V1+; V2+; V3+; V4+; V5+; V6+; V7+;L1+; L2+; L3+; L4+; L5+; L6+; L7+;D1+; D2+; D3+; D4+; D5+; D6+; D7+;V1-; V2-; V3-; V4-; V5-; V6-; V7-;L1-; L2-; L3-; L4-; L5-; L6-; L7-;D1-; D2-; D3-; D4-; D5-; D6-; D7-; V10; L19; DD; A1; K30; K31; V10+; L19+; DD+; A1+; K30+; K31+; V10-; L19-; DD-; A1-; K30-; K31-; AFW; BF; CZH; DFR; EDV; EXTRA?; JV; KV; LOS; OBV; OPL; OV; PNV; R-; R+; TK; VA; Z; ZWV; V11; V12; V13; L11; L12; L13; D11; D12; D13;V11+;V12+;V13+;L11+;L12+;L13+;D11+;D12+; D13+; V11-;V12-;V13-;L11-;L12-;L13-;D11-;D12-; D13-"
.IgnoreBlank = True
.InCellDropdown = False
.ErrorTitle = "Invoer niet correct"
.ErrorMessage = "De invoer is niet correct!"
.ShowInput = True
.ShowError = True
End With
End Sub
 
Ongeteste code

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim rIntersect As Range
    Dim r As Range
    Dim sErrors As String
    
    On Error Resume Next
    Set rIntersect = Application.Intersect(Target, Range("A1:AA63"))
    On Error GoTo 0
    
    If Not rIntersect Is Nothing Then
    
        For Each r In rIntersect
        
            If WorksheetFunction.CountIf(Range("M1:M100"), r.Value) = 0 Then
            
                Application.EnableEvents = False
                r.ClearContents
                Application.EnableEvents = True
            
            End If
            
            sErrors = sErrors & vbNewLine & r.AddressLocal(0, 0, xlA1)
        
        Next r
    
    End If
    
    If Len(sErrors) > 0 Then
        sErrors = "Er was ongeldige invoer in deze cel(len):" & vbNewLine & vbNewLine & sErrors
        MsgBox sErrors, vbCritical, "Ongeldige invoer"
    End If

End Sub

Pas de 2 bereiken nog aan in de code. Het bereik M1:M100 heb ik genomen voor het bereik dat alle toegelaten codes omvat. Pas aan indien gewenst.

Deze code moet niet in een module komen maar in de code voor het blad waar het van toepassing moet zijn. Bv. achter Blad1.

Wigi
 
Ongeteste code

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim rIntersect As Range
    Dim r As Range
    Dim sErrors As String
    
    On Error Resume Next
    Set rIntersect = Application.Intersect(Target, Range("A1:AA63"))
    On Error GoTo 0
    
    If Not rIntersect Is Nothing Then
    
        For Each r In rIntersect
        
            If WorksheetFunction.CountIf(Range("M1:M100"), r.Value) = 0 Then
            
                Application.EnableEvents = False
                r.ClearContents
                Application.EnableEvents = True
            
            End If
            
            sErrors = sErrors & vbNewLine & r.AddressLocal(0, 0, xlA1)
        
        Next r
    
    End If
    
    If Len(sErrors) > 0 Then
        sErrors = "Er was ongeldige invoer in deze cel(len):" & vbNewLine & vbNewLine & sErrors
        MsgBox sErrors, vbCritical, "Ongeldige invoer"
    End If

End Sub

Pas de 2 bereiken nog aan in de code. Het bereik M1:M100 heb ik genomen voor het bereik dat alle toegelaten codes omvat. Pas aan indien gewenst.

Deze code moet niet in een module komen maar in de code voor het blad waar het van toepassing moet zijn. Bv. achter Blad1.

Wigi

kan ik dan de gewenste waarden in de code toevoegen, want hij toont het messagebox bij iedere cel die ik aanklik in het bereik.
Alvast heel erg bedankt!
 
De waarden die gekozen mogen worden, zet je in M1:M100 (en pas dat bereik aan zodat het nauw aansluit).

Of in een ander bereik maar verander dan in de code wat het goede bereik is.

Je krijgt een msgbox vanaf dat er iets ingegeven wordt dat niet mag.

Je krijgt mooi een lijstje van de "fouten" en tevens worden de cellen met fouten weer gewist.

Wigi
 
De waarden die gekozen mogen worden, zet je in M1:M100 (en pas dat bereik aan zodat het nauw aansluit).

Of in een ander bereik maar verander dan in de code wat het goede bereik is.

Je krijgt een msgbox vanaf dat er iets ingegeven wordt dat niet mag.

Je krijgt mooi een lijstje van de "fouten" en tevens worden de cellen met fouten weer gewist.

Wigi

ik bedoel, kan ik de waarden die gekozen mogen worden in de code zetten, in plaats dan in een bereik?
iets in die aard:
If WorksheetFunction.values = "al de codes" Then

Application.EnableEvents = False
r.ClearContents
Application.EnableEvents = True
End If
 
De waarden die gekozen mogen worden, zet je in M1:M100 (en pas dat bereik aan zodat het nauw aansluit).

Of in een ander bereik maar verander dan in de code wat het goede bereik is.

Je krijgt een msgbox vanaf dat er iets ingegeven wordt dat niet mag.

Je krijgt mooi een lijstje van de "fouten" en tevens worden de cellen met fouten weer gewist.

Wigi

Hallo,
na wat gesukkel lukt het met 1 waarde, maar hoe kan ik het aanpassen naar meerdere waarden? mijn code (op het einde van de code, na enkele aanpassingen van uw code gekregen)

'melding aan gebruiker tonen
If rIntersect <> "L1" Then
sErrors = "De invoer is niet correct!" & vbNewLine & "De inhoud van de cel wordt verwijderd!"
MsgBox sErrors, vbOKOnly, "Microsoft Excel"
End If

Dit lukt perfect, maar het lukt dan niet meer als ik meerdere waarden wil doen. Ik heb ook een string aangemaakt met alle waarden:
dim strWaarden as string
set strWaarden.value = "L1" or "L2" or "L3" or ......
if rIntersect <> strWaarden then.....
Dit werkt ook niet..
 
ik bedoel, kan ik de waarden die gekozen mogen worden in de code zetten, in plaats dan in een bereik?
iets in die aard:
If WorksheetFunction.values = "al de codes" Then

Application.EnableEvents = False
r.ClearContents
Application.EnableEvents = True
End If

Ik begrijp niet waarom je dat zou doen.

Evt. zet je dat lijstje in een verborgen kolom.

Denk er ook aan dat code onderhouden moet worden. Als jij op het werk eens geen vervangingen kan doen, moet iemand anders het doen. En in VBA-code gaan zoeken als niet kenner lijkt me niet echt een succesverhaal. In wat cellen veranderingen aanbrengen lijkt veel beter als oplossing.

Wigi
 
Ik begrijp niet waarom je dat zou doen.

Evt. zet je dat lijstje in een verborgen kolom.

Denk er ook aan dat code onderhouden moet worden. Als jij op het werk eens geen vervangingen kan doen, moet iemand anders het doen. En in VBA-code gaan zoeken als niet kenner lijkt me niet echt een succesverhaal. In wat cellen veranderingen aanbrengen lijkt veel beter als oplossing.

Wigi

Ik ben de enige die aan dit bestand moet werken.
En het bereik van de gegevens is heel groot, dus daarom is dit handiger als ik die waarden in een code zet. Dus, lukt dit niet om al die waarden toe te kennen aan een String, en zo dan verder te werken?
 
Dat kan wel, met een Select Case structuur of met IF-THEN-ELSE structuren.

Of door een Array op te vullen en na te gaan of het erin zit.

Maar 100 % gegarandeerd: dit gaat veel lastiger zijn dan dit in cellen te zetten, en veel minder onderhoudbaar in de toekomst.

Wigi
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan