• 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.

verkorten van vba formules

Status
Niet open voor verdere reacties.

pimcl

Gebruiker
Lid geworden
29 jun 2020
Berichten
35
Goedemorgen,

Ik hoop dat jullie me kunnen helpen met het volgende probleem.

Ik heb een userform gemaakt in VBA, met ongeveer 120 invulvelden. De code ziet er als volgt uit:

Sheets("Database").Range("Data_Start").Offset(TargetRow, 0).Value = Txt_Customer_Name.Text
Sheets("Database").Range("Data_Start").Offset(TargetRow, 1).Value = Txt_Account_Class
Sheets("Database").Range("Data_Start").Offset(TargetRow, 2).Value = Txt_Business_Area.Text
Sheets("Database").Range("Data_Start").Offset(TargetRow, 3).Value = Txt_End_User.Text
Sheets("Database").Range("Data_Start").Offset(TargetRow, 4).Value = Txt_Region.Text
Sheets("Database").Range("Data_Start").Offset(TargetRow, 5).Value = Txt_Country.Text
Sheets("Database").Range("Data_Start").Offset(TargetRow, 6).Value = Txt_Location.Text
Sheets("Database").Range("Data_Start").Offset(TargetRow, 7).Value = Txt_Contactperson.Text
Sheets("Database").Range("Data_Start").Offset(TargetRow, 8).Value = Txt_Contact_Position.Text

Nu verwacht ik dat deze codes ook makkelijker in een loop gebruikt kunnen worden. De cijfers voor de kolommen (dikgedrukt) lopen dus door tot ongeveer 120.

Ik heb echter zelf geen idee hoe ik dit het beste kan doen aangezien ik alle tekstvakken een naam heb gegeven waardoor ze makkelijk te onderscheiden zijn in de programmacode. Heeft iemand een idee?
 
Wie maakt er ook een userform van 120 invulvelden!:shocked:
Je kan zoiets doen, maar je moet alsnog alle 120 velden definiëren in je array.

Code:
Sheets("Database").Range("Data_Start").Offset(TargetRow).Resize(, 120) = Array(Txt_Customer_Name.Text, Txt_Account_Class, .........etc tot je 120e veld)
 
Die 120 is inderdaad wel erg veel.
Zet het kolomnummer waar de waarde van de TextBox in thuis hoort in de Textbox.Tag
Vervolgens deze code:
Code:
For Each txt In Me.Controls
    If TypeName(txt) = "TextBox" Then
        If txt.Tag <> "" Then
            Sheets("Database").Range("Data_Start").Offset(TargetRow, Int(txt.Tag)).Value = txt.Text
        End If
    End If
Next txt
 
Laatst bewerkt:
Dag Jveer en Edmoor,

bedankt voor jullie reacties.

JVeer, ik neem aan dat je dan de velden in je array ook op de juiste volgorde moet zetten?

Edmoor, die formule werkt bij mij niet. Wellicht doordat ik hem verkeerd gebruikt. Zoals ik het begrijp voeg ik in de eigenschappen van de textbox het veld "Tag" in met het juiste kolomnummer. Is dit juist? Zou je me kunnen uitleggen hoe jouw loop zou werken (m.a.w. wat doet de loop)?
 
Het is geen formule maar VBA routine.
Deze gaat alle objecten in de userform langs, kijkt of het een TextBox is, kijkt dan of de tag is gevuld en en gebruikt het nummer in de tag als kolomnummer.
Zie voorbeeld documentje:
Bekijk bijlage pimcl.xlsm
 
Dat kom je tegen als je geen voorbeeldbestand plaatst, dan is het voor de helpers gokken en voor u natuurlijk ook.
 
En ja dan moet je ze wel op de juiste volgorde zetten als je mijn suggestie gebruikt
 
1. geef de tekstvakken een naam met oplopend volgnummer 'T_0' t/m 'T_119'
2. zet via een lus alle tekstvakwaarden in een array
3. schrijf de array in 1 keer naar een werkblad (véél sneller dan 120 schrijfbewerkingen)

Code:
Sub M_snb
  redim sp(0,119)

  for j = 0 to 119
    sp(0,j)=Me("T_" & j).Text
  next

  Sheets("Database").cells(target.row,1).resize(,120)=sp
End Sub

Bij een goed doordacht Userform ontwerp zijn er nog meer mogelijkheden:
- gebruik maken van de eigenschap .Tabindex ( 0 - 119) van de tekstvakken om ze in de juiste volgorde in de array te schrijven
- gebruik maken van de eigenschap .Tag ( 0 - 119) van de tekstvakken om ze in de juiste volgorde in de array te schrijven

Bijv.
Code:
Sub M_snb
  redim sp(0,119)

  for each it in controls
    if typename(it) = "TextBox" then sp(0,it.tabindex)=it.Text
'    if typename(it) = "TextBox" then sp(0, it.Tag) = it. Text
  next

  Sheets("Database").cells(target.row,1).resize(,120)=sp
End Sub
 
Laatst bewerkt:
Edmoor, Hoe zou dat dan werken met keuzelijsten, selectievakjes en keuzerondjes?

Zie bijgaand mijn voorbeeldbestand.
 

Bijlagen

  • Voorbeeld vba userform.xlsm
    17,6 KB · Weergaven: 25
@Snb bedankt voor je reactie. Dat ziet er zeer goed uit. Ik ga eens kijken of ik het werkend krijg
 
@Snb ik krijg de foutmelding :"Kan het gegeven object niet vinden" in de regel sp(0, j) = Me("T_" & j).Text
 
Wellicht is dit te hoog gegrepen om zelfstandig te doen. Ik ben namelijk geen kenner
 
Heb je die textboxen wel de naam T_1, T_2, T_3 t/m T_120 gegeven?
 
Zie voorbeeldbestand

Het tweede voorbeeeldbestand bevat de mogelijkheid om te kiezen of in volgorde van naam, tabindex of tag moet worden geschreven in het werkblad.
 

Bijlagen

  • __formulier_snb.xlsb
    15,1 KB · Weergaven: 22
  • __formulier_snb_002.xlsb
    16,4 KB · Weergaven: 20
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan