Como suprimir o aviso de Links de Atualização?

109

Estou tentando escrever um script que abre muitos arquivos do Excel. Eu continuo recebendo o prompt:

This workbook contains links to other data sources.

Quero evitar que essa mensagem apareça, para que meu script possa percorrer automaticamente todas as pastas de trabalho, sem que eu precise clicar Don't Updateem cada uma. Atualmente estou usando o seguinte:

function getWorkbook(bkPath as string) as workbook

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

end function

No entanto, a mensagem ainda está aparecendo. Como posso suprimir isso?

EDIT: Parece que esta mensagem está chegando para pastas de trabalho que têm links quebrados; Eu não estava vendo a This workbook contains one or more links that cannot be updatedmensagem porque havia definido DisplayAlertscomo falso. As pastas de trabalho são vinculadas a arquivos equivalentes em uma pasta em nosso servidor Windows, portanto, quando o arquivo correspondente é excluído dessa pasta (o que acontece como parte de nosso fluxo de negócios), o link é quebrado. É possível suprimir o aviso quando o link é quebrado?

Além disso, estou usando o Excel 2010.

sigilo
fonte
1
A partir da discussão com @SiddharthRout, vemos agora que a causa são as diferentes configurações para diferentes versões do Excel: muito provavelmente você usa o Excel 2010 ou posterior (Siddharth Rout tem 2010 também), enquanto eu estou usando o 2007 e não vejo nenhum aviso se houver links estão bem. Faremos mais algumas investigações e voltaremos com a solução de trabalho - espero que sim). Agora tente a resposta de Siddharth Rout.
Peter L.
2
Meu voto positivo para um caso muito interessante!
Peter L.
@PeterL. uma vez que você não está recebendo os links de atualização, mesmo quando abre o arquivo manualmente, acho que há uma configuração que está faltando em algum lugar. Deixe-me testá-lo no Excel 2007 antes de confirmar. :)
Siddharth Rout
Você pode postar uma amostra de um arquivo com problema? Seria bom ver a natureza dos links
brettdj
@brettdj, é proprietário, então não posso postar um arquivo inteiro. Vou investigar os links para ver se há algum problema com eles.
sigilo de

Respostas:

139

ATUALIZAR:

Depois de todos os detalhes resumidos e discutidos, passei 2 horas justas verificando as opções, e essa atualização é para pontuar todos os is.

Preparativos

Em primeiro lugar, executei uma instalação limpa do Office 2010 x86 na máquina virtual Clean Win7 SP1 Ultimate x64 com VMWare (essa é uma rotina normal para minhas tarefas diárias de teste, portanto, tenho muitos deles implantados).

Em seguida, alterei apenas as seguintes opções do Excel (ou seja, todas as outras são deixadas como estão após a instalação):

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

Peça para atualizar links automáticos

  • Trust Center > Trust Center Settings... > External Content > Enable All... (embora aquele relacionado às conexões de dados provavelmente não seja importante para o caso):

Conteúdo Externo

Condições prévias

Eu preparei e coloquei em C:\uma pasta de trabalho exatamente de acordo com as @Siddharth Routsugestões de sua resposta atualizada (compartilhada para sua conveniência): https://www.dropbox.com/s/mv88vyc27eljqaq/Book1withLinkToBook2.xlsx O livro vinculado foi então excluído para que o link no link compartilhado livro não está disponível (com certeza).

Abertura Manual

O arquivo compartilhado acima mostra ao abrir (tendo as opções do Excel listadas acima) 2 avisos - na ordem em que aparecem:

AVISO # 1

Este livro contém links para outras fontes de dados

Depois de clicar em Update, esperava receber outro:

AVISO # 2

Este livro contém um ou mais links que não podem ser atualizados

Então, suponho que meu ambiente de teste agora é muito semelhante ao OPde) Até agora tudo bem, finalmente vamos para

Abertura VBA

Agora vou tentar todas as opções possíveis, passo a passo, para deixar a imagem clara. Vou compartilhar apenas linhas de código relevantes para simplificar (o arquivo de amostra completo com o código será compartilhado no final).

1. Aplicativo simples.Livros de trabalho.Abrir

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

Nenhuma surpresa - isso produz AMBOS avisos, como para a abertura manual acima.

2. Application.DisplayAlerts = False

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

Este código termina com o AVISO # 1 , e qualquer opção clicada ( Update/ Don't Update) NÃO produz nenhum aviso adicional, ou seja, Application.DisplayAlerts = Falsesuprime o AVISO # 2 .

3. Application.AskToUpdateLinks = False

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

