08. august 2006 - 20:26Der 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
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"..
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
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
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
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.
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".
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..
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.
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
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
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.