[WORD] Macro toevoeging voor link update header/footer

Pagina: 1
Acties:

Onderwerpen

Vraag


  • CGtweakie
  • Registratie: Augustus 2020
  • Laatst online: 04-08-2023
Beste,

ik heb een word document met een groot aantal links naar een excel file.
Na het aanpassen van de excel, wordt het word document automatisch geupdate.
Op zich heel handig, echter, meerdere mensen maken gebruik van deze excel/word combinatie.

Wat gebeurt er :
De excel file en het word document worden gekopieerd vanaf een centrale plek naar een folder waar de documenten bewerkt gaan worden. De documenten worden hernoemd, waarna de excel file wordt aangepast.
Vervolgens wordt het word document geopend, waar alle links nog steeds verwijzen naar de excel file op de centrale locatie. Nu heeft word geen nette/handige methode om al deze links snel aan te passen naar de hernoemde excel file. (met shift+F9 en replace, kom je een heel eind, maar dit is voor een hoop mensen die met de excel/word werken te ingewikkeld)

Om deze reden gaat het aanpassen van de verwijzing naar deze links met behulp van de volgende macro :

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
Public Sub File_Update()
Dim dlgSelectFile As FileDialog 'FileDialog object
'Dim thisField As Field
Dim selectedFile As Variant 'must be Variant to contain filepath of selected item
Dim newFile As Variant
Dim fieldCount As Integer

'On Error GoTo LinkError

'create FileDialog object as File Picker dialog box
Set dlgSelectFile = Application.FileDialog(FileDialogType:=msoFileDialogFilePicker)

With dlgSelectFile

    .Filters.Clear 'clear filters
    .Filters.Add "Microsoft Excel Files", "*.xls, *.xlsb, *.xlsm, *.xlsx" 'filter for only Excel files
    
'use Show method to display File Picker dialog box and return user's action
    If .Show = -1 Then
        'step through each string in the FileDialogSelectedItems collection
        For Each selectedFile In .SelectedItems
            newFile = selectedFile 'gets new filepath
        Next selectedFile
    Else 'user clicked cancel
        Exit Sub
    End If
End With

Set dlgSelectFile = Nothing

'update fields
fieldCount = ActiveDocument.Fields.Count

For x = 1 To fieldCount
    'Debug.Print x
    'Debug.Print ActiveDocument.Fields(x).Type
    If ActiveDocument.Fields(x).Type = 56 Then 'only update Excel links. Type 56 is an excel link
        ActiveDocument.Fields(x).LinkFormat.SourceFullName = newFile
        'DoEvents
    End If
Next x

MsgBox "Source data has been successfully imported."

Exit Sub

LinkError:

Select Case Err.Number
    Case 5391 'could not find associated Range Name
        MsgBox "Could not find the associated Excel Range Name for one or more links in this document. " & _
            "Please be sure that you have selected a valid Quote Submission input file.", vbCritical

    Case Else
        MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical

End Select

End Sub


Deze macro update echter niet de links in de headers en de footers en ik heb eigenlijk geen idee welke commando's ik moet aanroepen om dit wel voor elkaar te krijgen.
Weet iemand hoe ik het updaten van de links naar het hernoemde bestand in headers en footers in deze macro kan meenemen?
Mijn dank zou groot zijn.

OPGELOST! Voor uitwerking, zie onderste post!

Beste antwoord (via CGtweakie op 27-08-2020 12:16)


  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 23:55

g0tanks

Moderator CSA
Schijnbaar vallen de header en footer niet onder ActiveDocument.Fields. Ik zou denken dat je de header en footer nog even apart moet afgaan door te kijken naar de velden in

code:
1
ActiveDocument.Sections(1).Footers

en
code:
1
ActiveDocument.Sections(1).Headers


https://docs.microsoft.co...a/api/word.headersfooters

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

Alle reacties


  • Patrick_6369
  • Registratie: April 2010
  • Laatst online: 19:49
Ik roep even wat als non-VBA-specialist. Inhoudelijk gaat dit script echt mijn kennis te boven.

Zou je door een macro ouderwets met de hand op te nemen (en dan manueel die links te wijzigen) er achter kunnen komen welke velden het betreft?

Hier zou een handtekening kunnen staan.


  • CGtweakie
  • Registratie: Augustus 2020
  • Laatst online: 04-08-2023
