[excel] Velden verplicht in laten vullen

Pagina: 1
Acties:
  • 7.995 views sinds 30-01-2008
  • Reageer

  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
Ik heb hier een spreadsheet in Excel die medewerkers in moeten vullen. Hier moeten 3 codes op komen te staan.

Veel mensen "vergeten" een of meerdere codes in te vullen. Hoe kan ik (naast het stukje opvoeding) de excel 2000 spreadsheet dusdanig beveiligen dat ze eerst die 3 velden in MOETEN vullen voordat ze hem kunnen saven/opsturen?

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Laat in VBA Workbook_BeforeSave() een check doen of die drie cellen zijn ingevuld. Zet Cancel = True en geef een melding als dit niet het geval is.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
uhh kun je dit in iets simpelere taal uitleggen aub? Ik heb weinig tot geen ervaring met visual basic en macro's

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

U druk op linker-alt in combinatie met functietoets 11.
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:

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 ]


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
die code is me duidelijk........ nu er alleen nog zien te komen..

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 ]

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

Bij ThisWorkbook staat ie er toch echt tussen. Wellicht dat je naar boven moet scrollen in de pull-down-list-drop-down-uitklap-of-hoe-heet-zo'n-ding-boxje?

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:

code:
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 ]


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
mmm wacht even...

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 ]

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

Werkt niet zo goed hè? :)
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 ]


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
ik wil dat hij 8 rijen controleert.

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 ]

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

code:
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 ]


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
Die then na de 1e regel kan die ook weg? Want er hoeft niks te komen als er niks ingevuld staat....

anyhows bedankt en ik ga morgen op het werk wel even puzzelen!!

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

nee die kan niet weg, het is een if-then-else constructie. I.p.v. de msgbox kunt je wel gewoon 'exit sub' gebruiken.

  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
Ik krijg de foutcode: Compileerfout/syntaxisfout

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 ]

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Als je het niet op 1 regel Zet is het al een stuk beter leesbaar en zie je meteen waar het fout gaat ;)
Visual Basic:
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 :Y)

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)


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
dat is waar heb alleen soms het idee dat ik "domme" vragen stel...

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 ]

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Je hebt niet al een spatie oid staan in die cellen? Hier werkt het namelijk goed.

Ik zou trouwens <> gebruiken ipv >. Of nog liever isempty(). Daarnaast wordt het zo breed vanwege steeds het weekrapport noemen, dus
Visual Basic:
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)


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
mm als er dus een spatie in de cellen staat dan werkt het dus niet?

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 ]

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

Uh.. kun je niet beter kiezen voor de andere methode: de mensen opvoeden? :P Je snapt er werkelijk helemaal niets van. Ik adviseer je eerst eens wat ervaring op te doen.

  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
Opvoeden werkt niet..... geloof me.

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?

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

Met deze check die voor het opslaan plaatsvindt ben je al een heel eind. Als je nu nog i.p.v. iedere keer het weekrapport zelf gebruikt een template (sjabloon) inzet, die read-only is, zullen de mensen met een beetje opvoeding keurig iedere week een nieuw bestandje aanmaken.

  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
Dus als ik het goed begrijp van het blad weekrapport een sjabloon maak dat ingelezen wordt dan moeten ze verplicht dit elke week invullen. Goed idee!

Kun je me nog op weg helpen met die loop? Want een range invullen werkt niet (kan wel GOTO invullen)

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

GoTo doen we dus niet, want dat is vies. Altijd. Punt. :)

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):

code:
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 ]


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
ok ik heb nu het volgende:

code:
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 ]

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

Indent je code, en je zult gelijk zien dat er een volgorde fout inzit. Je next na een voorwaarde, zonder dat die is afgesloten (daar exit je de sub zelfs)

  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
moet die next dan buiten de if functie om staan? (jee ik ben echt een n00B op Basic gebied!)

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

Die moet daar inderdaad buiten. Want je evalueert een x-aantal cellen binnen de loop.
Wat je wilt doen:

Voor iedere waarde in het bereik van X tot Y doe je dit:
code:
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.

  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
Ok heb nu het volgende:

code:
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?

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

Dit doet wat je wilt, voor zover ik heb getest.

Visual Basic:
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 ]


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
Het werkt (en ik snap het! Dank u!!!!!)

http://www.pvoutput.org/list.jsp?id=36679&sid=33539


Verwijderd

Weet je zeker dat het werkt...? Bij mij namelijk niet :)

==> Code aangepast. Nu klopt het wel.

[ Voor 27% gewijzigd door Verwijderd op 27-11-2002 16:38 ]


  • miel
  • Registratie: Augustus 2001
  • Laatst online: 22:52
Shit..... heb nu dus een probleem...

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 ]

http://www.pvoutput.org/list.jsp?id=36679&sid=33539

Pagina: 1