VBA Word 2000 - Hyperlinks non supprimables ?

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

9 réponses

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Bonjour,

    C'est quoi le code complet ?
    0
  2. iBenny Messages postés 103 Statut Membre 2
     
    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
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    Bon Noël,

    Essaies :
    Dim h As Hyperlink
    For Each h In Selection.Hyperlinks
      h.Delete
    Next hy
    0
  4. iBenny Messages postés 103 Statut Membre 2
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    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
  7. iBenny Messages postés 103 Statut Membre 2
     
    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
  8. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    - 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
  9. iBenny Messages postés 103 Statut Membre 2
     
    Déjà présent...
    0
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      Alors mets le code complet ....
      ou ton fichier sur https://www.cjoint.com/
      0