[vba/excel]Typen komen niet met elkaar overeen

Pagina: 1
Acties:
  • 1.323 views sinds 30-01-2008
  • Reageer

  • 456
  • Registratie: April 2000
  • Niet online

456

Onze excuses voor het ongemak

Topicstarter
Ik heb 2 excel bestandjes, met elk haar eigen gegevens. In de eerste kolom staan de (medewerkers)namen. Wat overeen MOET komen zijn de namen, echter dit is niet altijd het geval! Dit ivm de vlookup.
voorbeeld:
respectievelijk een naam uit bestand 1, en bestand 2:
code:
1
2
Puk, PHJ
Puk, PGJ


Bij de code:
code:
1
gem_aantal_belm_pdienst = Application.VLookup(r82_personeelslid, r81list, 9, onwaar)

gaat het ALTIJD goed als de namen HETZELDE zijn (vandaar de waarde onwaar in de code).
Maar wanneer de namen nu NIET gelijk zijn, wil ik dat de expressie 'gem_aantal_belm_pdienst' de waarde krijgt 'Namen komen niet overeen'.

Echter mijn vba knalt er al bij de eerder genoemde code uit met de foutmelding 'Typen komen niet met elkaar overeen'.
Ik heb al geprobeerd de gem_aantal_belm_pdienst een 'variant' te maken:
code:
1
dim gem_aantal_belm_pdienst as variant

Nu kan het namelijk ook een ERROR bevatten.
In vba geeft tijdens de fout, de expressie controle 'fout 2042' mee.

Ik wil dus nu dat wanneer ik deze fout heb, ik toch een waarde aan de expressie mee kan geven. Met 'on error' wil ik liever niet werken.
Iemand een idee?

(misschien (wederom) een onoverzichtelijk verhaal, maar ik probeer maar zoveel mogelijk te tikken, in de hoop dat iemand het probleem herkent)

[ Voor 9% gewijzigd door 456 op 18-09-2003 12:19 ]

Een dag geen vertraging, is een dag niet gereisd


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Met 'on error' wil ik liever niet werken.
Waarom niet? Heb je daar een reden voor? In de onerror kun je netjes kijken of de error die getriggerd is ook de error is die hiermee te maken heeft, en anders kun je een andere melding geven....? De laatste keer dat ik controleerde was hij juist daarvoor gemaakt!

Wat betreft jouw probleem: ik denk dat je met een simpel if-statement een heel eind komt. De vraag die ik daarbij heb is: knalt je VBA er nog steeds uit nadat je er een variant van hebt gemaakt?
Zo ja: met welke melding?
Zo nee: wat wordt de waarde van je variabele (en maak hem "waardes komen niet overeen" als je die waarde krijgt.)

Verder: is er geen evaluatie die je van tevoren op de vlookup kunt doen waardoor je kunt zien of die uberhaupt uitgevoerd kan worden?

My personal website


  • 456
  • Registratie: April 2000
  • Niet online

456

Onze excuses voor het ongemak

Topicstarter
OZ-Gump schreef op 18 September 2003 @ 14:16:
[...]
Waarom niet? Heb je daar een reden voor? In de onerror kun je netjes kijken of de error die getriggerd is ook de error is die hiermee te maken heeft, en anders kun je een andere melding geven....? De laatste keer dat ik controleerde was hij juist daarvoor gemaakt!
Ik denk dat je hiermee bedoelt, dat je voor elke aparte error, met uniek nummer, die er gaat ontstaan, je een aparte goto kan maken? Daar was ik me niet van bewust.
Ik dacht dat bij elke error er naar hetzelfde volgende punt gegaan moest worden. En dat wil ik dus niet. Ik wil dus alleen in DIT geval (error 2042).
Nu zit ik de 'on error' even uit te pluizen en kom ik idd het volgende tegen:
code:
1
If Err.Number = 440

en dan kan je nu dus aangeven wat het daadwerkelijk wel moet zijn. Dat zou ik nog even kunnen proberen, ware het niet (en nu komt het) dat ik de daadwerkelijke fout al heb gevonden bij mij.
Wat betreft jouw probleem: ik denk dat je met een simpel if-statement een heel eind komt. De vraag die ik daarbij heb is: knalt je VBA er nog steeds uit nadat je er een variant van hebt gemaakt?
Zo ja: met welke melding?
Zo nee: wat wordt de waarde van je variabele (en maak hem "waardes komen niet overeen" als je die waarde krijgt.)
Heb ik geprobeerd, ik kreeg EXACT dezelfde foutmelding. Logisch, gezien de fout die ik heb gemaakt. Laat ik het maar verklappen:
code:
1
gem_aantal_belm_pdienst = Application.VLookup(r82_personeelslid, r81list, 9, [b]onwaar[/b])

