OVH Cloud OVH Cloud

VBA : effacer (sélectivement) liens hypertextes

2 réponses
Avatar
Quetzalcoatl
Bonsoir,

Pourquoi la macro suivante :

For Each LINK In ActiveDocument.Hyperlinks
LINK.Delete
Next

a-t-elle, sous Word 97/2000, un comportement si étrange ?
Elle devrait effacer tous les liens hypertextes, mais n'en efface qu'1 sur 2, ce
qui fait qu'il faut la lancer n+1 fois pour 2^n liens !
Si on remplace "LINK.Delete" par "MsgBox LINK.Range", on voit pourtant bien
défiler *tous* les liens !
Celle ci-dessous fonctionne, mais à quel prix !!!

StartAgain:
TMP = ActiveDocument.Hyperlinks.Count
If TMP = 0 Then Exit Sub
For I = 1 To TMP
On Error GoTo StartAgain
ActiveDocument.Hyperlinks(I).Range.Select
Selection.Delete
Next

Celle-ci aussi, mais elle est bien brutale, qui ne permet pas d'effectuer
quelques tests sur le lien avant de l'effacer !

Selection.WholeStory
Selection.Fields.Unlink

--
Do widzenia

2 réponses

Avatar
Geo
Bonjour Quetzalcoatl


Bonsoir,

Pourquoi la macro suivante :

For Each LINK In ActiveDocument.Hyperlinks
LINK.Delete
Next

a-t-elle, sous Word 97/2000, un comportement si étrange ?
Elle devrait effacer tous les liens hypertextes, mais n'en efface
qu'1 sur 2, ce qui fait qu'il faut la lancer n+1 fois pour 2^n liens
!

Si on remplace "LINK.Delete" par "MsgBox LINK.Range", on voit
pourtant bien défiler *tous* les liens !


C'est le cas pour toutes les suppressions, il y a une logique qui a
été donnée sur ce forum, mais je ne me souveins pas.
En fait il faut partir de la fin et donc le for each ne convient pas.

Celle ci-dessous fonctionne, mais à quel prix !!!

StartAgain:
TMP = ActiveDocument.Hyperlinks.Count
If TMP = 0 Then Exit Sub
For I = 1 To TMP
On Error GoTo StartAgain


Oh ! Horreur

ActiveDocument.Hyperlinks(I).Range.Select
Selection.Delete
Next


Il me semble qu'il vaudrait mieux faire
For i = ActiveDocument.Shapes.Count To 1 Step -1
ActiveDocument.Hyperlinks(i).Range.Select
If condition d'effacement Then
ActiveDocument.Hyperlinks(i).Range.Select.Delete
End If
Next i

Avatar
Quetzalcoatl

Il me semble qu'il vaudrait mieux faire
For i = ActiveDocument.Shapes.Count To 1 Step -1
ActiveDocument.Hyperlinks(i).Range.Select
If condition d'effacement Then
ActiveDocument.Hyperlinks(i).Range.Select.Delete
End If
Next i


Merci beaucoup Geo,

J'ai adapté à mon besoin en :

For i = ActiveDocument.Hyperlinks.Count To 1 Step -1
If Instr (1, ActiveDocument.Hyperlinks(i).Address, "[chaîne
recherchée]",1) then ActiveDocument.Hyperlinks(i).Delete
Next

En effet, il doit y avoir renumérotation après chaque effacement ! Voici
d'ailleurs une autre solution, mais moins "lisible" :

For i = 1 to ActiveDocument.Hyperlinks.count
If Instr (1, ActiveDocument.Hyperlinks(1).Address, "[chaîne
recherchée]",1) then ActiveDocument.Hyperlinks(1).Delete
Next

--
Veloma