121 votes

Comment supprimer l'avertissement "Update Links" ?

J'essaie d'écrire un script qui ouvre plusieurs fichiers Excel. Je continue à obtenir l'invite :

This workbook contains links to other data sources.

Je veux empêcher ce message d'apparaître, afin que mon script puisse simplement parcourir automatiquement tous les classeurs sans que je doive cliquer sur Don't Update pour chacun d'eux. Actuellement, j'utilise les éléments suivants :

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 s'affiche pour les classeurs dont les liens sont rompus. This workbook contains one or more links that cannot be updated parce que j'avais mis DisplayAlerts à faux. Les classeurs sont liés à des fichiers équivalents dans un dossier sur notre serveur Windows, de sorte que lorsque le fichier correspondant est supprimé de ce dossier (ce qui se produit dans le cadre de notre flux d'activités), le lien est rompu. Est-il possible de supprimer l'avertissement lorsque le lien est rompu ?

J'utilise également Excel 2010.

153voto

Peter L. Points 4420

UPDATE :

Après avoir résumé et discuté de tous les détails, j'ai passé deux heures entières à vérifier les options, et cette mise à jour est destinée à mettre au point toutes les options. i s.

Préparations

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

Ensuite, je n'ai modifié que les options Excel suivantes (c'est-à-dire que toutes les autres sont restées telles quelles après l'installation) :

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

Ask to update automatic links

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

External Content

Conditions préalables

J'ai préparé et placé pour C:\ un classeur exactement comme dans @Siddharth Rout suggestions dans sa réponse actualisée (partagée pour votre commodité) : https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx Le livre lié était alors supprimé donc ce lien dans le livre partagé est indisponible (c'est sûr).

Ouverture manuelle

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

AVERTISSEMENT #1

This workbook contains links to other data sources

Après avoir cliqué sur Update Je m'attendais à en recevoir un autre :

AVERTISSEMENT #2

This workbook contains one or more links that cannot be updated

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

Ouverture du 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é (le fichier d'exemple complet avec le code sera partagé à la fin).

1. Application simple.Workbooks.Open

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

Sans 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 aboutit à AVERTISSEMENT #1 et l'une ou l'autre option a été cliquée ( Update / Don't Update ) ne produit AUCUN autre avertissement, à savoir Application.DisplayAlerts = False supprime 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 aboutit à AVERTISSEMENT #2 uniquement, c'est-à-dire Application.AskToUpdateLinks = False supprime AVERTISSEMENT #1 .

4. Faux double

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 sont montrés !

Conclusions

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

  1. Les options d'Excel sont importantes, quelle que soit la version, surtout lorsqu'il s'agit de solutions VBA.
  2. Chaque problème a une solution courte et élégante - ainsi qu'une solution moins évidente et compliquée. Une preuve de plus pour cela)

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

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

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

Ce code fonctionne bien pour moi - il passe en revue TOUS les fichiers Excel spécifiés à l'aide de caractères génériques dans le champ 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

J'ai essayé avec des livres dont les liens externes sont indisponibles - aucun avertissement.

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

28voto

Siddharth Rout Points 63935

Ouvrez l'éditeur VBA d'Excel et tapez ceci dans la fenêtre immédiate (voir capture d'écran).

Application.AskToUpdateLinks = False 

Fermez Excel et ouvrez ensuite votre fichier. Vous ne serez plus invité à le faire. 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 :

enter image description here

EDITAR

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

SUIVI

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

Conditions d'essai

  1. Créer 2 nouveaux fichiers. Nommez-les Sample1.xlsx y Sample2.xlsx et les sauvegarder sur C:\
  2. En cellule A1 de Sample1.xlsx , tapez cette formule ='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. Sauvegarder et fermer les deux fichiers
  4. Supprimer Sample2.xlsx ! !!
  5. Ouvrez un nouveau classeur et son module, collez ce code et exécutez-le. 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

9voto

user2060451 Points 184

Excel 2016 J'ai eu un problème similaire lorsque j'ai créé un classeur/fichier et ensuite j'ai changé les noms mais en quelque sorte l'ancien nom du classeur a été conservé. Après avoir beaucoup googlé... eh bien, je n'ai pas trouvé de réponse définitive...

Allez dans DATA -> Edit Link -> Startup Prompt (en bas) Puis choisissez la meilleure option pour vous.

6voto

Donaldo Almazan Points 91

(Je n'ai pas assez de points de réputation pour ajouter un commentaire, mais je veux apporter un peu de clarté sur les réponses ici)

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

Si la valeur est False, alors MS Excel sera tente de mettre à jour les liens automatiquement, mais ne demande pas à l'utilisateur de le faire au préalable, ce qui est plutôt contre-intuitif.

La solution correcte, si vous cherchez à ouvrir un fichier sans la mise à jour des liens devrait être :

Workbook.Open(UpdateLinks:=0)

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

5voto

Renwick Wright Points 11

Je voulais supprimer l'invite qui demande si vous souhaitez mettre à jour les liens vers un autre classeur lorsque mon classeur est ouvert manuellement dans Excel (par opposition à l'ouverture programmatique via VBA). J'ai essayé d'inclure : Application.AskToUpdateLinks = False comme première ligne de mon Auto_Open() mais cela n'a pas fonctionné. J'ai cependant découvert que si vous le mettez à la place dans la macro Workbook_Open() dans le ThisWorkbook cela fonctionne parfaitement : la boîte de dialogue est supprimée mais la mise à jour s'effectue toujours silencieusement en arrière-plan.

 Private Sub Workbook_Open()
    ' Suppress dialog & update automatically without asking
    Application.AskToUpdateLinks = False
End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X