Dat onwaar wertkt PRIMA in excel (nederlandse versie) maar werkt NIET in vba! Nu ik daar False heb ingevuld, werkt alles prima. Ik hoef NIETS te declareren. Wanneer er nu iets niet wordt gevonden, krijg ik een #N/B terug. Daar kan ik met een if functie wel iets van bakken.
Verder: is er geen evaluatie die je van tevoren op de vlookup kunt doen waardoor je kunt zien of die uberhaupt uitgevoerd kan worden?
Heb ik ook tijdje over zitten dubben, maar WAAR moet ik zoeken? Ik heb het met Find geprobeerd, of zoals met php zou kunnen:
code:
1
if(Application.VLookup(r82_personeelslid, r81list, 9, onwaar)) then

etc. maar dat werkte niet.

Ik denk dat als de vlookup een EXACT dezelfde waarde vindt, hij niet meer verder in de formule kijkt of het 'true' (gelijkend op de zoekwaarde) of 'false' (EXACT dezelfde zoekwaarde) moet zijn. Dit omdat het nl. nooit fout ging bij exact dezelfde zoekwaarden.

Bedankt voor je inbreng, en je reactie.

Een dag geen vertraging, is een dag niet gereisd


  • 456
  • Registratie: April 2000
  • Niet online

456

Onze excuses voor het ongemak

Topicstarter
Ik ben toch nog niet helemaal klaar:
code:
1
2
3
4
5
6
7
8
9
On Error GoTo error13
        gem_aantal_belm_pdienst = Round(Application.VLookup(r82_personeelslid, r81list, 9, onwaar))
        gem_aantal_sms_pdienst = Round(Application.VLookup(r82_personeelslid, r81list, 13, onwaar))

error13:
            If Err.Number = 13 Then
                gem_aantal_belm_pdienst = "Geen gegevens"
                gem_aantal_sms_pdienst = "Geen gegevens"
            End If

Nu gaat dit voor de eerste 34 personen goed (al dan niet middels de error clausule). Maar dan ineens gaat het bij de 35e fout :S
Ook hier kan ik zien dat het om fout 13 gaat (controleren van de expressie 'Err'), maar nu knalt TOCH weer mijn VBA eruit.
Ik weet dat de naam die ik probeer te zoeken in de huidige for each (bovenstaande code is een onderdeel van een for each) niet bestaat in bestand 2. Maar dat boeit toch helemaal niet???
Ik zeg toch on error goto etc...
Doe ik iets fout?

edit: Het lijkt er op dat slechts 1x deze procedure gevolgd kan worden. De eerste keer dat fout 13 optreedt, gaat hij netjes naar die 'error13:' toe, maar vanaf de 2e keer vertikt hij dit te doen (terwijl die on error toch elke keer wordt aangeroepen).

[ Voor 14% gewijzigd door 456 op 18-09-2003 16:02 ]

Een dag geen vertraging, is een dag niet gereisd


  • 456
  • Registratie: April 2000
  • Niet online

456

Onze excuses voor het ongemak

Topicstarter
Nou, voor de laatste keer:
Het probleem is uiteindelijk op de volgende manier verholpen:
code:
1
2
3
4
5
6
7
8
On Error Resume Next
            gem_aantal_belm_pdienst = Round(Application.VLookup(r82_personeelslid, r81list, 9, onwaar))
            gem_aantal_sms_pdienst = Round(Application.VLookup(r82_personeelslid, r81list, 13, onwaar))
error13:
            If Err.Number = 13 Then
                gem_aantal_belm_pdienst = "Geen gegevens"
                gem_aantal_sms_pdienst = "Geen gegevens"
            End If

Nu komt hij tot 2x toe op een foutmelding (round(iets wat niet bestaat)) met als ID 13. Dit doet hij wel elke keer dat, in tegenstelling tot 'on error goto'.

Opgelost.
* Anoniem: 456 is blij man.

[ Voor 5% gewijzigd door 456 op 18-09-2003 16:45 ]

Een dag geen vertraging, is een dag niet gereisd