23. november 2008 - 10:00Der er
7 kommentarer og 1 løsning
Kontrol af alle controls
Jeg har en vba-form med *mange* tekstbokse, så det er en smule svært at overskue det hele. Derfor vil jeg gerne have, at den aktive tekstboks markeres med gul, mens de øvrige er røde.
Jeg tænker på noget i denne stil:
Dim ctrl As Control For Each ctrl in Controls If ctrl.Name = ActiveControl.Name Then ctrl.BackColor = vbYellow Else ctrl.BackColor = vbWhite End If Next ctrl
Jeg kunne selvfølgelig knytte et call til hver enkelt tekstboks, men jeg ville hellere gøre det på et overordnet niveau. Er der nogen, der har ideer? Jeg kan ikke få det til at virke med Userform_keypress eller lignende.
Nå, ctrl.Name = ActiveControl.Name virker ikke, når tekstboksene er indlejret i Frames. Så er ActiveControl.Name = [navnet på Frame].
Men jeg vil stadig gerne høre, om der er nogen, der har en løsning på problemet. Jeg skulle måske lige nævne, at jeg programmerer i VBA til Office2003, hvilket svarer til VB6.
Hvis der er nogen, der kan lave en kode, giver jeg gerne 200 points ekstra for det.
du bliver nok nødt til at kode under hver tekstboks
Private Sub TextBox1_Enter() TextBox1.BackColor = vbYellow TextBox2.BackColor = vbWhite TextBox3.BackColor = vbWhite End Sub
Private Sub TextBox2_Enter() TextBox1.BackColor = vbWhite TextBox2.BackColor = vbYellow TextBox3.BackColor = vbWhite End Sub Private Sub TextBox3_Enter() TextBox1.BackColor = vbWhite TextBox2.BackColor = vbWhite TextBox3.BackColor = vbYellow End Sub
Private Sub FocusColor(fokus As Control) For Each ctrl In Controls If TypeOf ctrl Is TextBox Or TypeOf ctrl Is ComboBox Or TypeOf ctrl Is CheckBox Then If ctrl.Name = fokus.Name Then ctrl.BackColor = RGB(255, 255, 153) Else ctrl.BackColor = vbWhite End If End If Next ctrl End Sub
Private Sub txtAfsenderNavn_Enter() Call FocusColor(txtAfsenderNavn) End Sub
Der er så mange tekstbokse, at det er uholdbart at definere for hver enkelt, hvilken farve den skal have.
Men det burde nu alligevel være muligt at tjekke uden at definere for hver tekstboks.
Langt henad vejen meget enig med jer begge to, men :-), der er en workaround - med indbyggede øv!'ere.
Application.OnTime kombineret med vbModeLess kan få den effekt, jeg tror at du gerne vil have, men med indbygget øv! :-)
Jeg har strikket et lille eksempel sammen, for at køre det skal du bruge Word (2003), en UserForm1 med flg.: TextBox1 og TextBox2 Frame1 med TextBox3 og TextBox4 Frame2 med TextBox5 og TextBox6
(Frames er med aht. din kommentar d. 23/11-2008 kl. 17:03:04)
Der skal ikke være noget kode i UserForm1.
Opret et Module1 Paste flg. kode ind: Option Explicit
Private Sub UpdateColors() Dim ctrlTemp As Control Dim sActCtrlName As String
Select Case TypeName(UserForm1.ActiveControl) Case "Frame" sActCtrlName = UserForm1.Controls(UserForm1.ActiveControl.Name).ActiveControl.Name Case "TextBox" sActCtrlName = UserForm1.ActiveControl.Name End Select
For Each ctrlTemp In UserForm1.Controls If TypeName(ctrlTemp) = "TextBox" Then If ctrlTemp.Name <> sActCtrlName Then ctrlTemp.BackColor = vbRed Else ctrlTemp.BackColor = vbYellow End If End If Next End Sub Public Sub RunLoop() If UserForm1.Visible Then UpdateColors Application.OnTime when:=Now + TimeValue("00:00:00"), Name:="RunLoop", Tolerance:=0 End If End Sub
Public Sub Start() UserForm1.Show vbModeless RunLoop End Sub
Håber at det er i nærheden af det du efterlyste :-) - under alle omstændigheder er det en funktionalitet som jeg kan finde anvendelse for andre steder :-)
Enig - ikke helt god. Ville også gerne se/have en bedre løsning på problemet :-)
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.