Inner For

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Toch onderstaand weer een code.
Wat doe ik toch verkeerd?

Het is de bedoeling dat de commandbutton de caption krijgt uit de array. Telkens ontvang ik de foutmelding dat de typen niet overeenkomen.
Deze code staat in een UserForm.


Code:
Private Sub CommandButton12_Click()
    Y = Array("Heus", "Waar", "Ik", "Probeer", "Het", "Toch", "Maar", "Eens")
    
    With Frm_Hoofd
        For Each ctrl In .Frame2.Controls
            With ctrl
                For i = 22 To 29
                    For Y = Y(0) To Y(7)
                        If .Name = ("CommandButton" & i) Then .Caption = Y
                    Next Y
                Next i
            End With
        Next ctrl
    End With
    
End Sub

Als ik i declareer als integer en y declareer as string dan krijg ik een foutmelding dat er een matrix wordt verwacht.
 
Code:
Private Sub CommandButton12_Click()
    Dim i As Integer, Y As Variant
    
    Y = Array("Heus", "Waar", "Ik", "Probeer", "Het", "Toch", "Maar", "Eens")
    
    With Frm_Hoofd
        For Each ctrl In .Frame2.Controls
            With ctrl
                For i = 22 To 29
                    If .Name = ("CommandButton" & i) Then .Caption = Y(i - 22)
                Next i
            End With
        Next ctrl
    End With
End Sub
 
Declareren maakt meer kapot dan je lief is .... ;)

Probeer het eens zonder declaraties (wel eerst option explicit verwijderen).
 
Dat zal niet helpen want je kan geen Array aan een Caption toekennen.
Dat veroorzaakt de foutmelding over niet overeenkomende typen.

Overigens is in grotere projecten het declareren van variabelen met de juiste datatypes wel degelijk van belang.
O.a. voor wat betreft geheugengebruik.
Bij mij staat Option Explicit standaard aan.
 
Laatst bewerkt:
@masala

Geeft arrays een kenmerkende naam; dat voorkomt vergissingen.
Ik gebruik altijd sn, sp, sq, st etc. dan weet ik meteen dat het over een array gaat.
Structureer de namen van de elementen in het Userform zodanig dat je daar in je code plezier van hebt.
Als je de commandbuttons de namen C_0 t/m C_7 (= 8 commandbuttons) geeft is deze code voldoende:


Code:
Private Sub CommandButton12_Click()
    sn = Array("Heus", "Waar", "Ik", "Probeer", "Het", "Toch", "Maar", "Eens")
    
    For j=0 to ubound(sn)
       me("C_" & j).Caption = sn(j)
    Next
End Sub
 
Beste Rudi.

Ik heb jou code ingevoerd. Deze werkt. Ik heb gezien dat jij de inner For hebt verwijderd en hiervoor in de plaats: .Caption = Y(i - 22) hebt geplaatst. Of jij dit inderdaad ook volgens mijn visie hebt gedaan of dat dit een andere wijze is, laat ik maar ter zijde. Wat ik mij wel afvraag is die: Y (i - 22). Hoe moet ik dit stukje zien? Wat doe je hier.

Edmoor. Slechts ter informatie bedoeld. Ook zonder declaraties werkt de code van Rudi.

Snb. Jouw code vind ik ook interessant. Ik heb jouw code alleen later gezien en had dus al de code van Rudi ingevoerd. De reden hiervan was dat jij nog niet had gereageerd en ik nu pas de tijd heb om hier te reageren. Ik ga deze wel zo uitproberen. Ik snap jou mening dat je dan de zaken duidelijker houd, maar dit wil ik pas gaan doen zodra ik het helemaal eens ben met de opzet. Daarnaast heb ik mij ook nog niet verdiept in de tenaamstellingen van de controls. Dat stukje vind ik voor nu even een bijzaak.

Tevens adviseer jij mij om andere variabelen te gebruiken voor een Array. Hoewel ik hier geen problemen mee heb, vraag ik mij wel af waarom dit dan duidelijker zou zijn. Jij geeft aan dat het voor jou duidelijker is en hiermee neem ik ook aan dat dit ook voor een ander duidelijker is. Maakt deze wijze dan dat het een stilzwijgende afspraak is of zoiets of is daar een andere reden voor?

Als laatste. Waarom maakt declareren meer kapot dan je lief is. Als je niet declareert dan wordt toch alles een Variant?

In ieder geval allen voor nu bedankt en reacties zie ik graag tegemoet.
 
Laatst bewerkt:
Edmoor. Slechts ter informatie bedoeld. Ook zonder declaraties werkt de code van Rudi.

Tuurlijk.
Ik geef alleen maar aan waarom het declareren van juiste datatypen belangrijk is.
In simpele functies zoals hier nodig is kan ook wel zonder.
Variabelen worden dan inderdaad automatisch als Variant gedeclareert en dat is qua geheugengebruik de duurste die er is.

