Avatar billede micaud Mester
08. august 2006 - 20:26 Der er 20 kommentarer og
1 løsning

Checkbox optimering

Jeg har 17 checkbokse.

Jeg vil gerne køre et farveskifte på alle checkbokse afhængig af true/false.

Min sub kan ses nedenstående, men kan den ikke laves nemmere, så jeg ikke skal gentage den 17 gange og skifte checbox nummer 102 gange (6 gange i hver sub). Evt. med en for i to ..... eller hvordan kan jeg definere en variabel, så jeg kun skal skrive checkbox nr. én gang pr. checkbox.

Sub farve()

If CheckBox1 = True Then
CheckBox1.ForeColor = RGB(0, 0, 205)
CheckBox1.Font.Bold = True
CheckBox1.Font = "times new roman"
Else
CheckBox1.ForeColor = RGB(135, 206, 235)
CheckBox1.Font.Bold = False
End If

End Sub

Håber I forstår :-)
Avatar billede thesurfer Nybegynder
08. august 2006 - 21:07 #1
Dim farveid As String
Dim fed As Boolean
Dim skrifttype As String

If CheckBox1.Value = Checked Then
    farveid = RGB(0, 0, 205)
    fed = True
    skrifttype = "times new roman"
Else
    farveid = RGB(135, 206, 235)
    fed = False
    skrifttype = ""
End If

For Each ctr In Me.Controls
    If TypeOf ctr Is CheckBox Then
        ctr.ForeColor = farveid
        ctr.Font.Bold = fed
        ctr.Font = skrifttype
    End If
Next

- Håber at det er godt nok.. ellers må du sige til.. :-)

PS: Man kan også udelukke visse checkboxe, hvis det skulle være..
Avatar billede micaud Mester
08. august 2006 - 22:22 #2
Det virker desværre ikke. Det hele kører ikke i et modul men under arket selv.

Min endelige sub ser således ud og virker, men fylder jo en krig:

Sub farve()

If CheckBox1 = True Then
CheckBox1.ForeColor = RGB(0, 0, 205)
CheckBox1.Font.Bold = True
CheckBox1.Font = "times new roman"
Else
CheckBox1.ForeColor = RGB(135, 206, 235)
CheckBox1.Font.Bold = False
End If

If CheckBox2 = True Then
CheckBox2.ForeColor = RGB(0, 0, 205)
CheckBox2.Font.Bold = True
CheckBox2.Font = "times new roman"
Else
CheckBox2.ForeColor = RGB(135, 206, 235)
CheckBox2.Font.Bold = False
End If

If CheckBox3 = True Then
CheckBox3.ForeColor = RGB(0, 0, 205)
CheckBox3.Font.Bold = True
CheckBox3.Font = "times new roman"
Else
CheckBox3.ForeColor = RGB(135, 206, 235)
CheckBox3.Font.Bold = False
End If

If CheckBox4 = True Then
CheckBox4.ForeColor = RGB(0, 0, 205)
CheckBox4.Font.Bold = True
CheckBox4.Font = "times new roman"
Else
CheckBox4.ForeColor = RGB(135, 206, 235)
CheckBox4.Font.Bold = False
End If

If CheckBox5 = True Then
CheckBox5.ForeColor = RGB(0, 0, 205)
CheckBox5.Font.Bold = True
CheckBox5.Font = "times new roman"
Else
CheckBox5.ForeColor = RGB(135, 206, 235)
CheckBox5.Font.Bold = False
End If

If CheckBox6 = True Then
CheckBox6.ForeColor = RGB(0, 0, 205)
CheckBox6.Font.Bold = True
CheckBox6.Font = "times new roman"
Else
CheckBox6.ForeColor = RGB(135, 206, 235)
CheckBox6.Font.Bold = False
End If

If CheckBox7 = True Then
CheckBox7.ForeColor = RGB(0, 0, 205)
CheckBox7.Font.Bold = True
CheckBox7.Font = "times new roman"
Else
CheckBox7.ForeColor = RGB(135, 206, 235)
CheckBox7.Font.Bold = False
End If

If CheckBox8 = True Then
CheckBox8.ForeColor = RGB(0, 0, 205)
CheckBox8.Font.Bold = True
CheckBox8.Font = "times new roman"
Else
CheckBox8.ForeColor = RGB(135, 206, 235)
CheckBox8.Font.Bold = False
End If

If CheckBox9 = True Then
CheckBox9.ForeColor = RGB(0, 0, 205)
CheckBox9.Font.Bold = True
CheckBox9.Font = "times new roman"
Else
CheckBox9.ForeColor = RGB(135, 206, 235)
CheckBox9.Font.Bold = False
End If

If CheckBox10 = True Then
CheckBox10.ForeColor = RGB(0, 0, 205)
CheckBox10.Font.Bold = True
CheckBox10.Font = "times new roman"
Else
CheckBox10.ForeColor = RGB(135, 206, 235)
CheckBox10.Font.Bold = False
End If

If CheckBox11 = True Then
CheckBox11.ForeColor = RGB(0, 0, 205)
CheckBox11.Font.Bold = True
CheckBox11.Font = "times new roman"
Else
CheckBox11.ForeColor = RGB(135, 206, 235)
CheckBox11.Font.Bold = False
End If

If CheckBox12 = True Then
CheckBox12.ForeColor = RGB(0, 0, 205)
CheckBox12.Font.Bold = True
CheckBox12.Font = "times new roman"
Else
CheckBox12.ForeColor = RGB(135, 206, 235)
CheckBox12.Font.Bold = False
End If

If CheckBox13 = True Then
CheckBox13.ForeColor = RGB(0, 0, 205)
CheckBox13.Font.Bold = True
CheckBox13.Font = "times new roman"
Else
CheckBox13.ForeColor = RGB(135, 206, 235)
CheckBox13.Font.Bold = False
End If

If CheckBox14 = True Then
CheckBox14.ForeColor = RGB(0, 0, 205)
CheckBox14.Font.Bold = True
CheckBox14.Font = "times new roman"
Else
CheckBox14.ForeColor = RGB(135, 206, 235)
CheckBox14.Font.Bold = False
End If

If CheckBox15 = True Then
CheckBox15.ForeColor = RGB(0, 0, 205)
CheckBox15.Font.Bold = True
CheckBox15.Font = "times new roman"
Else
CheckBox15.ForeColor = RGB(135, 206, 235)
CheckBox15.Font.Bold = False
End If

If CheckBox16 = True Then
CheckBox16.ForeColor = RGB(0, 0, 205)
CheckBox16.Font.Bold = True
CheckBox16.Font = "times new roman"
Else
CheckBox16.ForeColor = RGB(135, 206, 235)
CheckBox16.Font.Bold = False
End If

If CheckBox17 = True Then
CheckBox17.ForeColor = RGB(0, 0, 205)
CheckBox17.Font.Bold = True
CheckBox17.Font = "times new roman"
Else
CheckBox17.ForeColor = RGB(135, 206, 235)
CheckBox17.Font.Bold = False
End If

If OptionButton1 = True Then
OptionButton1.ForeColor = RGB(0, 0, 205)
OptionButton1.Font.Bold = True
OptionButton1.Font = "times new roman"
Else
OptionButton1.ForeColor = RGB(135, 206, 235)
OptionButton1.Font.Bold = False
End If

If OptionButton2 = True Then
OptionButton2.ForeColor = RGB(0, 0, 205)
OptionButton2.Font.Bold = True
OptionButton2.Font = "times new roman"
Else
OptionButton2.ForeColor = RGB(135, 206, 235)
OptionButton2.Font.Bold = False
End If

If OptionButton3 = True Then
OptionButton3.ForeColor = RGB(0, 0, 205)
OptionButton3.Font.Bold = True
OptionButton3.Font = "times new roman"
Else
OptionButton3.ForeColor = RGB(135, 206, 235)
OptionButton3.Font.Bold = False
End If

If OptionButton4 = True Then
OptionButton4.ForeColor = RGB(0, 0, 205)
OptionButton4.Font.Bold = True
OptionButton4.Font = "times new roman"
Else
OptionButton4.ForeColor = RGB(135, 206, 235)
OptionButton4.Font.Bold = False
End If

If OptionButton5 = True Then
OptionButton5.ForeColor = RGB(0, 0, 205)
OptionButton5.Font.Bold = True
OptionButton5.Font = "times new roman"
Else
OptionButton5.ForeColor = RGB(135, 206, 235)
OptionButton5.Font.Bold = False
End If

If OptionButton6 = True Then
OptionButton6.ForeColor = RGB(0, 0, 205)
OptionButton6.Font.Bold = True
OptionButton6.Font = "times new roman"
Else
OptionButton6.ForeColor = RGB(135, 206, 235)
OptionButton6.Font.Bold = False
End If

If OptionButton7 = True Then
OptionButton7.ForeColor = RGB(0, 0, 205)
OptionButton7.Font.Bold = True
OptionButton7.Font = "times new roman"
Else
OptionButton7.ForeColor = RGB(135, 206, 235)
OptionButton7.Font.Bold = False
End If

If OptionButton8 = True Then
OptionButton8.ForeColor = RGB(0, 0, 205)
OptionButton8.Font.Bold = True
OptionButton8.Font = "times new roman"
Else
OptionButton8.ForeColor = RGB(135, 206, 235)
OptionButton8.Font.Bold = False
End If

