Comment supprimer l'avertissement des liens de mise à jour?

109

J'essaye d'écrire un script qui ouvre de nombreux fichiers Excel. Je reçois toujours l'invite:

This workbook contains links to other data sources.

Je souhaite empêcher ce message d'apparaître, afin que mon script puisse parcourir automatiquement tous les classeurs sans que je doive cliquer Don't Updatepour chacun d'eux. Actuellement, j'utilise ce qui suit:

function getWorkbook(bkPath as string) as workbook

Application.EnableEvents=False
Application.DisplayAlerts=False
getWorkbook=Workbooks.Open(bkPath,updatelinks:=0,readonly:=false)

end function

Cependant, le message apparaît toujours. Comment puis-je le supprimer?

EDIT: Il semble que ce message arrive pour les classeurs qui ont des liens rompus; Je ne voyais pas le This workbook contains one or more links that cannot be updatedmessage parce que j'avais réglé DisplayAlertssur faux. Les classeurs sont liés à des fichiers équivalents dans un dossier sur notre serveur Windows, donc lorsque le fichier correspondant est supprimé de ce dossier (ce qui se produit dans le cadre de notre flux commercial), le lien se rompt. Est-il possible de supprimer l'avertissement lorsque le lien est rompu?

En outre, j'utilise Excel 2010.

sceau
la source
1
De la discussion avec @SiddharthRout, nous voyons maintenant que la cause est des paramètres différents pour différentes versions d'Excel: vous utilisez probablement Excel 2010 ou une version ultérieure (Siddharth Rout a également 2010), alors que j'utilise 2007 et que je ne vois aucun avertissement si des liens vont bien. Nous allons effectuer d'autres investigations et revenir avec une solution de travail - je l'espère) Maintenant, essayez la réponse de Siddharth Rout.
Peter L.
2
Mon vote positif pour un cas très intéressant!
Peter L.
@PeterL. puisque vous n'obtenez pas les liens de mise à jour même lorsque vous ouvrez le fichier manuellement, je suppose qu'il y a un paramètre qui me manque quelque part. Laissez-moi le tester dans Excel 2007 avant de pouvoir confirmer. :)
Siddharth Rout
Pouvez-vous publier un échantillon d'un fichier problématique? Il serait bon de voir la nature des liens
brettdj
@brettdj, c'est propriétaire, donc je ne peux pas publier un fichier entier. J'examinerai les liens afin de voir s'il y a un problème avec eux.
sigil

Réponses:

139

METTRE À JOUR:

Après tous les détails résumés et discutés, j'ai passé 2 bonnes heures à vérifier les options, et cette mise à jour est à mettre en évidence i.

Les préparatifs

Tout d'abord, j'ai effectué une installation propre d'Office 2010 x86 sur une machine virtuelle Clean Win7 SP1 Ultimate x64 alimentée par VMWare (c'est la routine habituelle pour mes tâches de test quotidiennes, j'en ai donc déployé beaucoup).

Ensuite, j'ai changé uniquement les options Excel suivantes (c'est-à-dire que toutes les autres sont laissées telles quelles après l'installation):

  • Advanced > General > Ask to update automatic links vérifié :

Demander à mettre à jour les liens automatiques

  • Trust Center > Trust Center Settings... > External Content > Enable All... (bien que celui qui concerne les connexions de données ne soit probablement pas important pour le cas):

Contenu externe

Conditions préalables

J'ai préparé et placé C:\un classeur exactement selon les @Siddharth Routsuggestions de sa réponse mise à jour (partagée pour votre commodité): https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx Le livre lié a ensuite été supprimé de sorte que le lien dans le partage le livre n'est pas disponible (bien sûr).

Ouverture manuelle

Le fichier partagé ci-dessus montre à l'ouverture (avec les options Excel énumérées ci-dessus) 2 avertissements - dans l'ordre d'apparition:

AVERTISSEMENT # 1

Ce classeur contient des liens vers d'autres sources de données

Après avoir cliqué sur, Updatej'en ai eu un autre:

AVERTISSEMENT # 2

