Come sopprimere l'avviso di aggiornamento dei collegamenti?


109

Sto cercando di scrivere uno script che apra molti file Excel. Continuo a ricevere il messaggio:

This workbook contains links to other data sources.

Voglio che questo messaggio non venga visualizzato, in modo che il mio script possa passare automaticamente attraverso tutte le cartelle di lavoro senza che io debba fare clic Don't Updatesu ciascuna di esse. Attualmente sto utilizzando quanto segue:

function getWorkbook(bkPath as string) as workbook

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

end function

Tuttavia, il messaggio continua a essere visualizzato. Come posso sopprimerlo?

EDIT: sembra che questo messaggio stia arrivando per cartelle di lavoro che hanno collegamenti interrotti; Non vedevo il This workbook contains one or more links that cannot be updatedmessaggio perché avevo impostato DisplayAlertssu falso. Le cartelle di lavoro sono collegate a file equivalenti in una cartella sul nostro server Windows, quindi quando il file corrispondente viene eliminato da quella cartella (cosa che avviene come parte del nostro flusso aziendale), il collegamento si interrompe. È possibile sopprimere l'avviso quando il collegamento è interrotto?

Inoltre, sto usando Excel 2010.


1
Dalla discussione con @SiddharthRout vediamo ora che la causa sono impostazioni diverse per diverse versioni di Excel: molto probabilmente usi Excel 2010 o successivo (anche Siddharth Rout ha il 2010), mentre io sto usando 2007 e non vedo alcun avviso se i collegamenti sono ok. Eseguiremo altre indagini e torneremo con una soluzione funzionante - lo spero) Ora prova la risposta di Siddharth Rout.
Peter L.

2
Il mio voto positivo per un caso molto interessante!
Peter L.

@PeterL. poiché non ricevi i collegamenti di aggiornamento anche quando apri il file manualmente, immagino che ci sia un'impostazione che mi manca da qualche parte. Fammi provare in Excel 2007 prima di poter confermare. :)
Siddharth Rout

Puoi pubblicare un campione di un file problematico? Sarebbe bello vedere la natura dei collegamenti
brettdj

@brettdj, è proprietario quindi non posso pubblicare un intero file. Studierò i collegamenti in modo da poter vedere se ci sono problemi con loro.
sigil

Risposte:


139

AGGIORNARE:

Dopo che tutti i dettagli sono stati riassunti e discussi, ho passato 2 ore giuste a controllare le opzioni, e questo aggiornamento è quello di punteggiare tutti i.

preparativi

Prima di tutto, ho eseguito un'installazione pulita di Office 2010 x86 sulla macchina virtuale Clean Win7 SP1 Ultimate x64 alimentata da VMWare (questa è la normale routine per le mie attività di test quotidiane, quindi ne ho distribuite molte).

Quindi, ho modificato solo le seguenti opzioni di Excel (cioè tutte le altre vengono lasciate così come sono dopo l'installazione):

  • Advanced > General > Ask to update automatic links controllato :

Chiedi di aggiornare i link automatici

  • Trust Center > Trust Center Settings... > External Content > Enable All... (anche se quello relativo alle connessioni dati molto probabilmente non è importante per il caso):

Contenuto esterno

presupposti

Ho preparato e inserito C:\una cartella di lavoro esattamente secondo i @Siddharth Routsuggerimenti nella sua risposta aggiornata (condivisa per comodità): https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx Il libro collegato è stato quindi eliminato in modo che il collegamento nel libro condiviso il libro non è disponibile (di sicuro).

Apertura manuale

Il file condiviso sopra mostra all'apertura (con le opzioni di Excel sopra elencate) 2 avvisi - nell'ordine di apparizione:

AVVISO # 1

Questa cartella di lavoro contiene collegamenti ad altre origini dati

Dopo aver cliccato su ne Updateho presumibilmente un altro:

AVVISO # 2

Questa cartella di lavoro contiene uno o più collegamenti che non possono essere aggiornati

Quindi, suppongo che il mio ambiente di test ora sia più o meno simile a OP) Fin qui tutto bene, finalmente andiamo a

Apertura VBA

Ora proverò tutte le opzioni possibili passo dopo passo per rendere l'immagine chiara. Condividerò solo le righe di codice rilevanti per semplicità (il file di esempio completo con il codice verrà condiviso alla fine).

1. Semplice Application.Workbooks.Open

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

Nessuna sorpresa: questo produce ENTRAMBI gli avvisi, come per l'apertura manuale sopra.

2. Application.DisplayAlerts = False

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

Questo codice finisce con l' AVVISO # 1 e una delle opzioni cliccate ( Update/ Don't Update) NON produce ulteriori avvisi, cioè Application.DisplayAlerts = Falsesopprime l' AVVISO # 2 .