If OptionButton9 = True Then
OptionButton9.ForeColor = RGB(0, 0, 205)
OptionButton9.Font.Bold = True
OptionButton9.Font = "times new roman"
Else
OptionButton9.ForeColor = RGB(135, 206, 235)
OptionButton9.Font.Bold = False
End If

End Sub

Jeg vil blot have checkboxen til at ændre farve, hvis den er checked eller ikke-checked.

Checkboksen kører ikke i en formular, men blot som et kontrolelement i arket.
Avatar billede thesurfer Nybegynder
08. august 2006 - 22:31 #3
Ahhh... jeg troede at vis "CheckBox1" var checked, så skulle de alle skifte.. :-)
My bad..

Jeg ser om jeg kan nå at kigge på det igen, lidt senere i aften.. ellers bliver det imorgen..
Avatar billede thesurfer Nybegynder
08. august 2006 - 23:21 #4
Sådan?:

Sub farve()

Dim farveid As String
Dim fed As Boolean
Dim skrifttype As String
Dim ctr As Control

For Each ctr In Me.Controls
    If TypeOf ctr Is CheckBox Then
        If ctr.Value = Checked Then
            ctr.ForeColor = RGB(0, 0, 205)
            ctr.Font.Bold = True
            ctr.Font = "times new roman"
        Else
            ctr.ForeColor = RGB(135, 206, 235)
            ctr.Font.Bold = False
        End If
    End If
Next
End Sub

Jeg ved ikke lige, hvad der skal ske med OptionButtons, da de jo ikke kan "slåes fra" som en checkbox.. der er jo mindst 1 OptionButton der skal være markeret, hvis du allerde har "slået en til"..
Avatar billede thesurfer Nybegynder
08. august 2006 - 23:33 #5
"Det hele kører ikke i et modul men under arket selv"?
Dvs, det er VBA og ikke VB?

Hmm.. så skal man vist lave nogle ændringer i referencerne til controlsne..

Jeg har ikkr prøvet at programmere i VBA før.. men har dog Office pakken installeret..

- I hvilket program er dine controls?
- Hvordan skriver du kode/er det i en editor?
- Andet der kan være nyttigt?

Hvis du kan svare på de spørgsmål, er jeg næsten sikker på at jeg kan lave koden om til VBA..
Avatar billede sjh Nybegynder
09. august 2006 - 06:51 #6
Private Sub CommandButton1_Click()
Dim objCtr As Object
  For Each objCtr In Me.Controls
    If TypeName(objCtr) = "CheckBox" Then ' <- TypeOf ctr Is CheckBox virker åbenbart ikke på samme måde som i vb
      If Abs(objCtr.Value) = 1 Then          ' <- CheckBoxX.Value er 0 eller -1 i vba derfor Abs()
        objCtr.ForeColor = RGB(0, 0, 205)
        objCtr.Font.Bold = True
      Else
        objCtr.ForeColor = RGB(135, 206, 235)
        objCtr.Font.Bold = False
      End If
    End If
  Next
End Sub
Avatar billede sjh Nybegynder
09. august 2006 - 06:58 #7
fik lige se du også bruger en OptionButton..

Private Sub CommandButton1_Click()
Dim objCtr As Object
  For Each objCtr In Me.Controls
    If TypeName(objCtr) = "CheckBox" Or _
      TypeName(objCtr) = "OptionButton" Then ' <- TypeOf ctr Is CheckBox virker åbenbart ikke på samme måde som i vb
      If Abs(objCtr.Value) = 1 Then          ' <- CheckBoxX.Value er 0 eller -1 i vba derfor Abs()
        objCtr.ForeColor = RGB(0, 0, 205)
        objCtr.Font.Bold = True
      Else
        objCtr.ForeColor = RGB(135, 206, 235)
        objCtr.Font.Bold = False
      End If
    End If
  Next
End Sub
Avatar billede sjh Nybegynder
09. august 2006 - 07:02 #8
ha ha.. man kan jo også bare bruge en Boolean ved .Value så behøver vi ikke Abs

Private Sub CommandButton1_Click()
Dim objCtr As Object
  For Each objCtr In Me.Controls
    If TypeName(objCtr) = "CheckBox" Or _
      TypeName(objCtr) = "OptionButton" Then
      If objCtr.Value = True Then
        objCtr.ForeColor = RGB(0, 0, 205)
        objCtr.Font.Bold = True
      Else
        objCtr.ForeColor = RGB(135, 206, 235)
        objCtr.Font.Bold = False
      End If
    End If
  Next
End Sub
Avatar billede micaud Mester
09. august 2006 - 23:36 #9
Jeg tror ikke, at jeg har forklaret mig ordentligt, for det virker stadig ikke. Jeg har et regneark, hvori jeg har indsat kontrolelementer direkte i regnearket. 17 checkboxe og 9 optionsbuttons. I visual basic definer jeg makroen sub farve() som vist ovenfor.