Ce classeur contient un ou plusieurs liens qui ne peuvent pas être mis à jour

Donc, je suppose que mon environnement de test est maintenant assez similaire à celui de OP's) Jusqu'ici tout va bien, nous allons enfin

Ouverture VBA

Maintenant, je vais essayer toutes les options possibles étape par étape pour rendre l'image claire. Je ne partagerai que les lignes de code pertinentes pour plus de simplicité (un exemple de fichier complet avec le code sera partagé à la fin).

1. Application.Workbooks.Open simple

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"

Pas de surprise - cela produit LES DEUX avertissements, comme pour l'ouverture manuelle ci-dessus.

2. Application.DisplayAlerts = False

Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True

Ce code se termine par AVERTISSEMENT # 1 , et l'une ou l'autre des options cliquées ( Update/ Don't Update) ne produit AUCUN autre avertissement, c'est-à-dire Application.DisplayAlerts = Falsesupprime l' AVERTISSEMENT # 2 .

3. Application.AskToUpdateLinks = False

Application.AskToUpdateLinks = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.AskToUpdateLinks = True

En face de DisplayAlerts, ce code se termine par AVERTISSEMENT # 2 uniquement, c'est-à-dire Application.AskToUpdateLinks = Falsesupprime l' AVERTISSEMENT # 1 .

4. Double faux

Application.AskToUpdateLinks = False
Application.DisplayAlerts = False
Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx"
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True

Apparemment, ce code finit par supprimer les DEUX AVERTISSEMENTS .

5. UpdateLinks: = False

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=False

Enfin, cette solution 1 ligne (proposée à l'origine par @brettdj) fonctionne de la même manière que Double False: AUCUN AVERTISSEMENT n'est affiché!

Conclusions

Sauf une bonne pratique de test et un cas résolu très important (je peux rencontrer de tels problèmes tous les jours en envoyant mes classeurs à une tierce partie, et maintenant je suis prêt), 2 autres choses apprises:

  1. Les options Excel sont importantes, quelle que soit la version - en particulier lorsque nous arrivons aux solutions VBA.
  2. Chaque problème a une solution courte et élégante - avec une solution pas évidente et compliquée. Encore une preuve de cela!)

Merci beaucoup à tous ceux qui ont contribué à la solution, et en particulier à OP qui a soulevé la question. J'espère que mes enquêtes et les étapes de test décrites en détail ont été utiles non seulement pour moi)

Le fichier d'exemple avec les exemples de code ci-dessus est partagé (de nombreuses lignes sont délibérément commentées): https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

Réponse originale (testée pour Excel 2007 avec certaines options):

Ce code fonctionne très bien pour moi - il parcourt TOUS les fichiers Excel spécifiés à l'aide de caractères génériques dans le InputFolder:

Sub WorkbookOpening2007()

Dim InputFolder As String
Dim LoopFileNameExt As String

InputFolder = "D:\DOCUMENTS\" 'Trailing "\" is required!

LoopFileNameExt = Dir(InputFolder & "*.xls?")
Do While LoopFileNameExt <> ""

Application.DisplayAlerts = False
Application.Workbooks.Open (InputFolder & LoopFileNameExt)
Application.DisplayAlerts = True

LoopFileNameExt = Dir
Loop

End Sub

Je l'ai essayé avec des livres avec des liens externes indisponibles - aucun avertissement.

Exemple de fichier: https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

Peter L.
la source
6
Application.DisplayAlerts = Falsene désactivera pas ces avertissements :)
Siddharth Rout
@SiddharthRout Sid Je jure que je ne les vois pas: j'ai un fichier avec de tels liens et je vois l'avertissement en l'ouvrant manuellement. Avec le script ci-dessus - pas d'avertissement) Peut partager la vidéo pour vous))) Excel 2007 - juste au cas où.
Peter L.
Ok, essayez ceci :) Ouvrez deux nouveaux classeurs. Enregistrez-les sous book1.xlsx et book2.xlsx. Dans la cellule A1 de book1, tapez "=" et pointez-le vers la cellule A1 de Book2. Tapez quelque chose dans la cellule A1 de Book2 si vous le souhaitez, puis fermez les deux classeurs. Maintenant, ouvrez book1 en utilisant votre code et vous verrez que vous obtenez toujours l'invite :)
Siddharth Rout
Aussi avant d'exécuter l'exercice ci-dessus, vérifiez ?Application.AskToUpdateLinksdans la fenêtre Exécution. Est-il déjà défini sur false ou est-ce vrai ...
Siddharth Rout
2
+1 à brettdj. Vos clients doivent être satisfaits si tous vos rapports sont similaires)
Ksenia
22

