Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA - Comment empêcher Excel de modifier les liens Hypertexte à l'enregistrement

Dudu2

XLDnaute Barbatruc
Bonjour,

Lorsque le lien hypertexte et le classeur partagent le même début de chemin absolu, à l'enregistrement du classeur, Excel supprime la partie commune du chemin du lien hypertexte qui devient alors un chemin relatif. Et franchement de quoi se mêle-t-il ?!

Car si on utilise ces hyperliens dans un autre contexte (déplacement du classeur, utilisation par un autre classeur), leur relativité n'est plus valable et les liens sont évidemment inopérants.

Démonstration de la modification par Excel des Hyperliens dans le fichier joint.
Et demande d'aide pour savoir si on peut contourner ce comportement d'Excel.
Merci par avance.
 

Pièces jointes

  • TestHyperlien.xlsm
    19.6 KB · Affichages: 24
Dernière édition:
Solution
On devrait normalement pouvoir l'attaquer en lecture écriture avec la propriété application.defaultweboptions ou par l'objet weboptions du classeur, je regarde comment et si on peut.
C'est peut être aussi une option d'enregistrement, je regarde si elle est documentée

@+

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

A part passer par la formule HYPERLINK je ne vois pas sauf à reconstruire tous les liens à l'ouverture du classeur.
VB:
ActiveSheet.Range("E6").Formula = "=HYPERLINK(""" & FichierPhoto & """,""photo"")"

Curieux de voir si une solution simple va émerger

Cordialement
 

Dudu2

XLDnaute Barbatruc
Bonjour @Roblochon,

L'alternative que tu proposes pourrait être une solution. Sachant que pour exploiter le lien par VBA il faut évidemment parser la formule, ce qui n'est pas bien compliqué.

Je vais quand même attendre de voir si une autre solution pointe à l'horizon.
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour Dudu2, Roblochon, le forum

Fichier/Options/Options avancées/Options Web, décocher "mettre à jour les liens avant enregistrement"
Option d'application

Cordialement, @+
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
On devrait normalement pouvoir l'attaquer en lecture écriture avec la propriété application.defaultweboptions ou par l'objet weboptions du classeur, je regarde comment et si on peut.
C'est peut être aussi une option d'enregistrement, je regarde si elle est documentée

@+
 

Dudu2

XLDnaute Barbatruc
Tu as raison...
VB:
Dim objAppWebOptions As Object
  
Set objAppWebOptions = Application.DefaultWebOptions
objAppWebOptions.UpdateLinksOnSave = False
Le problème c'est que c'est une option Application et non Workbook.
Donc elle va rester permanente. Mais à la limite je trouve que c'est mieux car Excel n'a pas à bricoler les Hyperliens.
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
En cherchant dans les docs microsoft, j'ai trouvé cela, ça fonctionne
Application.DefaultWebOptions.UpdateLinksOnSave = False
Application.DefaultWebOptions n'est finalement pas si en lecture seule que ça puisqu'on peut attaquer ses dépendances.
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Le problème c'est que c'est une option Application et non Workbook.
Donc elle va rester permanente. Mais à la limite je trouve que c'est mieux car Excel n'a pas à bricoler les Hyperliens.
je ne vois vraiment pas pourquoi tu ne pourrais pas la gérer comme les autres propriétés d'application style Calculation

@+
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
En tous cas, quand c'est fait manuellement, l'effet est aussi général.
Dans le pire des cas, si on veut ne pas impacter les options par défaut ou courantes:
VB:
    'https://www.excel-downloads.com/threads/vba-comment-empecher-excel-de-modifier-les-liens-hypertexte-a-lenregistrement.20057520
    Dim UpdateLinksOnSave As Boolean
    
    'Sauvegarde de l'option Fichier/Options/Options avancées/Options Web/"Mettre à jour les liens avant enregistrement"
    UpdateLinksOnSave = Application.DefaultWebOptions.UpdateLinksOnSave
    
    'False pour éviter de rendre relatifs les liens partageant le même chemin que le classeur
    Application.DefaultWebOptions.UpdateLinksOnSave = False
    
    '-------------------------
    'Enregistrement du fichier
    '-------------------------
    ThisWorkbook.Save
    
    'Restoration de l'option Fichier/Options/Options avancées/Options Web/"Mettre à jour les liens avant enregistrement"
    Application.DefaultWebOptions.UpdateLinksOnSave = UpdateLinksOnSave
 

Pièces jointes

  • VBA - Comment empêcher Excel de modifier les liens Hypertexte à l'enregistrement.xlsm
    20.6 KB · Affichages: 2
Dernière édition:

Dudu2

XLDnaute Barbatruc
J'ai modifié et repris ton instruction:
VB:
Application.DefaultWebOptions.UpdateLinksOnSave = False
C'est un peu un tout petit peu plus simple que de créer l'objet Application.DefaultWebOptions. et de définir l'option UpdateLinksOnSave.

Par contre ça ne change rien au problème que cette modif est générale et qu'il faut éventuellement la restorer si on veut garder les options Excel en cours.
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
de mémoire, en passant par un objet classeur.weboptions, on récupère un objet comprenant les propriétés weboptions classeur et defaultweboptions héritées de l'application, à voir si on peut accéder en écriture au UpdateLinksOnSave hérité sans toucher au paramètre par défaut.

Bien cordialement, @+
 

Dudu2

XLDnaute Barbatruc
Ce serait logique de penser que le Workbook.WebOptions hérite des settings de l'Application mais hélas, la propriété UpdateLinksOnSave n'est pas reconnue au niveau Workbook.WebOptions.
Et Workbook.DefaultWebOptions n'existe pas et c'est normal.
D'ailleurs niveau Application il y a .WebOptions et .DefaultWebOptions. Ceci explique sans doute cela.

Par contre ce qui n'est pas très logique c'est de ne pas avoir les propriétés du .DefaultWebOptions dans le .WebOptions.
 
Dernière édition:

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour le fil, le forum

oui, elles n'y sont pas toutes, encore une incohérence quoiqu'il y ait certainement une raison mais je ne vois pas laquelle.(peut être un ajout plus tardif et une implémentation bancale de la propriété UpdateLinksOnSave, Vba n'étant pas une priorité de Microsoft)

Bien cordialement, @+
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…