Ao contrário DisplayAlerts, este código termina apenas com o AVISO # 2 , ou seja, Application.AskToUpdateLinks = Falsesuprime o AVISO # 1 .

4. Duplo Falso

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

Aparentemente, esse código acaba suprimindo AMBOS OS AVISOS .

5. UpdateLinks: = False

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

Finalmente, esta solução de 1 linha (originalmente proposta por @brettdj) funciona da mesma maneira que Double False: NENHUM AVISO é mostrado!

Conclusões

Exceto uma boa prática de teste e um caso resolvido muito importante (posso enfrentar esses problemas todos os dias ao enviar minhas pastas de trabalho para terceiros, e agora estou preparado), mais 2 coisas aprendidas:

  1. As opções do Excel são IMPORTANTES, independentemente da versão - especialmente quando se trata de soluções VBA.
  2. Todo problema tem solução curta e elegante - junto com uma solução não óbvia e complicada. Só mais uma prova disso!)

Muito obrigado a todos que contribuíram para a solução e, especialmente, ao OP que levantou a questão. Espero que minhas investigações e etapas de teste completamente descritas tenham sido úteis não só para mim)

O arquivo de amostra com as amostras de código acima é compartilhado (muitas linhas são comentadas deliberadamente): https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

Resposta original (testada para Excel 2007 com certas opções):

Este código funciona bem para mim - ele percorre TODOS os arquivos do Excel especificados usando curingas em 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

Tentei com livros com links externos indisponíveis - sem avisos.

Arquivo de amostra: https://www.dropbox.com/s/9bwu6pn8fcogby7/NoWarningsOpen.xlsm

Peter L.
fonte
6
Application.DisplayAlerts = Falsenão desativará esses avisos :)
Siddharth Rout
@SiddharthRout Sid Juro que não os vejo: tenho um arquivo com esses links e vejo o aviso ao abri-lo manualmente. Com o script acima - sem avisos) Pode compartilhar vídeo para você))) Excel 2007 - apenas no caso.
Peter L.
Ok, tente isso :) Abra duas novas pastas de trabalho. Salve-os como book1.xlsx e book2.xlsx. Na célula A1 do livro1, digite "=" e aponte para a célula A1 do livro2. Digite algo na célula A1 de Book2 se desejar e feche ambas as pastas de trabalho. Agora abra o book1 usando seu código e verá que ainda recebe o prompt :)
Siddharth Rout
Além disso, antes de executar o exercício acima, verifique ?Application.AskToUpdateLinksna janela Imediata. Já está definido como falso ou é verdade ...
Siddharth Rout
2
+1 para brettdj. Seus clientes devem ficar satisfeitos se todos os seus relatórios forem semelhantes)
Ksenia
22

Abra o editor VBA do Excel e digite-o na janela imediata (veja a captura de tela)

Application.AskToUpdateLinks = False 

Feche o Excel e abra seu arquivo. Não vai perguntar a você novamente. Lembre-se de redefini-lo ao fechar a pasta de trabalho, caso contrário, ela não funcionará também com outras pastas de trabalho.

ScreenShot :

insira a descrição da imagem aqui

EDITAR

Então, aplicando-o ao seu código, seu código ficará assim

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

ACOMPANHAMENTO

Sigil, O código abaixo também funciona em arquivos com links quebrados. Aqui está meu código de teste.

Condições de Teste

  1. Crie 2 novos arquivos. Nomeie-os Sample1.xlsxe Sample2.xlsxsalve-os emC:\
  2. Na célula A1de Sample1.xlsx, digite esta fórmula='C:\[Sample2.xlsx]Sheet1'!$A$1
  3. Salve e feche ambos os arquivos
  4. Exclua Sample2.xlsx !!!
  5. Abra uma nova pasta de trabalho e seu módulo cole este código e execute Sample. Você notará que não receberá um prompt.

Código

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
Siddharth Rout
fonte
3
Esse código funcionou para mim, Sid ( no xl2010 ), pois desabilitou a mensagem, mas atualizou o link em segundo plano. Usar `Set getWorkbook = Workbooks.Open (bkPath, False)` suprimirá o aviso e não conduzirá a atualização. Para testar xl03 e xl10
brettdj
1
Obrigado Dave. :) BTW, acho que você quis dizer xl03 e xl2007: P Também editei o post acima para refletir sua sugestão.
Siddharth Rout
1
@brettdj muito obrigado! Passamos uma boa hora com Sid naquela manhã tentando entender o caso. Portanto, o código acima suprimirá todos os avisos de qualquer versão do Excel e atualizará os links silenciosamente? E como devo modificar o código para EVITAR a atualização? Desculpe, estou um pouco perdido nas opções, mas espero ter explicado tudo corretamente)
Peter L.
@brettdj e o que será se Application.DisplayAlerts = Falsefor adicionado também?
Peter L.
1
@sigil: Sem ver sua apostila, não poderei comentar mais. Testei meu código em diferentes condições e ele funciona perfeitamente. Na verdade, é a maneira certa de suprimir esses alertas ...
Siddharth Rout
6

