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.
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.
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 i
s.
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 links
vérifié: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):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).
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
Après avoir cliqué sur Update
j'en ai prévu un autre:
AVERTISSEMENT N ° 2
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 à
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 (Update
Don'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!
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:
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
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 :
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
Sample1.xlsx
et Sample2.xlsx
et enregistrez-les sur C:\
A1
de Sample1.xlsx
, tapez cette formule ='C:\[Sample2.xlsx]Sheet1'!$A$1
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
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.
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
(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
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.