Ouvrez l'éditeur VBA d'Excel et saisissez-le dans la fenêtre d'exécution (voir capture d'écran)

Application.AskToUpdateLinks = False 

Fermez Excel, puis ouvrez votre fichier. Il ne vous le demandera plus. N'oubliez pas de le réinitialiser lorsque vous fermez le classeur, sinon il ne fonctionnera pas non plus pour les autres classeurs.

Capture d'écran :

entrez la description de l'image ici

ÉDITER

Donc, en l'appliquant à votre code, votre code ressemblera à ceci

Function getWorkbook(bkPath As String) As Workbook
    Application.AskToUpdateLinks = False
    Set getWorkbook = Workbooks.Open(bkPath, False)
    Application.AskToUpdateLinks = True
End Function

SUIVRE

Sigil, Le code ci-dessous fonctionne également sur les fichiers avec des liens rompus. Voici mon code de test.

Conditions d'essai

  1. Créez 2 nouveaux fichiers. Nommez-les Sample1.xlsxet Sample2.xlsxenregistrez-les surC:\
  2. Dans la cellule A1de Sample1.xlsx, tapez cette formule='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. Enregistrez et fermez les deux fichiers
  4. Supprimez Sample2.xlsx !!!
  5. Ouvrez un nouveau classeur et son module collez ce code et exécutez Sample. Vous remarquerez que vous n'obtiendrez pas d'invite.

Code

Option Explicit

Sub Sample()
    getWorkbook "c:\Sample1.xlsx"
End Sub

Function getWorkbook(bkPath As String) As Workbook
    Application.AskToUpdateLinks = False
    Set getWorkbook = Workbooks.Open(bkPath, False)
    Application.AskToUpdateLinks = True
End Function
Déroute de Siddharth
la source
3
Ce code a fonctionné pour moi Sid ( dans xl2010 ) en ce sens qu'il a désactivé le message, mais il a mis à jour le lien en arrière-plan. L'utilisation de `Set getWorkbook = Workbooks.Open (bkPath, False)` supprimera l'avertissement et ne pilotera pas la mise à jour. Onto testing xl03 et xl10
brettdj
1
Merci Dave. :) BTW, je suppose que vous vouliez dire xl03 et xl2007: P J'ai également édité le post ci-dessus pour refléter votre suggestion.
Siddharth Rout
1
@brettdj merci beaucoup! Nous avons passé une bonne heure avec Sid ce matin-là à essayer de comprendre le cas. Alors, le code ci-dessus supprimera-t-il tous les avertissements pour n'importe quelle version d'Excel et rendra-t-il les liens mis à jour silencieusement? Et comment dois-je modifier le code pour éviter la mise à jour? Désolé, je suis un peu perdu dans les options, mais j'espère avoir tout expliqué correctement)
Peter L.
@brettdj et que sera-t-il si Application.DisplayAlerts = Falseest également ajouté?
Peter L.
1
@sigil: sans voir votre classeur, je ne pourrai plus commenter. J'ai testé mon code avec différentes conditions et il fonctionne parfaitement. En fait, c'est la bonne façon de supprimer ces alertes ...
Siddharth Rout
6

Excel 2016 J'ai eu un problème similaire lorsque j'ai créé un classeur / fichier, puis j'ai changé les noms, mais l'ancien nom du classeur a été conservé. Après beaucoup de recherches sur Google ... eh bien, je n'ai pas trouvé de réponse finale là-bas ...

Allez dans DONNÉES -> Modifier le lien -> Invite de démarrage (en bas) Ensuite, choisissez la meilleure option pour vous.

