[EXCEL/VBA] Typen komen niet met elkaar overeen

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
Beste Tweakers,

Ik loop tegen een heel stom probleem aan, ik heb een stuk code geschreven die met een VBA VLookup een mailadres moet ophalen, en daar een mail naartoe moet versturen.
Code onder de knop voor single mail:
code:
1
2
3
4
5
6
7
8
9
10
Private Sub createSingleMail_Click()
    If Me.ListBoxWorker.ListIndex = -1 Then
        MsgBox "Er is geen medewerker geselecteerd!"
    Else
        Call createPDF(Me.ListBoxWorker.Value, False)
        Call ResetTable
        Call createPDF("Overzicht", False)
        Call createMail(Me.ListBoxWorker.Value)
    End If
End Sub


Als ik deze code 'enkel' uitvoer is er geen enkel probleem. De juiste bijlagen worden netjes toegevoegd, en de mail is gericht aan de juiste man.

Zodra ik éxact dezelfde code loop, dan klapt hij er bij een bepaald persoon, laten we hem even "Karel" noemen, eruit. Zodra ik dus in mijn listbox Karel selecteer en ik doe een enkele mail gaat alles prima, krijg ik netjes een mail met de juiste bijlagen, maar zodra hij het via een loop moet doen krijg ik ineens een foutmelding.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub createAllMails_Click()  
    ' maak overzichtspagina
    Call ResetTable
    Call createPDF("Overzicht", False)

    ListBoxWorker.ListIndex = 0

    Dim I As Long
    For I = ListBoxWorker.ListCount - 1 To 0 Step -1
        ListBoxWorker.ListIndex = I
        Call createPDF(Me.ListBoxWorker.Value, False)
        Call createMail(Me.ListBoxWorker.Value)
    Next I
    MsgBox "Alle planningen zijn verstuurd!"
    
End Sub


Ik heb uitgesloten dat het in de createPDF Functie zit, want als ik de createMail uit comment loopt ie wel netjes door. Andersom niet, vandaar dat ik er vanuit ga dat het in de createMail zit.

bijgaand de createMail
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Public Sub createPDF(fileName As String, message As Boolean)
    With ActiveSheet.PageSetup
        .LeftMargin = Application.InchesToPoints(0)
        .RightMargin = Application.InchesToPoints(0)
        .TopMargin = Application.InchesToPoints(0)
        .BottomMargin = Application.InchesToPoints(0)
        .HeaderMargin = Application.InchesToPoints(0)
        .FooterMargin = Application.InchesToPoints(0)
        .Orientation = xlPortrait
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
    End With
    
    'dim Weeknummer en configpath en uiteindelijke path
    Dim weekNumber As String
        weekNumber = getWeek()
    Dim basePath As String
        basePath = getBasePath()
    
    Dim newPath As String
        If fileName = "Overzicht" Then
            fileName = fileName & " - " & weekNumber
            newPath = basePath & weekNumber & "\" & fileName
        Else
            fileName = weekNumber & " - " & fileName
            newPath = basePath & weekNumber & "\" & fileName
        End If

    If checkIfPathExists(basePath, weekNumber) = True Then
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=newPath, ignoreprintareas:=True, IncludeDocProperties:=True
        If message = True Then
            MsgBox "Bestand is aangemaakt op locatie: " & newPath
        End If
    Else
        MsgBox "Pad bestaan beide niet. Controleer de 'Instellingen' tab en zorg voor een juist pad in cel B5", vbCritical, "Fout in PDF paden!"
    End If
End Sub


En wat handig kan zijn;

getMailAddress
code:
1
2
3
4
5
6
7
Function getMailAddress(workerName)
    Dim mailAddress As String
        mailAddress = Application.VLookup(workerName, Sheets("Monteurs").Range("A11:D150"), 3, False)
    getMailAddress = mailAddress
    Debug.Print ("getMailAddress() Called")
    Debug.Print (getMailAddress)
End Function


De foutmelding die ik verkrijg is een Fout 13 tijdens uitvoering: Typen komen niet met elkaar overeen. Het stomme is dat ik die fout bij een 'enkel' proces niet krijg, en dat het maar bij 1 specifieke naam gebeurt waar geen rare tekens in zitten.

Bij de foutopsporing licht deze regel op:
Afbeeldingslocatie: https://i.imgur.com/0QEFdE9.png

En zo zien mijn variabelen eruit
Afbeeldingslocatie: https://i.imgur.com/Kjqcus7.png

Ik ben trouwens géén programmeur, allemaal hobby en autodidact, dus hoor graag verbeteringen.

Beste antwoord (via Djurres op 25-06-2021 12:40)


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Wat je schrijft klopt niet:

code:
1
2
Dim mailAddress As String
mailAddress = Application.VLookup(workerName, Sheets("blad1").Range("A1:D150"), 3, False)e


Móet een foutmelding 'typen komen niet overeen' geven als workerName niet voorkomt in kolom A. Geeft de code geen foutmelding dan zit je ergens met on error resume next te prutsen oid.

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

Alle reacties


Acties:
  • 0 Henk 'm!

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 10:40

g0tanks

Moderator CSA
Wat is bij Karel de waarde van
code:
1
Application.VLookup(workerName, Sheets("Monteurs").Range("A11:D150"), 3, False)

Ik gok dat de foutmelding optreedt omdat de VLOOKUP een error teruggeeft die je toewijst aan de string mailAddress.

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


Acties:
  • 0 Henk 'm!

  • EnerQi
  • Registratie: Maart 2011
  • Laatst online: 30-09 14:14
Zit in de naam een spatie? Misschien valt ie namelijk op de 2 woorden ipv 1 woord (Jan Willem). Wat kun je proberen is het enkel proces eens met die foute naam. Faalt dit ook, zit het in de naam.

De oplossing is om de waarde te omringen met quotes zodat VBA het als 1 string ziet.

En de vlookup functie handmatig testen of ie werkt met de naam ;), zoals hierboven ook aangegeven

[ Voor 15% gewijzigd door EnerQi op 25-06-2021 11:58 ]


Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
g0tanks schreef op vrijdag 25 juni 2021 @ 11:57:
Wat is bij Karel de waarde van
code:
1
Application.VLookup(workerName, Sheets("Monteurs").Range("A11:D150"), 3, False)

Ik gok dat de foutmelding optreedt omdat de VLOOKUP een error teruggeeft die je toewijst aan de string mailAddress.
Als ik die los uitvoer, het juiste mailadres.

Zodra ik die loop, gaat het dus mis.

Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
EnerQi schreef op vrijdag 25 juni 2021 @ 11:57:
Zit in de naam een spatie? Misschien valt ie namelijk op de 2 woorden ipv 1 woord (Jan Willem). Wat kun je proberen is het enkel proces eens met die foute naam. Faalt dit ook, zit het in de naam.

De oplossing is om de waarde te omringen met quotes zodat VBA het als 1 string ziet.
Iedere naam in die tabel bevat een spatie. Bij íedere naam gaat het goed, behalve deze specifieke naam..
Verder telt de naam geen vreemde tekens oid

Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
Het vreemde is dus juist dat als ik alles los van elkaar test, dat alles gewoon perfect werkt.
Om deze rede zie ik door de bomen het bos ook niet meer, zelfs al aparte knop aangemaakt om alleen de vlookup te doen en te returnen in een msgbox.

Als ik de bewuste naam in de listbox selecteer, en ik die een 'enkele mail' genereren, dan gaat het ook gewoon goed. Is éxact dezelfde code als in de alle mails, want dat is immers een loop die continue exact dezelfde functie aanroept..

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Bijzonder. Er lijkt dus toch een verschil te ontstaan in de waarde van 'WorkerName'.

Zoniet, dan heb je ergens toch iets quircky's te pakken en kan het er ook mee te maken dat vba na een x aantal iteraties een overloop probleempje krijgt. Worksheetfunctions zijn ook nooit bedoeld om in een loop aangeroepen te worden. Zou je kunnen controleren door karel van plek te wisselen met Carolien, en dan controleren of de fout nog steeds bij Karel optreedt.

Beste oplossing lijkt me om zowel de loop zelf als de vlookup te herschrijven.

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


Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
Lustucru schreef op vrijdag 25 juni 2021 @ 12:04:
Bijzonder. Er lijkt dus toch een verschil te ontstaan in de waarde van 'WorkerName'.

Zoniet, dan heb je ergens toch iets quircky's te pakken en kan het er ook mee te maken dat vba na een x aantal iteraties een overloop probleempje krijgt. Worksheetfunctions zijn ook nooit bedoeld om in een loop aangeroepen te worden. Zou je kunnen controleren door karel van plek te wisselen met Carolien, en dan controleren of de fout nog steeds bij Karel optreedt.

Beste oplossing lijkt me om zowel de loop zelf als de vlookup te herschrijven.
Mhm, klinkt logisch.
Als ik de 'true' value voor exacte overeenkomst op False zet, loopt ie wel door maar gaat ie rare dingen doen en de verkeerde value's eruit vissen. Je zou zeggen dat als ik m dan op False zou zetten dat hij dan ook zou moeten overloopen?

Ik ga dat nu effetjes testen, zou je mij misschien al wel de juiste richting in kunnen sturen met het herschrijven?

Er is dus een listbox met een hele rits value's (namen van mensen).
Op basis van de naam wil ik graag het mailadres ophalen en in een mail proppen en versturen, en die listbox kan dus verschillende waardes bevatten, afhankelijk van het type planning en de functie die men uitvoert.

Hoe zou ik dat logisch kunnen doen?

Acties:
  • 0 Henk 'm!

  • m-vw
  • Registratie: Mei 2013
  • Laatst online: 11:58

m-vw

Dus?

De code die je plaatst is van createMail ipv createPDF. Wellicht kan je die andere nog eens plaatsen?

Verder zou je dit kunnen proberen:

code:
1
Function getMailAddress(workerName as String)

Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
m-vw schreef op vrijdag 25 juni 2021 @ 12:09:
De code die je plaatst is van createMail ipv createPDF. Wellicht kan je die andere nog eens plaatsen?

Verder zou je dit kunnen proberen:

code:
1
Function getMailAddress(workerName as String)
Thx voor je reactie. Ik heb idd al de string toegekend, dat lost het probleem niet op.
De issue zit ook in createMail, zie nu dat ik de verkeerde heb toegevoegd idd.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Function createMail(workerName As String)
    Dim OutApp As Object
    Dim OutMail As Object
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
    
    Dim weekNumber As String
        weekNumber = getWeek()
    
    Dim newSubject As String
        newSubject = "Planning - " & weekNumber & " - van Mourik Group"
    
    Dim newBody As String
        newBody = "Beste " & workerName & "," & vbNewLine & vbNewLine & _
                "Bijgaand ontvang je de planning voor " & weekNumber & "." & vbNewLine & _
                "Mocht je hier vragen over hebben, neem dan contact op!" & vbNewLine & vbNewLine & _
                "Met vriendelijke groet," & vbNewLine & _
                "Afdeling Planning"
            
    With OutMail
        .To = getMailAddress(workerName)
        .CC = ""
        .BCC = ""
        .subject = newSubject
        .body = newBody
        If getFunction(workerName) <> 6 Then
            .Attachments.Add (getOverviewPath())
        End If
        If getPersonalPlanning(workerName) = 1 Then
            .Attachments.Add (getPersonalPath(workerName))
        End If
        If Sheets("Instellingen").Range("B2").Value = 1 Then
            .Display
        ElseIf Sheets("Instellingen").Range("B2").Value = 0 Then
            .Send
        Else
            MsgBox "Waarde in tab 'Instellingen' is incorrect! Cel B2 moet '0' zijn voor versturen, of '1' voor openen. Andere waarden worden niet geaccepteerd!", vbCritical, "Fout!"
        End If
    End With
    
    On Error GoTo 0

    Set OutMail = Nothing
    Set OutApp = Nothing

End Function


Bijgaand!

Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 01-10 20:18
Lustucru schreef op vrijdag 25 juni 2021 @ 12:04:
Bijzonder. Er lijkt dus toch een verschil te ontstaan in de waarde van 'WorkerName'.

Zoniet, dan heb je ergens toch iets quircky's te pakken en kan het er ook mee te maken dat vba na een x aantal iteraties een overloop probleempje krijgt. Worksheetfunctions zijn ook nooit bedoeld om in een loop aangeroepen te worden. Zou je kunnen controleren door karel van plek te wisselen met Carolien, en dan controleren of de fout nog steeds bij Karel optreedt.

Beste oplossing lijkt me om zowel de loop zelf als de vlookup te herschrijven.
Inderdaad. Vaak is het een dergelijk probleem. Het zit niet in de naam per se, maar daar focus je je op omdat hij bij die betreffende regel overloopt. Je kan dit makkelijk checken door de naam eens te wisselen met een andere naam die eerder wordt aangeroepen. Gebeurt het dan eerder in het proces? Dan zit het idd in de naam. Gebeurt het dan exact op dezelfde regel, dan is het vaak een 'overloop' probleem en moet je het in die hoek zoeken..

Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
ID-College schreef op vrijdag 25 juni 2021 @ 12:13:
[...]

Inderdaad. Vaak is het een dergelijk probleem. Het zit niet in de naam per se, maar daar focus je je op omdat hij bij die betreffende regel overloopt. Je kan dit makkelijk checken door de naam eens te wisselen met een andere naam die eerder wordt aangeroepen. Gebeurt het dan eerder in het proces? Dan zit het idd in de naam. Gebeurt het dan exact op dezelfde regel, dan is het vaak een 'overloop' probleem en moet je het in die hoek zoeken..
Het is géén overloop.
Ik heb de A-Z Sorter eens uitgezet zodat "Karel" op een andere positie terug kwam, en alleen bij deze naam doet hij het dus.

Kan alleen de vinger er niet op leggen hoe en waardoor :(

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Djurres schreef op vrijdag 25 juni 2021 @ 12:08:
[...]


Ik ga dat nu effetjes testen, zou je mij misschien al wel de juiste richting in kunnen sturen met het herschrijven?
Die listbox wordt gevuld, en ik hoop aan de hand van een range op een tabblad? Dan zou je direct door de tabel kunnen lopen en daarmee een functie aanroepen.

code:
1
2
3
4
5
For Each rij In SheetMetMonteursNamen!Range("A1:C2")
    CreateAndSendMail rij.Cells(1, 1), rij.Cells(1, 2)
Next rij

Sub CreateAndSendMail(Monteur as string, MonteurAdres as string)

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


Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
Lustucru schreef op vrijdag 25 juni 2021 @ 12:14:
[...]


Die listbox wordt gevuld, en ik hoop aan de hand van een range op een tabblad? Dan zou je direct door de tabel kunnen lopen en daarmee een functie aanroepen.

code:
1
2
3
4
5
For Each rij In SheetMetMonteursNamen!Range("A1:C2")
    CreateAndSendMail rij.Cells(1, 1), rij.Cells(1, 2)
Next rij

Sub CreateAndSendMail(Monteur as string, MonteurAdres as string)
Ja en nee,
Er zijn meerdere ranges die toegevoegd worden. We hebben nl ons eigen personeel die sowieso een planning ontvangen moeten, en ZZP'ers alleen zodra ze ook daadwerkelijk in de listbox staan. Die listbox word bij de initialization gevuld met álle waarde's die goed zijn.

Zodra een 'workerName" niet bestaat in de range waar alle emailadressen en andere data staat, returned de vLookup gewoon een vbNullstring waardoor er geen mail verstuurd word, dus is het geen scriptbreaking issue, en eigenlijk slaan we het mailen gewoon over.

Acties:
  • +1 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Djurres schreef op vrijdag 25 juni 2021 @ 12:14:
[...]
Ik heb de A-Z Sorter eens uitgezet zodat "Karel" op een andere positie terug kwam, en alleen bij deze naam doet hij het dus.
Dan geeft hij dus een andere waarde aan 'workername'. Doe eens vooraf
debug.print "[" & workername & "]". Als hij namelijk, zoals je schrijft wel doorloopt met exacte match uit, dan vindt vlookup blijkbaar geen exacte match, probeert nb() toe te wijzen aan een string en knalt eruit omdat hij geen foutwaarde aan een string kan toewijzen.

[ Voor 4% gewijzigd door Lustucru op 25-06-2021 12:19 ]

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


Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Djurres schreef op vrijdag 25 juni 2021 @ 12:17:
[...]


Ja en nee,
Er zijn meerdere ranges die toegevoegd worden. We hebben nl ons eigen personeel die sowieso een planning ontvangen moeten, en ZZP'ers alleen zodra ze ook daadwerkelijk in de listbox staan. Die listbox word bij de initialization gevuld met álle waarde's die goed zijn.
Dan gebruik je dat in plaats van de listbox te gebruiken als een soort array variabele

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


Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
Lustucru schreef op vrijdag 25 juni 2021 @ 12:18:
[...]

Dan geeft hij dus een andere waarde aan 'workername'. Doe eens vooraf
debug.print "[" & workername & "]". Als hij namelijk, zoals je schrijft wel doorloopt met exacte match uit, dan vindt vlookup blijkbaar geen exacte match, probeert nb() toe te wijzen aan een string en knalt eruit omdat hij geen foutwaarde aan een string kan toewijzen.
de stringvalue komt goed terug, dat is dus de issue niet.
Ik heb nou de naam even verwijderd uit de 'basis' lijst waar hij het mailadres op zou moeten halen, en dan loopt ie wel door.
Het zit dus in de naam in de basislijst, of de 'opbouw' daar van. Kan een celeigenschap hier invloed op hebben?
Ik ga dat allemaal eens even resetten..

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Wat je schrijft klopt niet:

code:
1
2
Dim mailAddress As String
mailAddress = Application.VLookup(workerName, Sheets("blad1").Range("A1:D150"), 3, False)e


Móet een foutmelding 'typen komen niet overeen' geven als workerName niet voorkomt in kolom A. Geeft de code geen foutmelding dan zit je ergens met on error resume next te prutsen oid.

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


Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
Lustucru schreef op vrijdag 25 juni 2021 @ 12:31:
Wat je schrijft klopt niet:

code:
1
2
Dim mailAddress As String
mailAddress = Application.VLookup(workerName, Sheets("blad1").Range("A1:D150"), 3, False)e


Móet een foutmelding 'typen komen niet overeen' geven als workerName niet voorkomt in kolom A. Geeft de code geen foutmelding dan zit je ergens met on error resume next te prutsen oid.
Ik schaam mij diep.

Wij hebben 2 collega's, een Roland van Dijk, en een Ronald Timmer. (gefingeerd)

Door een typfouten is het geworden;
Ronald van Dijk en Roland Timmer.

Geen on error resume next dus, en uiteindelijk had die gekke vLookup met exacte match gewoon gelijk.

Sorry mannen, :F :F

Acties:
  • 0 Henk 'm!

  • EnerQi
  • Registratie: Maart 2011
  • Laatst online: 30-09 14:14
Exception handling. Wat moet ie doen als ie geen e-mailadres vindt :P

Acties:
  • 0 Henk 'm!

  • Djurres
  • Registratie: Januari 2013
  • Laatst online: 03-09 22:25
EnerQi schreef op vrijdag 25 juni 2021 @ 12:46:
Exception handling. Wat moet ie doen als ie geen e-mailadres vindt :P
Dat zit er precies nú in haha.
Maar ook wat ie moet doen als ie geen juiste waarde terug krijgt!
Pagina: 1