VBA Word 2000 - Hyperlinks non supprimables ?

Fermé
iBenny Messages postés 96 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 3 avril 2022 - 24 déc. 2016 à 04:19
iBenny Messages postés 96 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 3 avril 2022 - 27 déc. 2016 à 16:46
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



A voir également:

9 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
24 déc. 2016 à 13:54
Bonjour,

C'est quoi le code complet ?
0
iBenny Messages postés 96 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 3 avril 2022 2
Modifié par iBenny le 25/12/2016 à 00:11
Bonjour Patrice,

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
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
25 déc. 2016 à 11:37
Bon Noël,

Essaies :
Dim h As Hyperlink
For Each h In Selection.Hyperlinks
  h.Delete
Next hy
0
iBenny Messages postés 96 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 3 avril 2022 2
Modifié par iBenny le 25/12/2016 à 15:09
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 :

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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
25 déc. 2016 à 16:37
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 :

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 

0
iBenny Messages postés 96 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 3 avril 2022 2
Modifié par iBenny le 26/12/2016 à 22:03
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 :

.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
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
26 déc. 2016 à 23:04
- Soit ce code n'est pas complet,
- Soit il y a plusieurs sources d'erreur dans ton code.

Commences ton module par
Option Explicit
0
iBenny Messages postés 96 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 3 avril 2022 2
27 déc. 2016 à 01:27
Déjà présent...
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 779
27 déc. 2016 à 08:06
Alors mets le code complet ....
ou ton fichier sur https://www.cjoint.com/
0
iBenny Messages postés 96 Date d'inscription lundi 23 janvier 2012 Statut Membre Dernière intervention 3 avril 2022 2
Modifié par iBenny le 27/12/2016 à 16:49
0