3. Application.AskToUpdateLinks = False

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

Al contrario DisplayAlerts, questo codice finisce solo con l' AVVISO # 2 , cioè Application.AskToUpdateLinks = Falsesopprime l' AVVISO # 1 .

4. Doppio Falso

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

Apparentemente, questo codice finisce per sopprimere ENTRAMBE LE AVVERTENZE .

5. UpdateLinks: = False

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

Infine, questa soluzione a 1 riga (originariamente proposta da @brettdj) funziona allo stesso modo di Double False: NESSUN AVVISO viene mostrato!

conclusioni

Ad eccezione di una buona pratica di test e di un caso risolto molto importante (potrei affrontare tali problemi ogni giorno mentre invio le mie cartelle di lavoro a terze parti, e ora sono preparato), altre 2 cose imparate:

  1. Le opzioni di Excel sono importanti, indipendentemente dalla versione, soprattutto quando si tratta di soluzioni VBA.
  2. Ogni problema ha una soluzione breve ed elegante, insieme a una non ovvia e complicata. Solo un'altra prova per questo!)

Grazie mille a tutti coloro che hanno contribuito alla soluzione, e in particolare a OP che ha sollevato la domanda. Spero che le mie indagini e le fasi di test accuratamente descritte siano state utili non solo per me)

Il file di esempio con gli esempi di codice sopra è condiviso (molte righe sono commentate deliberatamente): https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

Risposta originale (testata per Excel 2007 con alcune opzioni):

Questo codice funziona bene per me: scorre TUTTI i file Excel specificati utilizzando i caratteri jolly in 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

L'ho provato con libri con link esterni non disponibili - nessun avviso.

File di esempio: https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm


6
Application.DisplayAlerts = Falsenon disabiliterà questi avvisi :)
Siddharth Rout

@ SiddharthRout Sid Giuro di non vederli: ho un file con tali collegamenti e vedo l'avviso mentre lo apro manualmente. Con lo script sopra - nessun avviso) Può condividere video per te))) Excel 2007 - per ogni evenienza.
Peter L.

Ok prova questo :) Apri due nuove cartelle di lavoro. Salvali come book1.xlsx e book2.xlsx. Nella cella A1 di book1, digitare "=" e puntarlo alla cella A1 di Book2. Digita qualcosa nella cella A1 di Book2 se lo desideri, quindi chiudi entrambe le cartelle di lavoro. Ora apri book1 usando il tuo codice e vedrai che ricevi ancora il prompt :)
Siddharth Rout

Inoltre, prima di eseguire l'esercizio precedente, controlla ?Application.AskToUpdateLinksnella finestra Immediata. È già impostato su falso o è vero ...
Siddharth Rout

2
+1 a brettdj. I tuoi clienti devono essere felici se tutti i tuoi rapporti sono simili)
Ksenia

22

Apri l'editor VBA di Excel e digita questo nella finestra immediata (vedi screenshot)

Application.AskToUpdateLinks = False 

Chiudi Excel e quindi apri il file. Non ti verrà chiesto di nuovo. Ricorda di reimpostarlo quando chiudi la cartella di lavoro altrimenti non funzionerà anche per altre cartelle di lavoro.

ScreenShot :

inserisci qui la descrizione dell'immagine

MODIFICARE

Quindi applicandolo al tuo codice, il tuo codice sarà simile a questo

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

AZIONE SUPPLEMENTARE

Sigil, Il codice seguente funziona anche su file con collegamenti interrotti. Ecco il mio codice di prova.

Condizioni di prova

  1. Crea 2 nuovi file. Nome di loro Sample1.xlsxe Sample2.xlsxe salvarli suC:\
  2. Nella cella A1di Sample1.xlsx, digita questa formula='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. Salva e chiudi entrambi i file
  4. Elimina Sample2.xlsx !!!
  5. Apri una nuova cartella di lavoro e il suo modulo incolla questo codice ed esegui Sample. Noterai che non riceverai alcun messaggio.

Codice

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

3
Quel codice ha funzionato per me Sid ( in xl2010 ) in quanto ha disabilitato il messaggio, ma ha aggiornato il collegamento in background. L'uso di "Set getWorkbook = Workbooks.Open (bkPath, False)" eliminerà l'avviso e non guiderà l'aggiornamento. Sul test xl03 e xl10
brettdj

1
Grazie Dave. :) A proposito, immagino che tu intendessi xl03 e xl2007: P Inoltre ho modificato il post sopra per riflettere il tuo suggerimento.
Siddharth Rout

