• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

methodes om for each te gebruiken

Status
Niet open voor verdere reacties.

huppelpaard

Gebruiker
Lid geworden
27 mei 2018
Berichten
157
Beetje bij beetje kom ik steeds verder met automatisering en het werkt wel maar het is gewoon niet netjes.

hieronder een voorbeeldje wat mijn code is in een userform
Code:
Private Sub UserForm_Initialize()
    
 
    
    TextBox1.Value = sheets("Hulpblad").Range("ak2")
    TextBox2.Value = sheets("Hulpblad").Range("ak3")
    TextBox3.Value = sheets("Hulpblad").Range("ak4")
    TextBox4.Value = sheets("Hulpblad").Range("ak5")
    TextBox5.Value = sheets("Hulpblad").Range("ak6")
    TextBox6.Value = sheets("Hulpblad").Range("ak7")
    TextBox7.Value = sheets("Hulpblad").Range("ak8")
    TextBox8.Value = sheets("Hulpblad").Range("ak9")
    TextBox9.Value = sheets("Hulpblad").Range("An2")
    TextBox10.Value = sheets("Hulpblad").Range("An3")
    TextBox11.Value = sheets("Hulpblad").Range("An4")
    TextBox12.Value = sheets("Hulpblad").Range("An5")
    TextBox13.Value = sheets("Hulpblad").Range("An6")
    TextBox14.Value = sheets("Hulpblad").Range("An7")
    TextBox15.Value = sheets("Hulpblad").Range("An8")
    TextBox16.Value = sheets("Hulpblad").Range("An9")
    
    ComboBox1.Value = "MINI"
    ComboBox9.Value = "MINI"
    ''Me.ComboBox1.List = Worksheets("HULPBLAD").Range("Type_kabel")
    ''Me.ComboBox1.RowSource = Worksheets("HULPBLAD").Range("Type_kabel").Address(external:=True)
    Me.ComboBox1.RowSource = "Type_kabel"
    Me.ComboBox2.RowSource = "Type_kabel"
    Me.ComboBox3.RowSource = "Type_kabel"
    Me.ComboBox4.RowSource = "Type_kabel"
    Me.ComboBox5.RowSource = "Type_kabel"
    Me.ComboBox6.RowSource = "Type_kabel"
    Me.ComboBox7.RowSource = "Type_kabel"
    Me.ComboBox8.RowSource = "Type_kabel"
    Me.ComboBox9.RowSource = "Type_kabel"
    Me.ComboBox10.RowSource = "Type_kabel"
    Me.ComboBox11.RowSource = "Type_kabel"
    Me.ComboBox12.RowSource = "Type_kabel"
    Me.ComboBox13.RowSource = "Type_kabel"
    Me.ComboBox14.RowSource = "Type_kabel"
    Me.ComboBox15.RowSource = "Type_kabel"
    Me.ComboBox16.RowSource = "Type_kabel"
    
    
    If TextBox1.Value <> "" Then
    ComboBox1.Value = "MINI"
    Else
    ComboBox1.Value = ""
    End If
 
    If TextBox2.Value <> "" Then
    ComboBox2.Value = "MINI"
    Else
    ComboBox2.Value = ""
    End If
        If TextBox3.Value > -1 Then ComboBox3.Value = "MINI"
    If TextBox4.Value > -1 Then ComboBox4.Value = "MINI"
    If TextBox5.Value > -1 Then ComboBox5.Value = "MINI"
    If TextBox6.Value > -1 Then ComboBox6.Value = "MINI"
    If TextBox7.Value > -1 Then ComboBox7.Value = "MINI"
    If TextBox8.Value > -1 Then ComboBox8.Value = "MINI"
    If TextBox9.Value > -1 Then ComboBox9.Value = "MINI"
    If TextBox10.Value > -1 Then ComboBox10.Value = "MINI"
    If TextBox11.Value > -1 Then ComboBox11.Value = "MINI"
    If TextBox12.Value > -1 Then ComboBox12.Value = "MINI"
    If TextBox13.Value > -1 Then ComboBox13.Value = "MINI"
    If TextBox14.Value > -1 Then ComboBox14.Value = "MINI"
    If TextBox15.Value > -1 Then ComboBox15.Value = "MINI"
    If TextBox16.Value > -1 Then ComboBox16.Value = "MINI"


