05. september 2013 - 09:23Der er
8 kommentarer og 1 løsning
Find navn på et felt ved hjælp af TabIndex
Jeg er ude efter et stykke kode som kan give mig navnet på det næste felt i en formular ved hjælp af nuværende tabindex.
Bruger koden "Screen.ActiveControl.TabIndex" men jeg vil gerne have navnet på det næste konkrolelement. Er der nogen der evt. har en nem måde at finde det på?
Idéen var at man først fandt indekstallet +1 og derved kunne finde navnet
har f.eks Tab 0 = Afdeling Tab 1 = Team Tab 2 = Kontaktperson
Når Screen.ActiveControl.TabIndex = 1 skal den returnere strengeværdien "Kontaktperson" (ikke værdien af feltet med feltnavnet).
Public Sub NextTab() Dim varTab As Integer
varTab = Screen.ActiveControl.TabIndex
Screen.ActiveControl.Controls(varTab + 1).name 'Denne giver dog ikke det ønskede resultat End Sub
Function NextTab() As String Dim varTab As Integer Dim Ctl As Control Dim Prp As Property
varTab = Screen.ActiveControl.TabIndex
NextTab = "?" For Each Ctl In Screen.ActiveForm.Controls For Each Prp In Ctl.Properties If Prp.Name = "TabIndex" Then If Prp.Value = (varTab + 1) Then NextTab = Ctl.Name End If Next Prp Next Ctl End Function
eller denne løsning: (den løber ikke alle properties igennem) skift debug.print ud med en variabel. (controltype 100 og 101 har ikke tabindex)
Sub NavnPåNæsteControl() Dim D As Integer, E As Integer, K As Integer
K = Me.ActiveControl.TabIndex
For E = 0 To Me.Controls.Count - 1 If Me.Controls(E).ControlType > 101 Then D = Me.Controls(E).TabIndex If D = K + 1 Then Debug.Print Me.Controls(E).TabIndex & ": " & Me.Controls(E).Name Exit For End If End If Next E
He he. Du bad jo bare om navnet på næste felt; men ok.
I alle felternes AfterUpdate lægger du (i stedet for [Hændelsesprocedure]) et kald af en funktion, der ligger i formularens kode, f.eks. "=ÅbnNæsteFelt()"
Function ÅbnNæsteFelt() NextTab End Function
NextTab skal så rettes til:
Sub NextTab() Dim varTab As Integer Dim Ctl As Control Dim Prp As Property
If IsNull(Screen.ActiveControl.Value) Then Exit Sub
varTab = Screen.ActiveControl.TabIndex
For Each Ctl In Screen.ActiveForm.Controls For Each Prp In Ctl.Properties If Prp.Name = "TabIndex" Then If Prp.Value = (varTab + 1) Then Ctl.Enabled = True End If Next Prp Next Ctl End Sub
Jeg tester det først på mandag, men kan din kode også tage højde for, at værdien også kan ændres til "False"? Eller kan jeg bare smide If Nz(nameTab, "") <> "" Then ind så koden kommer til at se sådan ud:
Sub NextTab() Dim varTab As Integer Dim nameTab As string Dim Ctl As Control Dim Prp As Property
If IsNull(Screen.ActiveControl.Value) Then Exit Sub
For Each Ctl In Screen.ActiveForm.Controls For Each Prp In Ctl.Properties If Prp.Name = "TabIndex" Then If Prp.Value = (varTab + 1) Then 'Ctl.Enabled = True If Nz(nameTab, "") <> "" Then Ctl.Enabled = True Else Ctl.Enabled = False End If End If End If Next Prp Next Ctl End Sub
PS: Nu kender jeg jo ikke din opgave; men jeg ser lille udfordring i din seneste kommentar.
Eksempel: - brugeren udfylder de første 3 felter - herefter går han tilbage og sletter indholdet i felt 2 - nu er felt 3 udfyldt; men disabled, og kan ikke rettes før der er skrevet et eller andet i felt 2
Det kan måske forvirre, at man skal udfylde et felt for at rette et andet.
Måske en lille warning (når felt 2 slettes) kunne hjælpe brugeren på rette vej?
Ja, det er også tarveligt at holde hen på den måde. ;)
Jeg takker for dit svar, der er helt sikkert noget jeg kan arbejde videre med. Havde godt tænkt tanten omkring rettelser i tidligere felter og hvad der skulle ske derefter, men tak for kommentaren og her er dine mere end velfortjente point! :)
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.