Vraag


  • vovpvi
  • Registratie: Juni 2011
  • Laatst online: 04-11-2023
Ik heb onderstaande code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Option Explicit
Public val As Variant

Private Sub CommandButton1_Click()

 
    val = Application.WorksheetFunction.VLookup(UserForm1.TextBox2.Text, ThisWorkbook.Sheets("Lijsten").Range("A1:E40"), 4, False)
   
    UserForm1.TextBox1.Text = val
    
 
End Sub


Mijn excelsheet:
Afbeeldingslocatie: https://tweakers.net/i/qO0UzJGmHaE_pe5EFS3Lh1gWpJ4=/full-fit-in/4920x3264/filters:max_bytes(3145728):no_upscale():strip_icc():fill(white):strip_exif()/f/image/690DdKAdRR633YCrt3LTvvqK.jpg?f=user_large

Mijn userform heeft een textbox1; textbox2 en een commandbutton1


Probleem: Als ik op de button klik komt er niks in de textbox1 te staan.

Beste antwoord (via vovpvi op 01-10-2023 20:53)


  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Dat moet niet, maar dan moet je de opdracht wel iets wijzigen. En de variabele v1 mag je ook weglaten.
Let er op dat de regels 2 en 3 één opdracht vormen.
code:
1
2
3
4
Private Sub CommandButton1_Click()
UserForm1.Textbox1.Value = Application.WorksheetFunction. _
VLookup(val(UserForm1.Textbox2), Sheets("Lijsten").Range("A1:E40"), 4, False)
End Sub

Alle reacties


  • LievenD
  • Registratie: Juli 2005
  • Laatst online: 20:08
Ik zie 2 problemen:
  1. Je gebruikt 'val' als variabele. Dat vormt een probleem omdat dat ook een commando is. (zie puntje 2) Als je de prijs per meter wilt weten, noem je de variabele gewoon 'prijspermeter' of als je dat te lang vindt, 'ppm'.
  2. Het fabrikantnummer bevat geen tekst, maar een numerieke waarde. Dus moet je de tekst die je in Textbox2 intypt, omzetten naar een numerieke waarde. Dit kan met het commando Val(...)
Tot slot lijkt het niet nodig om de variabele te declareren als 'Variant', 'Double' is meer dan voldoende, gezien de prijs per meter steeds een numerieke waarde is.

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Het is Application.Vlookup of Worksheetfunction.Vlookup, niet beide.
Je moet het resultaat van die functie aan een variabele toewijzen.
En niet verzuimen om een foutafhandeling voor vlookup toe te voegen.

code:
1
2
3
4
5
6
Private Sub CommandButton1_Click()
Dim v1 As Double, v2 As Double
v2 = UserForm1.TextBox2.Value
v1 = Application.VLookup(v2, Sheets("Lijsten").Range("A1:E40"), 4, False)
UserForm1.TextBox1.Value = v1
End Sub

[ Voor 15% gewijzigd door dix-neuf op 23-09-2023 14:12 ]


Acties:
  • +2 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

dix-neuf schreef op zaterdag 23 september 2023 @ 14:08:
Het is Application.Vlookup of Worksheetfunction.Vlookup, niet beide.
Microsoft is het niet met je eens. :)
Het applicationobject kent geen vlookup methode, maar wel de property worksheetfunction, die een worksheetfunction object terug geeft die op zijn beurt de methode vlookup bevat.

Dat de vba interpreter het toelaat om verwijzingen af te korten maakt het volledige pad niet incorrect.

https://learn.microsoft.c...excel.application(object)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
@Lustucru, misschien begrijp ik je verkeerd (of jij mij), maar ik wilde zeggen dat je application.vlookup en worksheetfunction.vlookup (naar mijn mening) beter niet beide tezamen met vlookup moet gebruiken (ts schreef: Application.WorksheetFunction.VLookup...). Beide afzonderlijk met vlookup kan wel.

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 01:00
dix-neuf schreef op zaterdag 23 september 2023 @ 14:51:
@Lustucru, misschien begrijp ik je verkeerd (of jij mij), maar ik wilde zeggen dat je application.vlookup en worksheetfunction.vlookup (naar mijn mening) beter niet beide tezamen met vlookup moet gebruiken (ts schreef: Application.WorksheetFunction.VLookup...). Beide afzonderlijk met vlookup kan wel.
Beide kan ook en dat is juist de officiële manier, zoals Lustucru aangeeft. WorksheetFunction heeft een optie Vlookup. Application niet. Die heeft een optie worksheetfunction. En omdat Vlookup dus (weliswaar genest) uiteindelijk in application zit, mag je application.vlookup gebruiken (ik dacht dat je dan een foutmelding kreeg, maar ben te lui om het te proberen, kan oude versie zijn geweest). En omdat we al in Excel zitten mag je ook worksheetfunction.vlookup gebruiken. Maar om echt duidelijk te zijn en Excel geen aannames te laten doen: application.worksheetfunction.vlookup

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

dix-neuf schreef op zaterdag 23 september 2023 @ 14:51:
@Lustucru, misschien begrijp ik je verkeerd (of jij mij), maar ik wilde zeggen dat je application.vlookup en worksheetfunction.vlookup (naar mijn mening) beter niet beide tezamen met vlookup moet gebruiken (ts schreef: Application.WorksheetFunction.VLookup...). Beide afzonderlijk met vlookup kan wel.
Ik begrijp jou wel. :) Je kunt het ook zelf zien door in de code-editor op F2 te rammen om in het vba objectmodel te komen. Zoek daar eens de vlookup methode op. Dan zul je zien dat die alleen voorkomt als lid van het worksheetfunction object. Dat de editor/interpreter het toestaat om daar extreem lui mee om te gaan is een zegen voor beginnende programmeurs, maar het helpt niet om een goed inzicht te krijgen in het excel objectmodel en het is een ramp als je ooit overstapt naar andere talen die daar strikter in zijn.

Anders gezegd: application.vlookup() bestaat niet, maar als je het toch typt snapt de interpreter wat je bedoelt.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Paultje3181 en Lustucru, jullie hebben gelijk. Mijn verontschuldigingen als ik mensen in verwarring zou hebben gebracht. Mijn macro doet in elk geval wel wat hij moet doen.
En verder: Hoewel dan niet juist qua syntax, op internet blijkt men nogal eens de voorkeur te geven aan gebruik van alleen Application i.p.v. Application.Worksheetfunction of alleen Worksheetfunction. Zoals bv. Dick Kusleika, toch niet de 'minste' Exceller. Zie:http://dailydoseofexcel.c...worksheetfunction-method/, waarin hij schrijft: "The benefits of using just Application are too good to pass up." ("De voordelen van het gebruik van alleen Application zijn te mooi om te laten liggen.").

Acties:
  • 0 Henk 'm!

  • vovpvi
  • Registratie: Juni 2011
  • Laatst online: 04-11-2023
Het antwoord van dix-neuf was de oplossing.

Waarom moet ik de zoekwaard eerst in een variabele "v2" stoppen?

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Dat moet niet, maar dan moet je de opdracht wel iets wijzigen. En de variabele v1 mag je ook weglaten.
Let er op dat de regels 2 en 3 één opdracht vormen.
code:
1
2
3
4
Private Sub CommandButton1_Click()
UserForm1.Textbox1.Value = Application.WorksheetFunction. _
VLookup(val(UserForm1.Textbox2), Sheets("Lijsten").Range("A1:E40"), 4, False)
End Sub
Pagina: 1