VBA Word 2000 - Hyperlinks non supprimables ?
iBenny
Messages postés
103
Statut
Membre
-
iBenny Messages postés 103 Statut Membre -
iBenny Messages postés 103 Statut Membre -
Bonjour,
Il m'arrive qqe fois (rarement) que des liens refusent de se supprimer avec ma macro .Hyperlinks(1).Delete ou .Range.Hyperlinks(1).Delete provoquant ainsi une erreur mystérieuse 4198 faisant que ma procédure se 'ferme' et que mon code se poursuive plus haut dans la pile d'appel !
Qu'est-ce qui pourrait causer cela ?
Merci d'avance de votre aide,
iBenny
Il m'arrive qqe fois (rarement) que des liens refusent de se supprimer avec ma macro .Hyperlinks(1).Delete ou .Range.Hyperlinks(1).Delete provoquant ainsi une erreur mystérieuse 4198 faisant que ma procédure se 'ferme' et que mon code se poursuive plus haut dans la pile d'appel !
Qu'est-ce qui pourrait causer cela ?
Merci d'avance de votre aide,
iBenny
A voir également:
- VBA Word 2000 - Hyperlinks non supprimables ?
- Word 2013 - Télécharger - Traitement de texte
- Supprimer une page word - Guide
- Tableau word - Guide
- Espace insécable word - Guide
- Word et excel gratuit - Guide
9 réponses
Bonjour Patrice,
L'essentiel est là ! Je peux fournir un échantillon de fichier .doc avec la macro intégrée si besoin est... ou le code complet de la procédure...
PS: Joyeux Noël !!!
iBenny
With Selection .Hyperlinks(1).Delete 'ou .Range..Hyperlinks(1).Delete End With
L'essentiel est là ! Je peux fournir un échantillon de fichier .doc avec la macro intégrée si besoin est... ou le code complet de la procédure...
PS: Joyeux Noël !!!
iBenny
Bonjour Patrice,
Votre suggestion est correcte mais j'ai déjà une boucle dans mon code permettant de sélectionner chaque liens à tour de rôle et décider ou non de le supprimer. Ça donne ceci :
La "PROCÉDURE DE SUPPRESSION" comme telle a un "pare feu" : 'On Error Resume Next' afin de contrôler l'erreur 'mystérieuse'. S'il y a erreur, il y a trois tentatives de procéder et un arrêt à la quatrième.
Benoit
Votre suggestion est correcte mais j'ai déjà une boucle dans mon code permettant de sélectionner chaque liens à tour de rôle et décider ou non de le supprimer. Ça donne ceci :
Sub LinkSearchNform()
'
' LinkSearchNform Macro
' Macro enregistrée le 12-11-07 par Benoit
'
Dim Lnk As Byte, x, ici As Long
Dim Del As Boolean, Col As Boolean, KeepTous As Boolean, Asked As Boolean, DelTous As Boolean
Lnk = ActiveDocument.Hyperlinks.Count -LinksB4 +1
ici = .Start
With Selection
Application.Browser.Target = wdBrowseField
Do While Lnk
x = 0
Lnk = Lnk - 1
Application.Browser.Next
If .Start <= ici Or .Start > ivvi Or Lnk = 0 Then Exit Do
If .Font.Size = 10 Then
If Not Asked Then
If MsgBox("SUPPRIMER Tous les liens ?", vbYesNo + vbQuestion, "Hyperliens") = vbYes Then
DelTous = True
ElseIf MsgBox("CONSERVER Tous les liens ?", vbYesNo + vbDefaultButton2 + vbQuestion, "Hyperliens") = vbYes Then
KeepTous = True
End If
Asked = True
End If
If Not (KeepTous Or DelTous) Then
If MsgBox("Effacer le lien ?", vbQuestion + vbYesNo, "HYPERLIENS") = vbYes Then Del = True
End If
Else
Del = True
End If
'========================
'PROCÉDURE DE SUPPRESSION
'========================
If Del Or DelTous Then
Do
x = x + 1
If Err.Number Then
If x = 2 Then
.Font.Color = wdColorRed
.Collapse
.Move
End If
On Error GoTo 0
End If
On Error Resume Next
Select Case x
Case 1 To 2
.Hyperlinks(1).Delete
Case 3
.Range.Hyperlinks(1).Delete
Case Else
MsgBox "ÉCHEC de suppression de lien !", , "HYPERLINKS"
Stop
End Select
Loop While Err.Number
If Not DelTous Then Del = False
End If
Loop
.SetRange IvI, IvI
End With
End Sub
La "PROCÉDURE DE SUPPRESSION" comme telle a un "pare feu" : 'On Error Resume Next' afin de contrôler l'erreur 'mystérieuse'. S'il y a erreur, il y a trois tentatives de procéder et un arrêt à la quatrième.
Benoit
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re,
1) Une boucle d'analyse du type "For Each Objet In Collection" ne s'exécute que s'il existe au moins un objet dans la collection, ce qui n'est pas le cas de ton code. L'erreur vient très probablement de là.
2) Le VBA Word n'est pas ma spécialité mais ça reste du VBA. Plutôt qu'utiliser Resume Next sans aucune autre vérification, tu devrais écrire un véritable gestionnaire d'erreur du style :
1) Une boucle d'analyse du type "For Each Objet In Collection" ne s'exécute que s'il existe au moins un objet dans la collection, ce qui n'est pas le cas de ton code. L'erreur vient très probablement de là.
2) Le VBA Word n'est pas ma spécialité mais ça reste du VBA. Plutôt qu'utiliser Resume Next sans aucune autre vérification, tu devrais écrire un véritable gestionnaire d'erreur du style :
Sub xxx()
' code sans risque d'erreur
' ...
On Error GoTo ErrorHandler
' Instructions à risque
'...
On Error GoTo 0
' suite du code
' ...
Exit Sub
ErrorHandler: 'Routine de gestion d'erreur.
'Évalue le numéro d'erreur.
Select Case Err.Number 'ou Err.description
Case xxx
'Traitement de l'erreur xxx
' ...
Resume ' ou Resume Next selon le cas
Case xxy
'Traitement de l'erreur xxy
' ...
Resume ' ou Resume Next selon le cas
Case Else
MsgBox Err.description, vbCritical
End
End Select
End Sub
Bonjour,
Vous dites : [1) Une boucle d'analyse du type "For Each Objet In Collection" ne s'exécute que s'il existe au moins un objet dans la collection, ce qui n'est pas le cas de ton code. L'erreur vient très probablement de là. ]
Je sais, et l'erreur ne viens PAS de là! Je ne peux pas utiliser cette boucle car elle va traiter tous les liens en partant du premier. Moi je dois les traiter à partir du dernier, remonter les liens et arrêter à un point précis limitant la sélection au dernier collage d'un long document. Je dois donc utiliser (.range).HyperLinks(x) pour se faire, ou le Application.Browser.Next.
Ce qui est curieux est qu'en utilisant l'enregistreur de macro, je réussis à supprimer le lien 'mystérieux' via la touche clavier 'menu contextuel' > Lien hypertexte > Supprimer le lien hypertexte, ce qui génère le code :
alors qu'implémenté dans mes macros, ça ne fonctionne pas.
Idem en passant par le menu 'Insretion > Lien hypertexte > Bouton : Supprimer le lien'.
Le problème est que je ne connais pas le SendKeys ni la procédure pour activer le menu contextuel, et qu'en utilisant le SendKeys pour activer la fenêtre de gestion des Hyperliens (Ctrl K), une fois apparue, impossible d'interagir avec cette dernière (elle paralyse le code).
La différence entre ce lien 'mystérieux' et un lien normal est :

