Apri il file Excel per la lettura con VBA senza display

Voglio cercare tra i file Excel esistenti con una macro, ma non voglio visualizzare quei file quando vengono aperti dal codice. C’è un modo per aprirli “in sottofondo”, per così dire?

Non sono sicuro di poterli aprire in modo invisibile nell’istanza di Excel corrente

Puoi aprire una nuova istanza di Excel, nasconderlo e quindi aprire le cartelle di lavoro

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 

Come altri hanno pubblicato, assicurati di ripulire dopo aver finito con le cartelle di lavoro aperte

Se questo si adatta alle tue esigenze, lo userei semplicemente

 Application.ScreenUpdating = False 

con l’ulteriore vantaggio di accelerare il codice, invece di rallentarlo utilizzando una seconda istanza di Excel.

Anche se hai la tua risposta, per coloro che trovano questa domanda, è anche ansible aprire un foglio di calcolo Excel come archivio dati JET. Prendendo in prestito la stringa di connessione da un progetto su cui l’ho usato, sembrerà un po ‘come questo:

 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" 

Si noti che “RegistrationList” è il nome della scheda nella cartella di lavoro. Ci sono alcuni tutorial che girano sul web con i dettagli di ciò che puoi e non puoi fare accedendo a un foglio in questo modo.

Ho pensato di aggiungere. 🙂

Per aprire una cartella di lavoro come nascosta nell’istanza esistente di Excel, utilizzare quanto segue:

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

Un approccio molto più semplice che non prevede la manipolazione di windows attive:

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

Da quello che posso dire l’indice di Windows sulla cartella di lavoro dovrebbe essere sempre 1 . Se qualcuno è a conoscenza di condizioni di gara che lo renderebbero falso, fatemelo sapere.

Il problema con entrambe le risposte di iDevlop e Ashok è che il problema fondamentale è un difetto di progettazione di Excel (apparentemente) in cui il metodo Open non rispetta l’impostazione Application.ScreenUpdating di False. Di conseguenza, impostarlo su False non è di alcun beneficio a questo problema.

Se la soluzione di Patrick McDonald è troppo onerosa a causa del sovraccarico di avvio di una seconda istanza di Excel, la soluzione migliore che ho trovato è quella di ridurre al minimo il tempo in cui la cartella di lavoro aperta è visibile ritriggersndo la finestra originale il più rapidamente ansible:

 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... 

Aprili da una nuova istanza di 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 

Devi ricordarti di pulire dopo aver finito.

Aprire la cartella di lavoro come nascosta e quindi impostarla come “salvata” in modo che gli utenti non vengano richiesti quando chiudono.

 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 

Questo è un po ‘derivativo della risposta pubblicata da Ashok.

In questo modo però non ti verrà chiesto di salvare le modifiche nel file Excel di cui stai leggendo. Questo è ottimo se il file di Excel che stai leggendo è inteso come fonte di dati per la convalida. Ad esempio se la cartella di lavoro contiene nomi di prodotti e dati sui prezzi, può essere nascosta e puoi mostrare un file Excel che rappresenta una fattura con menu a discesa per prodotto che convalida da quel listino prezzi.

È quindi ansible memorizzare il listino prezzi su una posizione condivisa su una rete da qualche parte e renderlo di sola lettura.

In Excel, nascondi le cartelle di lavoro e salvale come nascoste. Quando la tua app li carica, non verranno mostrati.

Modifica: dopo la rilettura, è diventato chiaro che queste cartelle di lavoro non fanno parte della tua applicazione. Una tale soluzione sarebbe inappropriata per le cartelle di lavoro degli utenti.