[Excel2007][VBA] Vlookup geeft fout 1004 bij missende waarde

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • DK
  • Registratie: November 2000
  • Laatst online: 23-03-2021
Ik wil een VLOOKUP functie toepassen in VBA (Excel 2007). Dit werkt prima zolang de gezochte waarde wordt gevonden in de referentietabel. Wanneer de waarde echter niet wordt gevonden krijg ik een foutmelding: "Fout 1004: Eigenschap Vlookup van klasse WorksheetFunction kan niet worden opgehaald."

Op zich logisch. Excel zal "#N/A" teruggeven, maar VBA staat dit niet toe en geeft een foutmelding.

Ik heb op internet gezocht en daar worden 2 oplossingen aangedragen om met deze foutmelding om te gaan.
Gecombineerd met mijn code ziet dat er als volgt uit:

code:
1
2
3
4
5
6
Sub Contract_Ophalen
     On Error Resume Next

     Contract_Type = Application.WorksheetFunction.VLookup(Val(Contract_Num), Worksheets("Contract").Range("E2:K1000"), 7, False)
     If IsError(Contract_Type) Then MsgBox "Not found"
End Sub


of:
code:
1
2
3
4
5
6
Sub Contract_Ophalen
     On Error Resume Next

     Contract_Type = Application.WorksheetFunction.VLookup(Val(Contract_Num), Worksheets("Contract").Range("E2:K1000"), 7, False)
     If Err.Number <> 0 Then MsgBox "Not found"
End Sub


Helaas werken beide oplossingen niet voor mij.
(Ook niet wanneer ik in de 1e code regels 4 en 5 combineer; dus: If iserror((Vlookup) then 'MsgBox' else 'Vlookup'))

Hoe los ik dit op?

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Wat werkt er precies niet aan de tweede oplossing?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • DK
  • Registratie: November 2000
  • Laatst online: 23-03-2021
pedorus schreef op dinsdag 23 november 2010 @ 17:33:
Wat werkt er precies niet aan de tweede oplossing?
Dan krijg ik dezelfde foutmelding (Indien 'Contract_Num' niet wordt gevonden):
"Fout 1004: Eigenschap Vlookup van klasse WorksheetFunction kan niet worden opgehaald."

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ga eens in de VBA-editor naar Tools->Options->Tabblad General->Error Trapping en kies dan voor Break on unhandled errors. Oh, en dit moet je natuurlijk even vertalen ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • DK
  • Registratie: November 2000
  • Laatst online: 23-03-2021
Het vertalen is gelukt!! :P

En daarmee is mijn probleem ook opgelost. Waarvoor dank!

Nog een laatste vraagje: Is het ook mogelijk deze optie-setting via de VBA-code te beinvloeden?
Ik wil namelijk mijn programma delen met anderen en, ivm gebruiksgemak, liever geen 'vereisten voor gebruik' meeleveren.

Acties:
  • 0 Henk 'm!

Verwijderd

deze instelling kan in excel niet via vba gewijzigd worden (wel in access bv), maar normaal gesproken moet er niets aangepast worden bij de gebruikers want de "break on all unhandled errors" is de standaard waarde.

edit : met de sendkeys methode is het wel mogelijk, maar ik raad het niet aan : voor nederlandstalige excel
Visual Basic:
1
Application.SendKeys "%{F11}%XO+{TAB}{RIGHT 2}%F~%{F4}"

[ Voor 29% gewijzigd door Verwijderd op 24-11-2010 17:25 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het schijnt ook via het registry te kunnen.

Ik denk echter dat je het beste de boel kan herschrijven zonder mogelijkheden tot fouten:
Visual Basic:
1
2
3
4
5
Sub Contract_Ophalen2()
     Contract_Type = Evaluate("VLookup(" & Val(Contract_Num) & _
         ", Contract!E2:K1000, 7, False)")
     If IsError(Contract_Type) Then MsgBox "Not found"
End Sub

Of iets als:
Visual Basic:
1
2
3
4
5
6
7
8
9
Sub Contract_Ophalen3()
     Set Contract_Type = Worksheets("Contract").Range("E2:E1000") _
         .Find(Val(Contract_Num), lookat:=xlWhole, lookin:=xlValues)
     If Contract_Type Is Nothing Then
        MsgBox "Not found"
        Exit Sub
     End If
     Set Contract_Type = Contract_Type.Offset(0, 6)
End Sub

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1