1
@brettdj grazie mille! Quella mattina abbiamo passato una buona ora con Sid cercando di capire il caso. Quindi, il codice sopra sopprimerà tutti gli avvisi per qualsiasi versione di Excel e renderà i collegamenti aggiornati silenziosamente? E come devo modificare il codice per EVITARE l'aggiornamento? Scusa, sono un po 'perso nelle opzioni, ma spero di aver spiegato tutto correttamente)
Peter L.

@brettdj e cosa sarà se Application.DisplayAlerts = Falseviene aggiunto anche lui?
Peter L.

1
@sigil: senza vedere la tua cartella di lavoro, non sarò in grado di commentare ulteriormente. Ho testato il mio codice con diverse condizioni e funziona perfettamente. In effetti è il modo giusto per sopprimere quegli avvisi ...
Siddharth Rout

6

Excel 2016 Ho avuto un problema simile quando ho creato una cartella di lavoro / file e poi ho cambiato i nomi ma in qualche modo è stato mantenuto il vecchio nome della cartella di lavoro. Dopo un sacco di ricerche su Google ... beh, non ho trovato nessuna risposta finale lì ...

Vai a DATI -> Modifica collegamento -> Prompt di avvio (in basso) Quindi scegli l'opzione migliore per te.


3
Questa è la soluzione migliore. Interessa solo la cartella di lavoro per la quale viene effettuata questa scelta e non richiede alcun VBA.
Gaia

5

Volevo sopprimere il prompt che chiede se si desidera aggiornare i collegamenti a un'altra cartella di lavoro quando la mia cartella di lavoro viene aperta manualmente in Excel (invece di aprirla a livello di codice tramite VBA). Ho provato a includere: Application.AskToUpdateLinks = Falsecome prima riga nella mia Auto_Open()macro ma non ha funzionato. Ho scoperto tuttavia che se lo metti invece nella Workbook_Open()funzione nel ThisWorkbookmodulo, funziona in modo brillante: la finestra di dialogo viene soppressa ma l'aggiornamento avviene ancora silenziosamente in background.

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

Buona idea; sfortunatamente, questo progetto richiedeva l'apertura di una serie di cartelle di lavoro il cui contenuto non potevo modificare. Quindi non ci sarebbe modo di impostare l' Workbook_Open()evento per ciascuna delle cartelle di lavoro nel mio set di obiettivi.
sigillo

3

(Non ho abbastanza punti rep per aggiungere un commento, ma voglio aggiungere un po 'di chiarezza sulle risposte qui)

Application.AskToUpdateLinks = False probabilmente non è quello che vuoi.

Se impostato su false, quindi MS Excel si tenta di aggiornare i collegamenti automaticamente semplicemente non chiederà all'utente in anticipo, sorta contro-intuitivo.

La soluzione corretta, se stai cercando di aprire un file senza aggiornare i link dovrebbe essere:

Workbook.Open (UpdateLinks: = 0)

Link correlato: Differenza in AskToUpdateLinks = False e UpdateLinks: = 0


2

Ho trovato una soluzione temporanea che mi consentirà almeno di elaborare questo lavoro. Ho scritto un breve script AutoIt che attende la visualizzazione della finestra "Aggiorna collegamenti", quindi fa clic sul pulsante "Non aggiornare". Il codice è il seguente:

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

Finora sembra funzionare. Tuttavia, mi piacerebbe davvero trovare una soluzione che sia interamente VBA, in modo da renderla un'applicazione autonoma.


2

Spero di dare qualche input in più per risolvere questa domanda (o parte di essa).

Questo funzionerà per aprire un Excelfile da un altro. Una riga di codice del Sig. Peter L. , per la modifica, utilizzare quanto segue:

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

Questo è dentro MSDS. L'effetto è che aggiorna tutto (sì, tutto) senza preavviso. Questo può essere verificato anche se registri una macro.

In MSDS, si riferisce a MS EXCEL 2010e 2013. Penso che MS EXCEL 2016abbia coperto anche questo.

Ho MS EXCEL 2013e ho una situazione più o meno la stessa di questo argomento. Quindi ho un file (chiamalo A) con Workbook_Opencodice evento che rimane sempre bloccato nel prompt dei collegamenti di aggiornamento . Ho un altro file (chiamalo B) collegato a questo e le tabelle pivot mi costringono ad aprire il file in Amodo che il modello di dati possa essere caricato. Siccome voglio aprire il Afile silenziosamente in background, mi limito ad usare la riga che ho scritto sopra, con una Windows("A.xlsx").visible = false, e, a parte un tempo di caricamento maggiore, apro il Afile dal Bfile senza problemi o avvisi e completamente aggiornato .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.