Excel 2016 Tive um problema semelhante ao criar uma pasta de trabalho / arquivo e depois alterar os nomes, mas de alguma forma o nome da pasta de trabalho antiga foi mantido. Depois de muito pesquisar no Google ... bem, não encontrei nenhuma resposta final lá ...

Vá para DADOS -> Editar Link -> Prompt de Inicialização (na parte inferior) Em seguida, escolha a melhor opção para você.

user2060451
fonte
3
essa é a melhor solução. Afeta apenas a pasta de trabalho para a qual essa escolha foi feita e não requer nenhum VBA.
Gaia
5

Eu queria suprimir o prompt que pergunta se você deseja atualizar links para outra pasta de trabalho quando minha pasta de trabalho é aberta manualmente no Excel (em vez de abri-la programaticamente via VBA). Tentei incluir: Application.AskToUpdateLinks = Falsecomo a primeira linha em minha Auto_Open()macro, mas não funcionou. No entanto, descobri que, se você colocá-lo na Workbook_Open()função do ThisWorkbookmódulo, ele funciona perfeitamente - a caixa de diálogo é suprimida, mas a atualização ainda ocorre silenciosamente em segundo plano.

 Private Sub Workbook_Open()
    ' Suppress dialog & update automatically without asking
    Application.AskToUpdateLinks = False
End Sub
Renwick Wright
fonte
Boa ideia; infelizmente, este projeto exigiu que eu abrisse um conjunto de pastas de trabalho cujo conteúdo não pude modificar. Portanto, não haveria como definir o Workbook_Open()evento para cada uma das pastas de trabalho em meu conjunto de destino.
sigilo de
3

(Não tenho pontos de representação suficientes para adicionar um comentário, mas quero adicionar alguma clareza nas respostas aqui)

Application.AskToUpdateLinks = False provavelmente não é o que você deseja.

Se definido como falso, então MS Excel irá tentar atualizar os links automaticamente ele simplesmente não solicitará que o usuário de antemão, contra-intuitivo sorta.

A solução correta, se você deseja abrir um arquivo sem atualizar os links, deve ser:

Workbook.Open (UpdateLinks: = 0)

Link relacionado: Diferença em AskToUpdateLinks = False e UpdateLinks: = 0

Donaldo Almazan
fonte
2

Encontrei uma solução temporária que pelo menos me permitirá processar este trabalho. Eu escrevi um pequeno script AutoIt que espera a janela "Atualizar Links" aparecer e então clico no botão "Não Atualizar". O código é o seguinte:

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

Até agora, isso parece estar funcionando. Eu realmente gostaria de encontrar uma solução que seja inteiramente VBA, no entanto, para que eu possa tornar este um aplicativo independente.

sigilo
fonte
2

Espero dar alguma contribuição extra para resolver esta questão (ou parte dela).

Isso funcionará para abrir um Excelarquivo de outro. Uma linha de código do Sr. Peter L. , para a mudança, use o seguinte:

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

Isso está dentro MSDS. O efeito é que ele apenas atualiza tudo (sim, tudo) sem nenhum aviso. Isso também pode ser verificado se você gravar uma macro.

Em MSDS, refere-se a MS EXCEL 2010e 2013. Estou pensando que MS EXCEL 2016isso também está coberto.

Eu tenho MS EXCEL 2013, e tenho uma situação muito parecida com a deste tópico. Portanto, tenho um arquivo (chame-o A) com Workbook_Opencódigo de evento que sempre fica travado no prompt de links de atualização . Eu tenho outro arquivo (chamá-lo B) conectado a este, e as tabelas dinâmicas me forçam a abrir o arquivo Apara que o modelo de dados possa ser carregado. Como quero abrir o Aarquivo silenciosamente em segundo plano, apenas uso a linha que escrevi acima, com um Windows("A.xlsx").visible = false, e, além de um maior tempo de carregamento, abro o Aarquivo do Barquivo sem problemas ou avisos, e totalmente atualizado .

JDF
fonte