web-dev-qa-db-fra.com

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

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

This workbook contains links to other data sources.

Je souhaite que ce message n'apparaisse pas afin que mon script puisse simplement parcourir automatiquement tous les classeurs sans que je doive cliquer sur Don't Update pour chacun d'entre 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 comportant des liens rompus. Je ne voyais pas le message This workbook contains one or more links that cannot be updated car j’avais défini DisplayAlerts sur false. Les classeurs sont liés à des fichiers équivalents dans un dossier de notre serveur Windows. Ainsi, lorsque le fichier correspondant est supprimé de ce dossier (ce qui se produit dans le cadre de notre processus commercial), le lien est rompu. Est-il possible de supprimer l'avertissement lorsque le lien est rompu?

De plus, j'utilise Excel 2010.

89
sigil

J'ai trouvé une solution temporaire qui me permettra au moins de traiter ce travail. J'ai écrit un court script AutoIt qui attend la fenêtre "Mettre à jour les liens", puis cliquez 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, cependant, pour pouvoir en faire une application autonome.

2
sigil

METTRE À JOUR:

Après avoir résumé et discuté tous les détails, j'ai passé deux heures à vérifier les options, et cette mise à jour est destinée à tous les is.

Les préparatifs

Tout d'abord, j'ai effectué une installation propre d'Office 2010 x86 sur une machine virtuelle x64 de Clean Win7 SP1 Ultimate optimisée par VMWare (il s'agit de la routine habituelle pour mes tâches de test quotidiennes, donc beaucoup d'entre elles sont déployées).

Ensuite, j’ai modifié 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 linksvérifié:

Ask to update automatic links

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

External Content

Les conditions

J'ai préparé et placé pour C:\ un classeur exactement comme indiqué par les suggestions @Siddharth Rout dans sa réponse mise à jour (partagée pour votre commodité): https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx Le livre lié était alors supprimé pour que le lien dans le livre partagé soit indisponible (à coup sûr).

Ouverture manuelle

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

AVERTISSEMENT N ° 1

This workbook contains links to other data sources

Après avoir cliqué sur Update j'en ai prévu un autre:

AVERTISSEMENT N ° 2

This workbook contains one or more links that cannot be updated

Donc, je suppose que mon environnement de test est à peu près similaire à celui de OP). Jusque là, tout va bien, nous allons enfin passer à

Ouverture VBA

Maintenant, je vais essayer pas à pas toutes les options possibles pour que l’image soit claire. Je ne partagerai que des lignes de code pertinentes par souci de simplicité (le fichier d’exemple complet avec le code sera partagé à la fin).

1. Simple Application.Workbooks.Open

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 WARNING # 1, et l'une ou l'autre des options cliquées (UpdateDon't Update) ne génère AUCUN autre avertissement, c'est-à-dire que Application.DisplayAlerts = False supprime _/WARNING # 2.

3. Application.AskToUpdateLinks = False

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

Contrairement à DisplayAlerts, ce code se termine par WARNING # 2 uniquement, c'est-à-dire que Application.AskToUpdateLinks = False supprime WARNING # 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 BOTH WARNINGS.

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: NO WARNINGS!

Conclusions

Excepté une bonne pratique de test et un cas résolu très important (je peux faire face à de tels problèmes tous les jours lors de l'envoi de mes cahiers d'exercices à une tierce partie, et maintenant je suis prêt), 2 autres choses apprises:

  1. Les options Excel importent, quelle que soit leur version, en particulier pour les solutions VBA.
  2. Chaque problème a une solution courte et élégante - avec une solution pas évidente et compliquée. Juste une preuve de plus pour ça!)

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

Le fichier exemple contenant les exemples 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 parcourt TOUS les fichiers Excel spécifiés à l'aide de caractères génériques dans la variable 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 - pas d'avertissements.

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

115
Peter L.

Ouvrez l'éditeur VBA d'Excel et tapez-le dans la fenêtre Immédiat (voir la capture d'écran)

Application.AskToUpdateLinks = False 

Fermez Excel, puis ouvrez votre fichier. Cela ne vous invitera plus. N'oubliez pas de le réinitialiser lorsque vous fermez le classeur, sinon cela ne fonctionnera pas pour d'autres classeurs.

Capture d'écran :

enter image description here

MODIFIER

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 brisés. Voici mon code de test.

Conditions de test

  1. Créez 2 nouveaux fichiers. Nommez-les Sample1.xlsx et Sample2.xlsx et enregistrez-les sur C:\
  2. Dans la cellule A1 de Sample1.xlsx, tapez cette formule ='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. Enregistrez et fermez les deux fichiers
  4. Supprimer Sample2.xlsx !!!
  5. Ouvrez un nouveau classeur et son module collez ce code et exécutez Sample. Vous remarquerez que vous ne recevrez 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
18
Siddharth Rout

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é . réponse finale là ...

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

4
user2060451

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 (au lieu de l'ouvrir par programme via VBA). J'ai essayé d'inclure: Application.AskToUpdateLinks = False comme première ligne de ma macro Auto_Open() mais cela n'a pas fonctionné. J'ai toutefois découvert que si vous le placez plutôt dans la fonction Workbook_Open() du module ThisWorkbook, cela fonctionne à merveille: la boîte de dialogue est supprimée mais la mise à jour se produit toujours en arrière-plan. 

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

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

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

Si la valeur est False, alors MS Excel tentera de mettre à jour les liens automatiquement. Il ne demandera pas à l'utilisateur d'avance, ce serait plutôt contre-intuitif.

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

Workbook.Open (UpdateLinks: = 0)

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

0
Donaldo Almazan

J'espère pouvoir apporter une contribution supplémentaire à la résolution de cette question (ou d'une partie de celle-ci).

Cela fonctionnera pour ouvrir un fichier Excel depuis 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

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

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

J'ai MS Excel 2013, et ai une situation à peu près la même que ce sujet. J'ai donc un fichier (appelez-le A) avec le code d'événement Workbook_Open qui reste toujours bloqué sur le update links Prompt. J'ai un autre fichier (appelez-le B) connecté à celui-ci, et tableaux croisés dynamiques me force à ouvrir le fichier A afin que le modèle de données puisse être chargé. Comme je veux ouvrir le fichier A en arrière-plan, j'utilise simplement la ligne que j'ai écrite ci-dessus, avec un Windows("A.xlsx").visible = false, et, à part un temps de chargement plus long, j'ouvre le fichier A à partir du fichier B sans aucun problème , et entièrement mis à jour.

0
JDF