Het probleem is dat dit script de ActiveDocument Fields doorzoekt op links die aangepast moeten worden.
Bij het openen van het word document zijn de headers en footers echter geen actieve document velden.
Ook de niet actieve document velden moeten dus worden meegenomen in dit script. Ik weet alleen het benodigde commando niet :( .

Dank voor je reactie btw Patrick

Even in het kort, de macro doet het volgende :

Opent een folder-keuze-scherm om de nieuwe te linken file aan te wijzen.
Vervolgens worden alle links in word geupdate naar de nieuw toegewezen file.
Een msg box verschijnt met de melding dat de update gelukt is.
De header & footer worden jammer genoeg alleen niet meegenomen :( .

[ Voor 31% gewijzigd door CGtweakie op 27-08-2020 11:17 ]


Acties:
  • +1 Henk 'm!

  • I-King
  • Registratie: Maart 2003
  • Laatst online: 22:58
Ik zie hier iets vermeld over hoe je header/footers kan aanpassen. Gok dat je eigenlijk wel al gezocht had, maar misschien heb je er toch iets aan: https://stackoverflow.com...r-editing-headers-footers

  • CGtweakie
  • Registratie: Augustus 2020
  • Laatst online: 04-08-2023
Ik heb heel het internet afgestruind :( .
Ik ga naar je link kijken I-king :)

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 23:55

g0tanks

Moderator CSA
Schijnbaar vallen de header en footer niet onder ActiveDocument.Fields. Ik zou denken dat je de header en footer nog even apart moet afgaan door te kijken naar de velden in

code:
1
ActiveDocument.Sections(1).Footers

en
code:
1
ActiveDocument.Sections(1).Headers


https://docs.microsoft.co...a/api/word.headersfooters

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


Acties:
  • +1 Henk 'm!

  • CGtweakie
  • Registratie: Augustus 2020
  • Laatst online: 04-08-2023
Het is gelukt met dank aan g0tanks! Hartstikke bedankt!
Headers en footers hebben een range waar je de fields weer van kan controleren.
(hier kwam ik achter na de hint van g0tanks)

De code ziet er dan als volgt uit :

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Public Sub File_Update()
Dim dlgSelectFile As FileDialog 'FileDialog object
'Dim thisField As Field
Dim selectedFile As Variant 'must be Variant to contain filepath of selected item
Dim newFile As Variant
Dim fieldCount As Integer

'On Error GoTo LinkError

'create FileDialog object as File Picker dialog box
Set dlgSelectFile = Application.FileDialog(FileDialogType:=msoFileDialogFilePicker)

With dlgSelectFile

    .Filters.Clear 'clear filters
    .Filters.Add "Microsoft Excel Files", "*.xls, *.xlsb, *.xlsm, *.xlsx" 'filter for only Excel files
    
'use Show method to display File Picker dialog box and return user's action
    If .Show = -1 Then
        'step through each string in the FileDialogSelectedItems collection
        For Each selectedFile In .SelectedItems
            newFile = selectedFile 'gets new filepath
        Next selectedFile
    Else 'user clicked cancel
        Exit Sub
    End If
End With

Set dlgSelectFile = Nothing

'update main document fields
fieldCount1 = ActiveDocument.Fields.Count

For x = 1 To fieldCount1
    'Debug.Print x
    'Debug.Print ActiveDocument.Fields(x).Type
    If ActiveDocument.Fields(x).Type = 56 Then 'only update Excel links. Type 56 is an excel link
        ActiveDocument.Fields(x).LinkFormat.SourceFullName = newFile
        'DoEvents
    End If
Next x

'update footer document fields
fieldCount2 = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range.Fields.Count

For x = 1 To fieldCount2
    If ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range.Fields(x).Type = 56 Then 'only update Excel links. Type 56 is an excel link
        ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range.Fields(x).LinkFormat.SourceFullName = newFile
        'DoEvents
    End If
Next x

'update header document fields
fieldCount3 = ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Fields.Count

For x = 1 To fieldCount3
    If ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Fields(x).Type = 56 Then 'only update Excel links. Type 56 is an excel link
        ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Fields(x).LinkFormat.SourceFullName = newFile
        'DoEvents
    End If
Next x

'Message that link update was succesfull
MsgBox "Source data has been successfully imported."

Exit Sub

LinkError:

Select Case Err.Number
    Case 5391 'could not find associated Range Name
        MsgBox "Could not find the associated Excel Range Name for one or more links in this document. " & _
            "Please be sure that you have selected a valid Quote Submission input file.", vbCritical

    Case Else
        MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical

End Select

End Sub
Pagina: 1