user2060451
la source
3
C'est la meilleure solution. Il n'affecte que le classeur pour lequel ce choix est fait et ne nécessite aucun VBA.
Gaia
5

Je voulais supprimer l'invite qui vous demande si vous souhaitez mettre à jour les liens vers un autre classeur lorsque mon classeur est ouvert manuellement dans Excel (au lieu de l'ouvrir par programme via VBA). J'ai essayé d'inclure: Application.AskToUpdateLinks = Falsecomme première ligne de ma Auto_Open()macro mais cela n'a pas fonctionné. J'ai découvert cependant que si vous le mettez à la place dans la Workbook_Open()fonction du ThisWorkbookmodule, cela fonctionne à merveille - le dialogue est supprimé mais la mise à jour se produit toujours silencieusement en arrière-plan.

 Private Sub Workbook_Open()
    ' Suppress dialog & update automatically without asking
    Application.AskToUpdateLinks = False
End Sub
Renwick Wright
la source
Bonne idée; malheureusement, ce projet nécessitait que j'ouvre un ensemble de classeurs dont je ne pouvais pas modifier le contenu. Il n'y aurait donc aucun moyen de définir l' Workbook_Open()événement pour chacun des classeurs de mon ensemble cible.
sceau
3

(Je n'ai pas assez de points de répétition pour ajouter un commentaire, mais je souhaite clarifier les réponses ici)

Application.AskToUpdateLinks = False n'est probablement pas ce que vous voulez.

Si elle est définie à False, MS Excel va tenter de mettre à jour les liens automatiquement l'utilisateur tout simplement pas rapidement à l' avance, contre-intuitif sorta.

La bonne solution, si vous cherchez à ouvrir un fichier sans mettre à jour les liens devrait être:

Workbook.Open (UpdateLinks: = 0)

Lien connexe: Différence dans AskToUpdateLinks = False et UpdateLinks: = 0

Donaldo Almazan
la source
2

J'ai trouvé une solution temporaire qui me permettra au moins de traiter ce travail. J'ai écrit un court script AutoIt qui attend que la fenêtre "Mettre à jour les liens" apparaisse, puis clique sur le bouton "Ne pas mettre à jour". Le code est le suivant:

while 1
if winexists("Microsoft Excel","This workbook contains links to other data sources.") Then
   controlclick("Microsoft Excel","This workbook contains links to other data sources.",2)
EndIf
WEnd

Jusqu'à présent, cela semble fonctionner. J'aimerais vraiment trouver une solution entièrement VBA, afin de pouvoir en faire une application autonome.

sceau
la source
2

J'espère apporter une contribution supplémentaire pour résoudre cette question (ou une partie de celle-ci).

Cela fonctionnera pour ouvrir un Excelfichier à partir d'un autre. Une ligne de code de M. Peter L. , pour le changement, utilisez ce qui suit:

Application.Workbooks.Open Filename:="C:\Book1withLinkToBook2.xlsx", UpdateLinks:=3

C'est dans MSDS. L'effet est qu'il met simplement à jour tout (oui, tout) sans avertissement. Cela peut également être vérifié si vous enregistrez une macro.

Dans MSDS, il fait référence à MS EXCEL 2010et 2013. Je pense que MS EXCEL 2016cela a également couvert.

J'ai MS EXCEL 2013, et j'ai une situation à peu près la même que ce sujet. J'ai donc un fichier (appelez-le A) avec le Workbook_Opencode d'événement qui reste toujours bloqué sur l' invite des liens de mise à jour . J'ai un autre fichier (appelez-le B) connecté à celui-ci et les tableaux croisés dynamiques me forcent à ouvrir le fichier Aafin que le modèle de données puisse être chargé. Puisque je veux ouvrir le Afichier en silence en arrière-plan, j'utilise simplement la ligne que j'ai écrite ci-dessus, avec un Windows("A.xlsx").visible = false, et, mis à part un temps de chargement plus long, j'ouvre le Afichier à partir du Bfichier sans problème ni avertissement, et entièrement mis à jour .

JDF
la source