Alle checkboxe og optionsbuttons ligger som private sub under selve arket og ikke i et modul. Altså 17 stk. Private Sub CheckBoxXX_Click() og 9 stk. Private Sub OptionButtonX_Click().

Når en checkbox markeres skal den og nogle andre have én farve og andre en anden farve. Optionsbutton: Der skal den valgte knap have én farve og resten en anden farve.

Se gerne min makro ovenfor som virker, men jo fylder meget og sikkert ikke optimal.

Jeg har prøvet sjh´s løsning men får en fejl "Compile error: Method or data member not found" hvilket sker i 3. linie ".Controls" (ME bruges det ikke kun i formular ?? hvilket jeg ikke bruger)

Håber I kan lære mig lidt optimering i mine makroer.
Avatar billede thesurfer Nybegynder
09. august 2006 - 23:49 #10
Ok.. så var dit spørgsmål elendigt formuleret :-)

Bruger du "UserForm"?

Tag lige et screenshot af dit regneark, og hvad du finder nødvendigt, for at vi kan se hvad du mener..
Avatar billede micaud Mester
09. august 2006 - 23:56 #11
Øhhhhh hvordan får jeg lige en screenshot ind her ???
Avatar billede micaud Mester
10. august 2006 - 00:06 #12
Jeg viser blot værktøjslinien "Kontrolelementer" i Excel og indsætter "afkrydsningsfelter (checkbox)"og "Alternativknapper (optionsbutton)" Jeg kunne sikkert bruge en "userform", men det har jeg altså ikke gjort.

Knapperne er indsat direkte i regnearket via værktøjslinien "Kontrolelementer".
Avatar billede thesurfer Nybegynder
10. august 2006 - 00:08 #13
Det kan du ikke.. men du kan uploade billedet et andet sted, og linke til det..

Eksempel: http://www.putfile.com/
Avatar billede thesurfer Nybegynder
10. august 2006 - 00:10 #14
Et par ting du skal være opmærksom på:

1) Filtyper der accepteres på putfile.com er ".jpg, .jpeg .gif, .png", max størrelse er 2 mb per fil

2) Filerne kommer til at ligge på offentligt område, så du skal lige fjerne følsomme oplysninger..

Jeg mener at du får et link til dig billede, efter at du uploader billedet.
Avatar billede micaud Mester
10. august 2006 - 00:27 #15
Så skulle I kunne se et screenshot af det:

http://putfile.com/pic.php?pic=main/8/22018210434.jpg&s=f10
Avatar billede sjh Nybegynder
10. august 2006 - 05:30 #16
Ja nu er jeg stået af.. men hvis thesurfer ikke kan hjælpe kan du prøve at flytte dit spørgsmål til : Regneark : http://www.eksperten.dk/spm/Programmer/Regneark/ de må også vide lidt om vba.. du kan eventuel ref her til..

men vent lige og høre om thesurfer kan klare det..
Avatar billede thesurfer Nybegynder
10. august 2006 - 18:19 #17
Jeg kigger stadig på det..

Jeg har fundet en siden der bruger ligende kode, men det er UserForm, hvilket ikke passer ind i micauds design: http://www.vbforums.com/archive/index.php/t-275864.html

Jeg ser om jeg kan finde noget kode man kan bruge, uden UserForm..
Avatar billede micaud Mester
10. august 2006 - 19:33 #18
Mhhh troede det var mere simpelt, men det forklare jo også, hvorfor jeg ikke selv kan :-)

Jeg troede for det første at man kunne definere checkbox1 som en variabel, således jeg kun skulle henvise til den én gang pr. checkbox i makroen. For det andet troede jeg at man kunne lave en for i to ..... next, således makroen kørte fra checkbox1 til 17.... men men men jeg er spændt på at se noget fra thesurfer.
Avatar billede thesurfer Nybegynder
10. august 2006 - 19:38 #19
Husk at lukke dette spørgsmål, da du ellers har 2 ens åbne spørgsmål, hvilket ikke er tilladt jvf Ekspertens regler: http://www.eksperten.dk/regler.phtml
Avatar billede micaud Mester
10. august 2006 - 19:48 #20
Ja selvfølgelig, håber så at du svarer/hjælper på den anden..... LUKKET
Avatar billede sjh Nybegynder
10. august 2006 - 21:26 #21
Hvis du ikke har fundet en løsning så er den her..

Private Sub CommandButton1_Click()
Dim obj As Object
  For Each obj In OLEObjects
    If TypeName(obj.Object) = "CheckBox" Or _
      TypeName(obj.Object) = "OptionButton" Then
      With obj.Object
          If .Value = True Then
            .ForeColor = RGB(0, 0, 205)
            .Font.Bold = True
          Else
            .ForeColor = RGB(135, 206, 235)
            .Font.Bold = False
          End If
      End With
    End If
  Next
End Sub
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