zoals je ziet bij heel veel combo of text boxen moet ik steeds per combo/textbox aanpassen
nu ben ik een beetje aan het googlen en dan kom je ook methodes tegen om for each te gebruiken
echter is mijn kennis onvoldoende daarom hoop ik dat iemand mij op weg wilt helpen met wat uitleg hierover

kan je bovenstaande code korter maken? en hoe werkt dat dan?
hopelijk kan ik weer iets leren van jullie :)

alvast bedankt

Naamloos.png
 
Laatst bewerkt:
kan zeker korter, maar als je een voorbeeldbestand plaatst met het userform erin, dan krijg je de beste oplossingen.

Je moet een beetje in deze richting denken, al zullen er mensen zeggen dat je Rowsource moet vermijden waarschijnlijk.

Code:
Private Sub UserForm_Initialize()
   For i = 1 To 16
        Me.Controls("Combobox" & i).rowsource = "Type_kabel"
   Next
End Sub
 
Laatst bewerkt:
Code:
Private Sub Userform_Initialize()
  sn=sheets("hulpblad").Range("ak2:an9")

  for j=1 to ubound(sn)
    Me("TextBox" & j )=sn(j,1)
    Me("TextBox" & j +8)=sn(j,4)
  next
End Sub

Met een Array zorg je ervoor dat je maar 1 keer iets hoeft te lezen uit het werkblad.
Om diezelfde reden kun je beter geen 'rowsource' gebruiken, maar beter '.List' om een ComboBox of ListBox te vullen.

16 comboboxen met exact dezelfde gegevens lijkt met wat overdreven.
 
Laatst bewerkt:
Bedankt voor jullie antwoorden kan je deze code ook beschrijven ?
nu het voorgekauwd is snap ik redelijk maar hoe is de code opgebouwd en wat doet het?

ik hoop hier weer van te leren en zelf met oplossingen te kunnen komen voor de toekomst

de code van sjonR snap ik redelijk goed al zou ik daar zelf niet op gekomen zijn meer doordat ik nog te weinig kennis heb.
de code van SNB kan ik (nog niet goed begrijpen) hier zit een hele andere tactiek achter.

16 comboboxen vullen met dezelfde waarde is misschien wat overdreven maar wilde 1 standaard hebben voor een berekening

uiteindelijk wil ik meer gaan leren om herhaling te voorkomen dus steeds dezelfde code moeten plakken en aanpassen
zodoende steeds sneller te kunnen werken om je doel te halen.

Hoewel dit voor mij een hobby is maak ik er wel een sport van om het in zo'n kort mogelijke tijd te realiseren.
nu ben ik soms dagen bezig wat bij wijze van in 1 uur kan. dit is meer omdat het net niet lukt en op zoek ga naar oplossingen.

en wie weet kan ik ooit bijdrage leveren aan deze mooie site (al voel ik mij nu nog niet op de juiste plek) :)
 
Laatst bewerkt:
@SNB