et

Où 'Objet supprimé' qualifie le lien 'mystérieux' !
iBenny
Vous dites : [1) Une boucle d'analyse du type "For Each Objet In Collection" ne s'exécute que s'il existe au moins un objet dans la collection, ce qui n'est pas le cas de ton code. L'erreur vient très probablement de là. ]
Je sais, et l'erreur ne viens PAS de là! Je ne peux pas utiliser cette boucle car elle va traiter tous les liens en partant du premier. Moi je dois les traiter à partir du dernier, remonter les liens et arrêter à un point précis limitant la sélection au dernier collage d'un long document. Je dois donc utiliser (.range).HyperLinks(x) pour se faire, ou le Application.Browser.Next.
Ce qui est curieux est qu'en utilisant l'enregistreur de macro, je réussis à supprimer le lien 'mystérieux' via la touche clavier 'menu contextuel' > Lien hypertexte > Supprimer le lien hypertexte, ce qui génère le code :
.Range.HyperLinks(1).Delete
alors qu'implémenté dans mes macros, ça ne fonctionne pas.
Idem en passant par le menu 'Insretion > Lien hypertexte > Bouton : Supprimer le lien'.
Le problème est que je ne connais pas le SendKeys ni la procédure pour activer le menu contextuel, et qu'en utilisant le SendKeys pour activer la fenêtre de gestion des Hyperliens (Ctrl K), une fois apparue, impossible d'interagir avec cette dernière (elle paralyse le code).
La différence entre ce lien 'mystérieux' et un lien normal est :

et

Où 'Objet supprimé' qualifie le lien 'mystérieux' !
iBenny
- Soit ce code n'est pas complet,
- Soit il y a plusieurs sources d'erreur dans ton code.
Commences ton module par
Option Explicit
- Soit il y a plusieurs sources d'erreur dans ton code.
Commences ton module par
Option Explicit