Avatar billede Claus Mester
17. august 2007 - 13:56 Der er 8 kommentarer og
1 løsning

VBA kontroller felter på Userform

Har en Userform med ca. 20 kontroller. 6 af disse kontroller (3 combos og 3 txt) skal valideres for indhold. Er de blanke, skal kontrollen "Label1" vise indholdet af en variabel samt teksten "er obligatorisk" og standse udførelsen af yderligere kode samt sætte fokus på den relevante kontrol.

Variablen der skal vises i Label1 sammen med teksten, skal identificere den specifikke kontrol. Så hvis det feks er "txt1" der er blank, skal Label1 vise teksten "txt1 er obligatorisk".

En krølle kunne være, at knytte et navn til kontrollen, så feks txt1 bliver vist som "Navn".

Såldes, hvis txt1 er blank ville Label1 vise:

Navn er obligatorisk.

Nogen ideer?

På forhånd tak.
nicolaus
Avatar billede word-hajen Nybegynder
17. august 2007 - 16:39 #1
Et forslag:

Lad os sige, at den ene textboks er navngivet txtName. Så har du formentlig en OK-knap til udførelse af kode, når brugeren er klar med sine valg/indtastninger. Brug således følgende i starten af din OK-procedure:

If me.txtName = "" then
    msgbox "Udfyld venligst navn.", vbExclamation, "Udfyld navn"
    me.txtName.setFocus
    Exit Sub
end if

Proceduren bliver således stoppet og markøren står i den tekstboks, der mangler at blive udfyldt.
Avatar billede word-hajen Nybegynder
17. august 2007 - 17:09 #2
Du har en procedure (ClearFelter) på Activate-eventet på din form, som clearer dine tekstbokse og dermed også datoen. Activate kommer efter Initialize-eventet. Hvad er årsagen til, at du clearer tekstboksene? Du unloader vel din form på et eller andet tidspunkt?
Avatar billede word-hajen Nybegynder
17. august 2007 - 17:12 #3
Gab - sad og sov. Glem min kommentar af 17:09:09 - det er et indlæg til en anden tråd.
Avatar billede Claus Mester
18. august 2007 - 10:47 #4
Med IF sætningen skal jeg på den måde oprette 6 IF sætninger, for at gennemgå alle de kontroller der er obligatoriske, for om de er blanke. Det er den løsning jeg faktisk bruger nu. Men tænkte det var muligt at smide det ind i en "For each ctrl in userform.controls" og så tjekke om det er en tekstboks elle combobox. Hvis det er det, skal der tjekkes om det er et af de obligatoriske felter og hvis det er, skal Label1 vise en meddelelse.

Men ikke nok med det. Funktionen der skriver Label1 meddelelsen, skal samtidig tjekke hvilken kontrol der er blank og automatisk indsætte et tilknyttet navn.

Det er svært at forklare, men måske den her illustration hjælper lidt:

Txtbox1, Txtbox2 og Combobox1 er obligatoriske, ud af 6 andre txtboxe og comboboxe.

Txtbox1 indeholder en dato, txtbox2 indeholder et beløb og combobox indeholder "ja" og "nej".

Hvis proceduren automatiseres, og funktionen der skriver Label1s medd. trækker navnet på den aktive kontrol der er blank, vil navnet jo blive fx "Txtbox1 er et obligatorisk felt". Ikke særligt sigende. Så derfor ville jeg knytte et mere sigende navn til Txtbox1, fx. "Datoen er et obligatorisk felt".

Måske man kunne opnå det resultat med et flerdimensionelt array i stil med:

Dim myArray(6,6) as string
myArray(1,1) = "Txtbox1, Datoen"

I en For each løkke eller tilsvarende tjekkes der for hvilken kontrol der er blank, i henhold til arrayets dimension 1. Derefter henter den navnet i dimension 2 og viser det i Label1.

Kan du følge mig?
Avatar billede word-hajen Nybegynder
18. august 2007 - 11:56 #5
Du har faktisk flere muligheder, men at lave et flerdimensionelt array er at skyde gråspurve med kanoner.

1. Lav en procedure, der løber alle kontroller på formen igennem. Tjek for typen. Hvis det er en tekstboks eller en combobox, og den ikke er udfyldt/foretaget valg, smider du smider du en meddelelse i luften (jeg ville ikke bruge din labelløsning). Brug f.eks. kontrollens tag til at angive hvad der skal stå ud over er et obligatorisk felt (me.control.tag & " er et obligatorisk felt.".

2. Lav en simpel funktion, hvor du smider kontrollen ned i (se dit spørgsmål andetsteds), får tjekket det, der skal tjekkes og returnér hhv. true/false. På den måde kan du afbryde din "hoved-procedure".

I øvrigt - når jeg læser ovenstående, er det så rigtigt forstået, at du har tekstbokse/combobokse, som ikke nødvendigvis skal være udfyldt/valgt? For i så fald ville jeg benytte løsning 2 og kun smide de kontroller ned i funktionen, som faktisk skal tjekkes.
Avatar billede word-hajen Nybegynder
02. september 2007 - 20:19 #6
Hvordan går det her?
Avatar billede Claus Mester
02. september 2007 - 21:11 #7
Der er for få timer i døgnet. Men kigger snarest på det. Iøvrigt, ja. Der er et par bokse der ikke er obligatoriske.
Avatar billede Claus Mester
04. september 2007 - 08:50 #8
Så fik jeg tid til at kigge på det.

Jeg har taget din løsning nr. 1, af 18/8 kl. 11:56, til mig. Lettere redigeret. Fungerer fint. Tak for hjælpen :)
Avatar billede word-hajen Nybegynder
04. september 2007 - 11:06 #9
Velbekomme. Godt at høre, at det fungerer for dig/din kode.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester