Avatar billede l3kris Nybegynder
23. november 2008 - 10:00 Der 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.
Avatar billede l3kris Nybegynder
23. november 2008 - 17:03 #1
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.
Avatar billede kabbak Professor
24. november 2008 - 00:02 #2
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
Avatar billede l3kris Nybegynder
24. november 2008 - 18:09 #3
Det har jeg også gjort:

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.
Avatar billede learningvba Nybegynder
26. november 2008 - 08:14 #4
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 :-)
Avatar billede l3kris Nybegynder
26. november 2008 - 14:07 #5
Det ser spændende ud. Jeg har ikke tid at prøve den lige nu, men vil gøre det en af de nærmeste dage.

Hvad er det for noget øv, jeg skal være forberedt på?
Avatar billede learningvba Nybegynder
01. december 2008 - 07:07 #6
UserForm1.Show vbModeless
Avatar billede l3kris Nybegynder
29. december 2008 - 14:08 #7
Den er ikke helt god, men nok det bedste bud. Hvis du lægger et svar, får du point.
Avatar billede learningvba Nybegynder
05. januar 2009 - 08:08 #8
Enig - ikke helt god. Ville også gerne se/have en bedre løsning på problemet :-)
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