Aan de naam van een textbox een variabele toekennen

  • Onderwerp starter Onderwerp starter gst
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

gst

Gebruiker
Lid geworden
5 jan 2010
Berichten
125
Besturingssysteem
64-bits besturingssysteem, x64-processor
Office versie
Microsoft Office LTSC Professional Plus 2021
Geacht forum,

Voor een bepaade toepassing heb ik in een formulier een aantal textboxen op rij geplaatst met de volgende benaming
txtAantal_1
txtPrijsPerEenheid_1
txtGeschatBedrag_1
txtKorting_1, txt
txtDefinitiefBedrag_1


De volgende rij textboxen hebben dezelfde naam met die verstande dat de nummers anders zijn.
Voor elke invoer hiervan wil ik hetzelfde afvragen (totaal 10 rijen textboxen)
Ik zou dit willen doen middels een functie.


Function ControleBedrag(Aantal, PrijsPerEenheid, GeschatBedrag, Korting, DefinitiefBedrag)

If Not Aantal = Empty And Not PrijsPerEenheid = Empty And Not Korting = Empty Then
DefinitiefBedrag = Aantal * PrijsPerEenheid - (GeschatBedrag * Korting / 100)
End If

End Function

Dit lukt prima voor de eerste textboxen (nummers 1) maar het lukt mij niet om via een variabele deze functie aan te roepen.
Kortom, hoe kun je aan de naam van een textbox een variabele toekennen zodat je deze kunt gebruiken in bijv. een functie?
 
Graag de volgende keer je code opmaken met de CODE knop, dat maakt 'm een stuk leesbaarder. Maar je zou aan zoiets kunnen denken:

Code:
Function ControleBedrag()
     For i = 1 to 10
          Me("txtDefinitiefBedrag_" & i) = Me("txtAantal_" & i) * Me("txtPrijsPerEenheid_" & i) - (Me("txtGeschatBedrag_" & i) * Me("txtKorting_" & i) / 100)
End Function
 
Michel,
Dank voor je reactie maar helaas kom ik er niet uit hoe ik je voorstel kan toepassen.
De bedoeling is dat 10x de naam van een textbox met als enigste verschil het laatste cijfer, 10x hetzelfde afgevraagt kan worden.
Dit afvragen zou dacht ik dan kunnen via een functie of via een sub module.
Je voorbeeld heb ik proberen toe te passen maar helaas het lukt mij niet met 'me'.
Ik krijg de melding: 'Ongeldig gebruik van het sleutelwoord Me'

Misschien verduidelijkt het toegevoegd voorbeeldbestandje iets meer.
Hier in heb ik een aantal steeds weer dezelfde afvragingen die volgens mij veel korter geschreven kunnen worden door gebruik te maken van een variabele op de textbox naam.
 

Bijlagen

Ik zie de code niet terug in je formulier :). Overigens moet er ook nog een controle bij voor de nog niet ingevulde velden, dus het werd sowieso wat uitgebreider. Iets als:
Code:
Function ControleBedrag()
Dim iAantal As Integer, iPrijs As Double, iGeschat As Double, iKorting As Double
     For i = 1 To 10
        If Me("txtAantal_" & i) = vbNullString Then iAantal = 0 Else iAantal = Me("txtAantal_" & i)
        If Me("txtPrijsPerEenheid_" & i) = vbNullString Then iPrijs = 0 Else iPrijs = Me("txtPrijsPerEenheid_" & i)
        If Me("txtGeschatBedrag_" & i) = vbNullString Then iGeschat = 0 Else iGeschat = Me("txtGeschatBedrag_" & i)
        If Me("txtKorting_" & i) = vbNullString Then iKorting = 0 Else iKorting = Me("txtKorting_" & i)
        Me("txtDefinitiefBedrag_" & i) = iAantal * iPrijs - (iGeschat * iKorting / 100)
    Next i
End Function

Code:
Private Sub txtAantal_1_Change()
    ControleBedrag
End Sub

Code:
Private Sub txtGeschatBedrag_1_Change()
    ControleBedrag
End Sub

Code:
Private Sub txtPrijsPerEenheid_1_Change()
    ControleBedrag
End Sub

Code:
Private Sub txtAantal_2_Change()
    ControleBedrag
End Sub

Code:
Private Sub txtAantal_3_Change()
    ControleBedrag
End Sub

Code:
Private Sub txtKorting_1_Change()
    ControleBedrag
End Sub

etc.
 
Michel,

De code had ik geplaatst in de module modFuncties.
Je laatste suggesties heb ik daar nu ook geplaatst en merk nu dat dit niet kan want dan volgt een 'Copileerfout - Ongeldig gebruik van het sleutelwoord Me'.
De functie moet blijkbaar in het formulier zelf geplaatst worden.
Voor de overzichtelijkheid had ik diverse fucties geplaatst in een aparte module.
Ik begrijp hieruit dat het gebruik van 'Me' binnen het formulier moet blijven (?)

In ieder geval werkt je voorgestelde suggestie en ga ik hier mee verder.
Mocht ik nog vragen tegen komen dan meldt ik me wel weer en anders sluit ik dit bericht.
In ieder geval dank voor je meedenken!
 
Het is niet voor de hand liggend een Funktie geen waarde te laten retourneren:
De onderstaande code zou beter in een Sub thuishoren.

Code:
Function ControleBedrag()
Dim iAantal As Integer, iPrijs As Double, iGeschat As Double, iKorting As Double
     For i = 1 To 10
        If Me("txtAantal_" & i) = vbNullString Then iAantal = 0 Else iAantal = Me("txtAantal_" & i)
        If Me("txtPrijsPerEenheid_" & i) = vbNullString Then iPrijs = 0 Else iPrijs = Me("txtPrijsPerEenheid_" & i)
        If Me("txtGeschatBedrag_" & i) = vbNullString Then iGeschat = 0 Else iGeschat = Me("txtGeschatBedrag_" & i)
        If Me("txtKorting_" & i) = vbNullString Then iKorting = 0 Else iKorting = Me("txtKorting_" & i)
        Me("txtDefinitiefBedrag_" & i) = iAantal * iPrijs - (iGeschat * iKorting / 100)
    Next i
End Function
 
snb,

Ik heb geprobeerd om deze in een sub (macro) te plaatsen (zie voorgaande omschrijving).
Maar in dat geval krijg ik een foutmelding: 'Copileerfout - Ongeldig gebruik van het sleutelwoord Me'
Op zich kan ik met het voorgestelde opzet uit de voeten maar ik leer graag van ieders opmerking vandaar deze reactie.
Misschien zou je nog uit kunnen leggen waarom het in mijn geval niet werkte?
Klopt het dat je een functie (zoals in dit geval) altijd binnen het formulier moet houden?

gst
 
Me is de container die de code bevat.
Als je met 'Me' wil verwijzen naar een userform als container, zul je de code altijd in de codemodule van het userform moeten zetten.

een voor de hand liggender aanpak zou zijn:

Code:
Sub M_snb()
   For j = 1 To 10
        Me("txtDefinitiefBedrag_" & j) = F_controlebedrag(Val(Me("txtAantal_" & j)), Val(Me("txtPrijsPerEenheid_" & j)), Val(Me("txtGeschatBedrag_" & j)), Me("txtKorting_" & j))
    Next
End Sub

Function F_controlebedrag(ParamArray sn())
   F_controlebedrag = sn(0) * sn(1) - (sn(2) * sn(3) / 100)
End Function

NB. En natuurlijk allemaal in de codemodule van het userform met deze 'controls'.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan