'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)
Verwijderd
U dubbelklikt op ThisWorkBook.
Boven het edit-veld (rechts) staan 2 dropdown-boxes. Kies in de linker Workbook, kies dan in de rechter Before_save.
Dan schrijf je de code:
1
2
3
4
5
6
7
| if Sheets("naamvanjesheet").Range("A1").Value = ""
AND Sheets(...).Value = "" AND Sheets(...) enzovoorts THEN
Cancel = True
MsgBox "Vul je wel even alles in"
End if |
Zoiets dan natuurlijk. Regeleinden niet overnemen. Of een spatie _ gebruiken.
[ Voor 13% gewijzigd door Verwijderd op 26-11-2002 15:57 ]
Ik zie ThisWorkbook (en de 5 bladen waaruit het excel bestand bestaat).
Dan kan ik uit de pulldown menuutjes links kiezen uit algemeen en worksheet
rechts staat dan niet before_save ertussen (staan maar 6 mogelijkheden)
EDIT: gewoon zelf invullen werkt ook.... ok even zien nu!
EDIT2: als ik wil zeggen als 1 van de drie cellen is ingevuld dan moeten ze alledrie zijn ingevuld doe ik dat dan met een * ???(Dus niet testen op "" maar op "*"?)
[ Voor 30% gewijzigd door miel op 26-11-2002 16:15 ]
Verwijderd
Antwoord op Edit2:
Wildcards zijn niet toegestaan. Een cel bevat een waarden of niet. Wat je dan dus doet is controleren i.p.v. op 'en' op 'of'...
Want als: If 1=1 or 2=1 or 3=1, dan is een van deze beweringen waar.
Maar misschien bedoel je dat niet, en bedoel je (wat ook te lezen valt uit je zin) dat als cel X een waarde bevat, dat dan Y en Z ook ingevuld moeten zijn.
Dan krijg je dus een extra IF:
1
2
3
4
5
6
7
| Als Cel X is ingevuld
Als cel Y of Z leeg
cancel
end if
else
oude statement
end if |
[ Voor 68% gewijzigd door Verwijderd op 26-11-2002 16:21 ]
Mensen krijgen een lege excel spreadsheet. Daar moeten ze een aantal regels invullen met codes (Per gedane activiteit die week moeten ze 1 regel invullen).
Per regel moeten ze dus of 3 codes of niks invullen (als ze bijvoorbeeld maar 1 activiteit hebben).
Hoe test ik of er is ingevuld? Leeg is "" maar ingevuld is??
[ Voor 90% gewijzigd door miel op 26-11-2002 16:24 ]
Verwijderd
Je aanroep van de sub is niet goed, en je if-formule ook niet.
Als je even heel concreet zonder code kunt stellen wat je precies wilt, met celnamen, dan legt het wat makkelijker uit.
EDIT: dit was een opmerking toen er nog een bericht stond... Die edits van je
Hoe test ik of er is ingevuld?
>""
<>""
NOT ding="".
Kiest u maar.
[ Voor 41% gewijzigd door Verwijderd op 26-11-2002 16:28 ]
er is maar 2 combis die mogen werken en dat is dat alle 3 de cellen op een rij zijn ingevuld of dat alle 3 de cellen leeg zijn.
dus:
of 1 of 2 of 3 is leeg moet een error geven
mits ze alledrie leeg zijn.
nu nog kloten met VBA want dat lukt nog niet al te goed...
[ Voor 85% gewijzigd door miel op 26-11-2002 19:07 ]
Verwijderd
1
2
3
4
5
6
7
8
| If Cell1="" AND Cell2="" AND cell3="" then 'Alles is leeg Msgbox "Niets aan de hand" Elseif Cell1>"" AND Cell2>"" AND cell3>"" then 'Alles ingevuld Msgbox "Ook niets aan de hand" Else Cancel = True Msgbox "Dit is ongeldig" End if |
Dan moet je zelf in de help nog even zoeken naar een for-lusje, zodat je dit voor 8 rijen doet. Je kunt 't natuurlijk ook uitschrijven als je daar zin in hebt... maar dat is een erg kromme manier.
[ Voor 205% gewijzigd door Verwijderd op 26-11-2002 21:14 ]
anyhows bedankt en ik ga morgen op het werk wel even puzzelen!!
Verwijderd
Heb de volgende code gebruikt:
IF Sheets("Weekrapport").Range("C11").Value = "" AND Sheets("Weekrapport").Range("E11").Value = "" AND Sheets("Weekrapport").Range("G11").Value = "" then exit sub Elseif Sheets("Weekrapport").Range("C11").Value > "" AND Sheets("Weekrapport").Range("E11").Value > "" AND Sheets("Weekrapport").Range("G11").Value > "" exit sub Else Cancel = True Msgbox "Vul aub alle codes in. Als je er niet uit komt mail/bel Miel Claessens" End if
Waar gaat het ongeveer verkeerd?
mail me anders even???
[ Voor 23% gewijzigd door miel op 27-11-2002 11:38 ]
1
2
3
4
5
6
7
8
9
| Sub bla() If Sheets("Weekrapport").Range("C11").Value = "" And Sheets("Weekrapport").Range("E11").Value = "" And Sheets("Weekrapport").Range("G11").Value = "" Then Exit Sub Elseif Sheets("Weekrapport").Range("C11").Value > "" AND Sheets("Weekrapport").Range("E11").Value > "" AND Sheets("Weekrapport").Range("G11").Value > "" Exit Sub Else Cancel = True MsgBox "Vul aub alle codes in. Als je er niet uit komt mail/bel Miel Claessens" End If |
Er mist een Then op regel 4
Als het overigens via GoT gaat kunnen anderen er ook van leren
'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)
Heb nu het volgende (zonder zo een mooie lay-out):
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Sheets("Weekrapport").Range("C11").Value = "" And Sheets("Weekrapport").Range("E11").Value = "" And Sheets("Weekrapport").Range("G11").Value = "" Then
Exit Sub
ElseIf Sheets("Weekrapport").Range("C11").Value > "" And Sheets("Weekrapport").Range("E11").Value > "" And Sheets("Weekrapport").Range("G11").Value > "" Then
Exit Sub
Else
Cancel = True
MsgBox "Vul aub alle codes in. Als je er niet uit komt mail of bel Miel Claessens"
End If
End Sub
Private Sub Workbook_Open()
End Sub
Ik krijg geen compileer fouten meer maar hij doet het ook niet. Kan evengoed nog saven (na het inschakelen van de macros) terwijl ik alleen C11 heb ingevuld
[ Voor 125% gewijzigd door miel op 27-11-2002 11:56 ]
Ik zou trouwens <> gebruiken ipv >. Of nog liever isempty(). Daarnaast wordt het zo breed vanwege steeds het weekrapport noemen, dus
1
2
3
4
5
6
7
8
9
10
11
12
| Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) With Sheets("Weekrapport") If IsEmpty(.Range("C11").Value) And IsEmpty(.Range("E11").Value) And IsEmpty(.Range("G11").Value) Then Exit Sub ElseIf Not IsEmpty(.Range("C11").Value) And Not IsEmpty(.Range("E11").Value) And Not IsEmpty(.Range("G11").Value) Then Exit Sub Else Cancel = True MsgBox "Vul aub alle codes in. Als je er niet uit komt mail of bel Miel Claessens" End If End With End Sub |
je kan trouwens deze layout krijgen door de code tussen [ code] en [ /code] te zetten (zonder de spaties dan).
[ Voor 30% gewijzigd door F_J_K op 27-11-2002 12:11 . Reden: weekrapport ]
'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)
Is er een macro die elke keer als je het bestand opent die cellen leeg gooit? Want dit weekrapport moet men elke week inleveren en als ze het dus 1 keer verkeerd saven (of met een spatie) dan werkt mijn leuke macro dus niet meer...
EDIT: ik had zelf iets verkeerd gedaan.
Hoe kan ik nu loopen dat hij dit voor 10 regels doet (dus C11, C12 etc)..
En kun je ervoor zorgen dat mensen er dus geen macro in te zien krijgen (Dus soort van als vertrouwensmacro op laten nemen?)
[ Voor 30% gewijzigd door miel op 27-11-2002 12:52 ]
Verwijderd
En de macro werkt nu.
Ik snap inderdaad niet veel van Visual Basic maar hersens heb ik nog wel..maar dat doet er niet toe.
Ik snap ook dat er manieren zijn om virussen in macros te stoppen en dat daarom de beveiliging niet of nauwelijks is uit te schakelen. Maar er moet toch iets te verzinnen zijn of niet?
Verwijderd
Kun je me nog op weg helpen met die loop? Want een range invullen werkt niet (kan wel GOTO invullen)
Verwijderd
Een simpele en ook begrijpelijke manier voor de loop is bijvoorbeeld (en ongetwijfeld dat ik nu gecorrigeerd ga worden dat dit niet dè manier is):
1
2
3
4
5
6
7
8
9
10
11
| dim startrange as single
dim endrange single
start = 1
endrange = 8
For i = startrange to endrange
With Sheets("Weekrapport")
->de bestaande check op de range. Bijvoorbeeld: .range("A" & i).Value
end with
Next i |
[ Voor 6% gewijzigd door Verwijderd op 27-11-2002 13:44 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim startrange As Single
Dim endrange As Single
Start = 13
endrange = 28
For x = startrange To endrange
If Sheets("Weekrapport").Range("C" & x).Value = "" And Sheets("Weekrapport").Range("E" & x).Value = "" And Sheets("Weekrapport").Range("G" & x).Value = "" Then
Exit Sub
ElseIf Sheets("Weekrapport").Range("C" & x).Value > "" And Sheets("Weekrapport").Range("E" & x).Value > "" And Sheets("Weekrapport").Range("G" & x).Value > "" Then
Next x
Exit Sub
Else
Cancel = True
MsgBox "Vul aub alle codes in. Als je er niet uit komt mail of bel Miel Claessens"
End If
End Sub |
maar hij geeft een error bij die Next x want hij zegt dat er een For bij moet...maar die zit er toch al in? (Sorry voor de lay-out vern**king)
[ Voor 108% gewijzigd door miel op 27-11-2002 15:41 ]
Verwijderd
Verwijderd
Wat je wilt doen:
Voor iedere waarde in het bereik van X tot Y doe je dit:
1
2
3
4
5
6
7
8
| Als cel-(waarde van x) + andere check waar is
actie
Anders als...
actie
anders
actie
einde van de als-check
Next -> Doe ditzelfde voor de volgende x, net zolang tot y is bereikt |
Dit betekent in jouw geval, dat voor ieder van de acht regels wordt gecontroleerd of het correct is. Als dat niet het geval is: cancel = true.
De exit sub mag nu trouwens niet in de loop voorkomen. Want, als voor bijvoorbeeld de eerste regel alles correct is, exit je de sub, dus ga je akkoord met het opslaan. En dat was niet de bedoeling. Wat je dus moet doen is het per regel bijhouden.
Bijvoorbeeld
Als een ongeldige waarde voorkomt (die ifs ken je): magniet = magniet + 1.
Dan kun je na de for-lus kijken of magniet > 0. Zo ja, cancel=true, anders niets aan de hand.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim startrange As Single
Dim endrange As Single
Start = 13
endrange = 28
For x = startrange To endrange
fout = 0
If Sheets("Weekrapport").Range("C" & x).Value = "" And Sheets("Weekrapport").Range("E" & x).Value = "" And Sheets("Weekrapport").Range("G" & x).Value = "" Then
fout = fout + 1
ElseIf Sheets("Weekrapport").Range("C" & x).Value > "" And Sheets("Weekrapport").Range("E" & x).Value > "" And Sheets("Weekrapport").Range("G" & x).Value > "" Then
fout = fout + 1
End If
Next x
If fout > 0 Then
Cancel = True
MsgBox "Vul aub alle codes in. Als je er niet uit komt mail of bel Miel Claessens"
End If
End Sub |
volgens mij is er iets mis in de notatie van de range..... kan dat?
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| Option Explicit Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 'Declareer variabelen Dim startrange As Single Dim endrange As Single Dim ongeldig As Single Dim x As Single 'geef variabelen hun waarde startrange = 13 endrange = 28 ongeldig = 0 For x = startrange To endrange With Sheets("Weekrapport") 'Eerst controleren of ze niet alle drie leeg zijn, want dat is toegestaan If Not (.Range("C" & x).Value = "" And .Range("E" & x).Value = "" And .Range("G" & x).Value = "") Then If .Range("C" & x).Value = "" Or .Range("E" & x).Value = "" Or .Range("G" & x).Value = "" Then ongeldig = ongeldig + 1 End If End If End With Next x 'Controle of alles akkoord is If ongeldig > 0 Then Cancel = True MsgBox "Vul aub alle codes in. Als je er niet uit komt mail of bel Miel Claessens" End If 'en anders... doen we helemaal niets... End Sub |
Zoek de verschillen en vraag alsjeblieft wat niet duidelijk is. Anders heb je er nog niet veel aan.
[ Voor 12% gewijzigd door Verwijderd op 27-11-2002 16:38 ]
Verwijderd
==> Code aangepast. Nu klopt het wel.
[ Voor 27% gewijzigd door Verwijderd op 27-11-2002 16:38 ]
Ik laat in een aparte kolom via Valideren mensen kiezen uit een menu. Aan de hand van wat er ingevuld wordt in die kolom (dus gekozen via dat pulldown menu) kijken de kolommen waar de code 1, 2 en 3 in moeten komen via Verticaal Zoeken welke code hierbij hoort.
(Bijvoobeeld als mensen Administratie kiezen dan vult de cel automatisch 90 bij code 1 in, 9005 bij code 2 en 90051 bij code 3).....
Echter de macro geeft dan aan dat er dus cellen leeg zijn.....
hoe kan ik dit opvangen/veranderen???
(FizGig==> mail mij even dan stuur ik je de file even op! wel zo makkelijk!(mijn mail is miel@kebab.nl)
[ Voor 9% gewijzigd door miel op 10-12-2002 09:56 ]