Ik geef er de voorkeur aan om variabelen altijd te declareren met het juiste datatype.
Dat is niet alleen belangrijk voor geheugengebruik maar het nut ervan komt extra naar voren als je met meerdere modules en overdraagbare variabelen gaat werken.

Daarnaast, wat is er op tegen om het gewoon te doen?
 
Laatst bewerkt:
Uiteraard, maar dat het het makkelijke gedeelte er van :D
Bijvoorbeeld 1.
Gebruik je die als Integer kan je er mee rekenen.
Gebruik je die als String is het pure tekst en kan je er niet mee rekenen.
Gebruik je die als Date is dat 1 Januari 1900
Gebruik je die als Boolean is dat True.

Naast Integer, met een maximum van 32.767 is er nog de Byte met een Maximum van 254.
Wil je hoger dan een Integer heb je een Long nodig.
Dat zijn allemaal nog hele getallen.

Wil je rekenen met cijfers achter de komma gebruik je een Double.

Zo moeilijk is het allemaal niet en het staat nog duidelijk beschreven ook:
https://msdn.microsoft.com/en-us/library/47zceaw7.aspx
 
Laatst bewerkt:
:thumb:

Weet jij toevallig het antwoord op mijn vraag aan Rudi m.b.t. : Y( i - 22).

Datgene waar ik op uitkom is dat hiermee het begin wordt aangegeven, maar gebeurd volgens mij al via For i = 21 - 29.

Als je het antwoord openlaat en overlaat aan Rudi zelf, kan ik dat wel begrijpen hoor.
 
Simpel. Je hebt maximaal 8 keuzes in je array. Om die te bereiken geef je het indexnummer op. i-22 komt in dat geval uit op het juiste indexnummer voor de string die je uit de array (Y) wil gebruiken. Da's keurig gedaan door Rudi.

Maar als je dus je objecten juist benoemd is dat weer niet nodig, wat snb al opmerkte in #5.
En wat al eerder is gezegd, structuring before programming.
 
Laatst bewerkt:
Oke. Het is dus een indexnummer. Mij nog niet helemaal helder hoe dit dan precies werkt, maar ik heb wel een idee. Een idee welke ik ga uitproberen om te kijken of dit ook zo is. Mijn gevoel zegt namelijk dat het indexnummer gelijk is aan de eerste commandbutton in de rij van de For i en deze koppelt aan Y. Toch zie ik het verband niet hoe deze dan de array verder doorloopt. Ik zie nu slechts waar het begin ligt.

Dank je.
 
Bekijk dit eens: Y = Array("Heus", "Waar", "Ik", "Probeer", "Het", "Toch", "Maar", "Eens")
Y(0) is dus "Heus"
Y(1) is "Waar"
Y(2) is "Ik"
Enz... t/m Y(7) wat dan "Eens" is.

Het tellen begint dus bij 0. (Al kan je daar met Option Base weer van afwijken, maar dat is nu niet van belang) ;)
Daarnaast hebben je buttons en die array niets met elkaar te maken.
Het gaat om nummering.

Het is heel wat simpeler dan je uitleg van E = MC² ;)
 
Laatst bewerkt:
@ edmoor

Zou het niet beter uitgelegd gekregen hebben. :d:thumb:
 
Ah oke het werkt dus wel volgens het principe welke ik in mijn eerste code heb getracht te gebruiken. Hier gebruikte ik namelijk For Y = Y(0) To Y(7).

Enne E = MC2 is net als de rest een aantal verschillende los van elkaar staande formules. Wel staat het grappig. :cool:
 
He Rudi. Bedankt hoor. Ik had jou eerlijk gezegd nu even niet verwacht. Ik had verwacht dat jij veel later pas zou reageren. Ga je nu al aan de bak? Zo ja, Werk ze!
 
Ah oke het werkt dus wel volgens het principe welke ik in mijn eerste code heb getracht te gebruiken. Hier gebruikte ik namelijk For Y = Y(0) To Y(7)

En dat kan dus niet omdat na deze toewijzing van Y de Array niet meer bestaat maar je een String hebt met als waarde de laatste toewijzing uit de array. En hier komt dus weer het belang van het juist declareren van variabelen om de hoek kijken.

@Rudi:
Thanks :)
 
Laatst bewerkt:
Ben al meer dan 2 uur bezig, had nu even tijd om een blik te werpen op de reacties van vandaag.;)
 
Voor mij tijd om de binnenkant van m'n ogen te gaan bekijken.
Werk ze Rudi, bak ze lekker bruin :)
 
#Edmoor. Aha dan snap ik meteen waarom ik bij een foutmelding bij de Y het laatste woord: Eens kreeg te zien zodra ik hierop ging staan.

Ik ga ook de binnenkant bekijken van mijn ogen. Straks weer vroeg op.

Case is closed.

Allen bedankt.

Rudi werk ze nog even dan.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan