Abra o arquivo do Excel para ler com o VBA sem exibir

Eu quero pesquisar através de arquivos existentes do Excel com uma macro, mas eu não quero exibir esses arquivos quando eles são abertos pelo código. Existe uma maneira de tê-los abertos “no fundo”, por assim dizer?

Não tenho certeza se você pode abri-los invisivelmente na instância atual do Excel

Você pode abrir uma nova instância do Excel, ocultá-la e abrir as pastas de trabalho

Dim app as New Excel.Application app.Visible = False 'Visible is False by default, so this isn't necessary Dim book As Excel.Workbook Set book = app.Workbooks.Add(fileName) ' ' Do what you have to do ' book.Close SaveChanges:=False app.Quit Set app = Nothing 

Como outras pessoas postaram, certifique-se de limpar depois de concluir todas as pastas de trabalho abertas

Se isso atender às suas necessidades, eu simplesmente usaria

 Application.ScreenUpdating = False 

com o benefício adicional de acelerar seu código, em vez de diminuí-lo usando uma segunda instância do Excel.

Mesmo que você tenha sua resposta, para aqueles que encontrarem essa pergunta, também é possível abrir uma planilha do Excel como um armazenamento de dados JET. Tomando emprestada a string de conexão de um projeto que eu usei, ela parecerá mais ou menos assim:

 strExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & objFile.Path & ";Extended Properties=""Excel 8.0;HDR=Yes""" strSQL = "SELECT * FROM [RegistrationList$] ORDER BY DateToRegister DESC" 

Observe que “RegistrationList” é o nome da guia na pasta de trabalho. Existem alguns tutoriais flutuando na web com os detalhes do que você pode e não pode acessar uma planilha dessa maneira.

Apenas pensei em adicionar. 🙂

Para abrir uma pasta de trabalho como oculto na instância existente do Excel, use o seguinte:

  Application.ScreenUpdating = False Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True ActiveWindow.Visible = False ThisWorkbook.Activate Application.ScreenUpdating = True 

Uma abordagem muito mais simples que não envolve a manipulação de janelas ativas:

 Dim wb As Workbook Set wb = Workbooks.Open("workbook.xlsx") wb.Windows(1).Visible = False 

Pelo que posso dizer, o índice do Windows na pasta de trabalho deve ser sempre 1 . Se alguém souber de alguma condição de corrida que faria isso falso, por favor me avise.

O problema com as respostas do iDevlop e do Ashok é que o problema fundamental é uma falha no design do Excel (aparentemente) na qual o método Open não respeita a configuração Application.ScreenUpdating do False. Conseqüentemente, configurá-lo como False não é benéfico para esse problema.

Se a solução de Patrick McDonald for muito trabalhosa devido à sobrecarga de iniciar uma segunda instância do Excel, a melhor solução que encontrei é minimizar o tempo que a pasta de trabalho aberta fica visível, reativando a janela original o mais rápido possível:

 Dim TempWkBk As Workbook Dim CurrentWin As Window Set CurrentWin = ActiveWindow Set TempWkBk = Workbooks.Open(SomeFilePath) CurrentWin.Activate 'Allows only a VERY brief flash of the opened workbook TempWkBk.Windows(1).Visible = False 'Only necessary if you also need to prevent 'the user from manually accessing the opened 'workbook before it is closed. 'Operate on the new workbook, which is not visible to the user, then close it... 

Abra-os a partir de uma nova instância do Excel.

 Sub Test() Dim xl As Excel.Application Set xl = CreateObject("Excel.Application") Dim w As Workbook Set w = xl.Workbooks.Add() MsgBox "Not visible yet..." xl.Visible = True w.Close False Set xl = Nothing End Sub 

Você precisa se lembrar de limpar depois de terminar.

Abra a pasta de trabalho como oculto e, em seguida, defina-a como “salva” para que os usuários não sejam avisados ​​quando fecharem.

 Dim w As Workbooks Private Sub Workbook_Open() Application.ScreenUpdating = False Set w = Workbooks w.Open Filename:="\\server\PriceList.xlsx", UpdateLinks:=False, ReadOnly:=True 'this is the data file were going to be opening ActiveWindow.Visible = False ThisWorkbook.Activate Application.ScreenUpdating = True End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) w.Item(2).Saved = True 'this will suppress the safe prompt for the data file only End Sub 

Isso é um pouco derivado da resposta postada por Ashok.

Ao fazer isso dessa forma, você não será solicitado a salvar as alterações de volta no arquivo do Excel. Isso é ótimo se o arquivo do Excel de sua leitura se destina como uma fonte de dados para validação. Por exemplo, se a pasta de trabalho contiver nomes de produtos e dados de preço, ela poderá ser ocultada e você poderá exibir um arquivo do Excel que representa uma fatura com listas suspensas para o produto que valida dessa lista de preços.

Você pode armazenar a lista de preços em um local compartilhado em uma rede e torná-la somente leitura.

No excel, oculte as pastas de trabalho e salve-as como ocultas. Quando seu aplicativo os carregar, eles não serão exibidos.

Editar: após a releitura, ficou claro que essas pastas de trabalho não fazem parte do seu aplicativo. Essa solução seria inadequada para pastas de trabalho do usuário.