17. august 2007 - 13:56Der 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".
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.
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?
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.
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.
Velbekomme. Godt at høre, at det fungerer for dig/din kode.
Synes godt om
Ny brugerNybegynder
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.