Code:
Me("TextBox" & j -1

Dat zou toch Textbox0 opleveren?
 
Laatst bewerkt:
@sjonR

Ja, natuurlijk heb je gelijk. Ik heb het aangepast.
Nadeel van verschillende gedachtesporen volgen tijdens het schrijven.

@hup

Het belangrijkste is de funktietoets F8, stap voor stap door de code.
 
dit

ik gebruik dit

Code:
with f_FindAll
.TextBox1.Value = t_range(1)
 
bedankt voor het advies ik ga er mee stoeien
met F8 gaan de stappen wel 1 voor 1 maar ik zie de userform pas als de code de laatste handeling uitvoert.
of doe ik iets verkeerd
 
Het userform wordt pas getoond als de macro 'Userform_Initialize' is uitgevoerd.
F8 is voor het volgen van wat de code doet.
 
ik ben aan het kijken om ook deze code korter te krijgen
maar tast nog in het duister

kan iemand mij uitleggen hoe je in dit geval moet denken om dan een code te bouwen?

wat ik denk is dat je een begin range moet definiëren (AL32) in combinatie met For i = 1 To 8 maar dat moet je ook doen voor de combobox
ik heb een beetje input nodig om te leren denken dan word het maken ook steeds makkelijker




Code:
Private Sub CommandButton1_Click()


    Sheets("Hulpblad").Range("AL32") = ComboBox1.Value
    Sheets("Hulpblad").Range("AL33") = ComboBox2.Value
    Sheets("Hulpblad").Range("AL34") = ComboBox3.Value
    Sheets("Hulpblad").Range("AL35") = ComboBox4.Value
    Sheets("Hulpblad").Range("AL36") = ComboBox5.Value
    Sheets("Hulpblad").Range("AL37") = ComboBox6.Value
    Sheets("Hulpblad").Range("AL38") = ComboBox7.Value
    Sheets("Hulpblad").Range("AL39") = ComboBox8.Value
    Sheets("Hulpblad").Range("AO32") = ComboBox9.Value
    Sheets("Hulpblad").Range("AO33") = ComboBox10.Value
    Sheets("Hulpblad").Range("AO34") = ComboBox11.Value
    Sheets("Hulpblad").Range("AO35") = ComboBox12.Value
    Sheets("Hulpblad").Range("AO36") = ComboBox13.Value
    Sheets("Hulpblad").Range("AO37") = ComboBox14.Value
    Sheets("Hulpblad").Range("AO38") = ComboBox15.Value
    Sheets("Hulpblad").Range("AO39") = ComboBox16.Value
    Sheets("Hulpblad").Range("Ar32") = ComboBox17.Value
    Sheets("Hulpblad").Range("Ar33") = ComboBox18.Value
    Sheets("Hulpblad").Range("Ar34") = ComboBox19.Value
    Sheets("Hulpblad").Range("Ar35") = ComboBox20.Value
    Sheets("Hulpblad").Range("Ar36") = ComboBox21.Value
    Sheets("Hulpblad").Range("Ar37") = ComboBox22.Value
    Sheets("Hulpblad").Range("Ar38") = ComboBox23.Value
    Sheets("Hulpblad").Range("Ar39") = ComboBox24.Value
    Sheets("Hulpblad").Range("Au32") = ComboBox25.Value
    Sheets("Hulpblad").Range("Au33") = ComboBox26.Value
    Sheets("Hulpblad").Range("Au34") = ComboBox27.Value
    Sheets("Hulpblad").Range("Au35") = ComboBox28.Value
    Sheets("Hulpblad").Range("Au36") = ComboBox29.Value
    Sheets("Hulpblad").Range("Au37") = ComboBox30.Value
    Sheets("Hulpblad").Range("Au38") = ComboBox31.Value
    Sheets("Hulpblad").Range("Au39") = ComboBox32.Value
    Unload Me
End Sub
 
iedere mogelijke variant op
Code:
Dim arr(1 To 8, 1 To 1)
With Sheets("Hulpblad")
     For i = 0 To 3
          For j = 1 To 8
               arr(j, 1) = Me.combobox(i * 8 + j)
          Next
          .Range("AL32").Offset(, i * 3).Resize(8).Value = arr
     Next
End With
 
Laatst bewerkt:
Of geef je comboboxen een handige/herkenbare naam, in jouw geval zou dat voor ComboBox1 wellicht cboAL32 etc. kunnen zijn.
Daarna kun je met een loopje over de comboboxen in je form de waardes toekennen:
Code:
    For Each ctrl In Me.Controls
        If TypeName(ctrl.Object) = "IMdcCombo" Then Sheets("Hulpblad").Range(Right(ctrl.Name, 4)) = ctrl.Value
    Next
 
Verstandiger lijkt het de struktuur van het werkblad aan te passen.
Zorg dat alle gegevens in 1 aaneengesloten gebied terecht moeten komen; bijv AL32:AN39, ipv 3 gescheiden gebieden AL31:AL39, AO32:AO39, AR32:AR39.
Dan kun je via een Array (zoals cow18 toont) de code tot 1 schrijfbewerking beperken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan