Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Word VBA: Hoe wis ik cache van Fields

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een set standaard Word-bestanden aan het ontwikkelen die vanuit een CRM-systeem aangeroepen en gevuld worden. Dit CRM-systeem maakt een databestand in Word aan en hiermee kan mailmerge worden uitgevoerd. Bij iedere export wordt dit databestand overschreven.
Als ik de standaardvelden gebruik, of ik gebruik aangepaste velden dan werkt alles naar behoren. Echter als ik de gegevens uit deze velden in VBA wil lezen, dan loop ik tegen het probleem aan dat lege velden toch een waarde teruggeven in VBA. Deze waarden blijken uit de geschiedenis te komen en worden dus ergens opgeslagen.
Zo kan het voorkomen dat ik 's-ochtends een export doe van dhr.;P.;van;Beek en 's-middags mevr.;H.;;Jansen. Als ik in VBA de opgehaalde velden ga bekijken, dan zie ik in het 2e geval dat er bij tussenvoegsel 'van' staat.
Hoe kan ik deze 'geschiedenis' wissen via VBA?

  • Swedish Clown
  • Registratie: November 2010
  • Laatst online: 10-04 22:41

Swedish Clown

Erlang <3

Simpel, door al je variabelen telkens leeg aan te maken en vervolgens te vullen :)

Always looking for developers wanting to work with Erlang.


Verwijderd

Topicstarter
Ja, dat zou wel erg dom zijn als ik daar niet aan gedacht had. Uiteraard begin ik daar al mee. Zonder resultaat. Vandaar dit topic ;)

  • Swedish Clown
  • Registratie: November 2010
  • Laatst online: 10-04 22:41

Swedish Clown

Erlang <3

Zonder code is het moeilijk in te schatten of je het wel of niet doet ;)

Kan je de relevante code eens laten zien?

Een "Set variable = Nothing" zou het namelijk moeten opschonen en voorkomen dat je waardes blijft vasthouden. Ziezo zouden al je variabelen vernietigd moeten worden als Word wordt afgesloten dus mijn vermoeden is dat, dat niet gebeurd of?

Zonder code wordt het lastig om je vraag te beantwoorden.

(Telefoon dus sorry voor korte antwoord)

Always looking for developers wanting to work with Erlang.


Verwijderd

Topicstarter
Hierbij mijn code:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
    Dossier_Geslacht = ""
    Dossier_Voorletters = ""
    Dossier_Voorvoegsel = Null ' ""
    Dossier_Achternaam = ""
    Partner_Geslacht = ""
    Partner_Voorletters = ""
    Partner_Voorvoegsel = "bla"
    Partner_Achternaam = ""
    
    
    ' Haal benodigde gegevens op uit Word-velden van databestand.
    For Each fl In ThisDocument.Fields
        fl.ShowCodes = False
        If fl.Type = 59 Then
            If Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Dossier_Geslacht" Then
                Dossier_Geslacht = fl.Result
            End If
        End If
        
        If fl.Type = 59 Then
            If Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Dossier_Voorletters" Then
                Dossier_Voorletters = fl.Result
            End If
        End If
        
        If fl.Type = 59 Then
            If Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Dossier_Voorvoegsel" Then
                Dossier_Voorvoegsel = fl.Result
            End If
        End If
        
        If fl.Type = 59 Then
            If Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Dossier_Achternaam" Then
                Dossier_Achternaam = fl.Result
            End If
        End If
        
        If fl.Type = 59 Then
            If Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Partner_Geslacht" Then
                Partner_Geslacht = fl.Result
            End If
        End If
        
        If fl.Type = 59 Then
            If Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Partner_Voorletters" Then
                Partner_Voorletters = fl.Result
            End If
        End If
        
        If fl.Type = 59 Then
            If Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Partner_Voorvoegsel" Then
                Partner_Voorvoegsel = fl.Result
            End If
        End If
        
        If fl.Type = 59 Then
            If Replace(Trim(Split(fl.Code)(2)), Chr(34), "") = "Partner_Achternaam" Then
                Partner_Achternaam = fl.Result
            End If
        End If
    Next


Spreekt voor zich dat ik geen profi VBA-er ben. Ik kijk aan de andere kant niet heel raar op van een cache-probleem. Heb dit ook al eens meegemaakt in Excel2003, bij het uitlezen van waarden uit een draaitabel.

edit:
Als ik een breakpoint in de For-loop zet, dan zie ik dat de variabele stap voor stap gevuld worden. Als ik de muis op de variabele Dossier_Voorvoegsel zet, dan zie ik de eerste paar keer de waarde Null, dan 1x de waarde "" en daarna de tekst "de", terwijl dit veld in de bron leeg is. Hoop dat deze info meer duidelijkheid over het probleem geeft.

[ Voor 7% gewijzigd door Verwijderd op 27-06-2014 23:43 ]


  • Tribits
  • Registratie: Augustus 2011
  • Laatst online: 02:56

Tribits

Onkruid vergaat niet

Het is me eigenlijk nog steeds niet echt duidelijk wat je nu probeert te bereiken/wat het doel van je code is. Als ik de code die er nu staat uitvoer krijg ik de veldnamen van de merge fields in de bijbehorende variabelen. Als ik Word in 'Preview Results' zet en de code uitvoer krijg ik de waarden van het gemergde document dat op dat moment in de preview wordt getoond. Van enige cache werking is er bij mij geen sprake en ik kan me eigenlijk ook niet echt herinneren daar wel eens tegenaan gelopen te zijn bij het programmeren in VBA.

Overigens geef je aan dat het CRM systeem een databestand in Word aanmaakt maar niet wat voor databestand dat is. Word accepteert een stuk of tien verschillende bestandsformaten voor mailmerge waaronder MDB bestanden, Excel bestanden en Word (document) bestanden. Tevens weet ik niet welke Office versie je draait, ik heb een en ander hier getest met Office 2010 64 bit.

Mocht het de bedoeling zijn om door de individuele records/velden van de data source heen te lopen dan kan dat met de volgende code:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
    With ThisDocument.MailMerge.DataSource
      .ActiveRecord = wdFirstRecord
      x = .ActiveRecord
      .ActiveRecord = wdLastRecord
      y = .ActiveRecord
      For i = x To y
          .ActiveRecord = i
          For Each df In .DataFields
              Debug.Print "Veld " + df.Name + " met waarde " + df.Value
          Next
      Next
    End With


Overigens kan je voorbeeldcode in een stuk minder regels:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
    For Each fl In ThisDocument.Fields
        fl.ShowCodes = False
        
        If fl.Type = wdFieldMergeField Then
            Veld_Naam = Replace(Trim(Split(fl.Code)(2)), Chr(34), "")
            Debug.Print "Veld " + Veld_Naam + " heeft waarde " + fl.Result
            Select Case Veld_Naam
                Case "Dossier_Geslacht"
                    Dossier_Geslacht = fl.Result
                ' -- knip knip knip --
            End Select
        End If
    Next


Als je die debug.print aan je code toevoegt (en eventueel de output hier post voor zover mogelijk) wordt het misschien wat beter inzichtelijk wat er gebeurt.

Master of questionable victories and sheer glorious defeats


Verwijderd

Topicstarter
Het doel van de code is om een e-mail naar een vast e-mailadres te sturen met daarin clientgegevens uit het CRM systeem. Dit kan niet met de standaard functionaliteit van Word, dus vandaar de keuze voor VBA.
Het databestand bestaat uit 2 delen, beiden in Word formaat. 1 met de headers en 1 met de data. Kan helaas niet zeggen waarom hiervoor gekozen is.
Ik snap dat er efficientere code mogelijk is, maar dat lost niet het probleem op dat in VBA sommige velden gevuld worden met gecachte data.

Ik gebruik Word 2010, in een RDP omgeving die draait op Windows 2008R2.

Verwijderd

Topicstarter
Probleem is verholpen. Oorzaak zat niet in code maar in brief waaruit de velden gelezen werden. Deze waren gekopieerd uit een andere brief en werkte prima in de nieuwe brief zelf. Op de achtergrond in VBA werde de waarden uit de oorspronkelijke brief gebruikt.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
@MMMMM (topicreport):
Probleem is opgelost, dus topic mag op slot.
Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde. Een TR (Topic Report Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/icon_hand.gif) kun je gebruiken als een moderator naar een topic moet kijken dat (bijv.) ontspoort (flamen, trollen etc.), spam is of anderszins buiten de geldende forumregels valt ;)

[ Voor 5% gewijzigd door RobIII op 01-07-2014 16:07 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1