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?Aprire il file Excel per la lettura con VBA senza display
risposta
Non sono sicuro se è possibile aprire in modo invisibile in corrente eccellere esempio
È possibile aprire una nuova istanza di Excel, però, 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 scritto, assicurati di ripulire dopo aver finito con le cartelle di lavoro aperte
In Excel, nascondere le cartelle di lavoro e salvarle 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 dell'applicazione. Una tale soluzione sarebbe inappropriata per le cartelle di lavoro degli utenti.
Apri 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
È necessario ricordare di pulire dopo aver finito.
Solo per sottolineare, è necessario eseguire la pulizia dopo aver terminato con un'istanza invisibile. Se non lo fai, l'utente potrebbe non essere in grado di aprire i file excel facendo doppio clic o avviandosi da altre app a meno che non si disconnettano o sappiano come uccidere i processi (perché i file vengono aperti nella finestra invisibile). – David
se che si adatta alle vostre esigenze, vorrei semplicemente utilizzare
Application.ScreenUpdating = False
con l'ulteriore vantaggio di accelerare il vostro codice, invece di rallentarla utilizzando una seconda istanza di Excel.
Anche se hai la risposta, per coloro che trovano questa domanda, è anche possibile aprire un foglio di calcolo Excel come archivio dati JET. Prendendo in prestito la stringa di connessione da un progetto che ho usato su, 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"
nota che "registratiElenco" è 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 solo pensato di aggiungere. :)
È bello !!!! –
funziona per te? sembra non funzionare in Excel 2003 –
@ShawnZhang La maggior parte dei file Excel che abbiamo letto sono stati esportati nel formato 2000/2003 poiché questo è ciò che il programma del mittente emette. Esiste una variante della stringa di connessione che abbiamo testato per i file 2007/2010 che funziona altrettanto bene. – AnonJr
Per aprire una cartella di lavoro come nascosti nella istanza esistente di Excel, l'uso seguente:
Application.ScreenUpdating = False
Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True
ActiveWindow.Visible = False
ThisWorkbook.Activate
Application.ScreenUpdating = True
Grazie, ha funzionato quando uso questo modo: 'ThisWorkbook.Activate: ActiveWindow.Visible = False: Application.ScreenUpdating = FALSE TUTTE LE ALTRE CODICE QUI ' Application.ScreenUpdating = True: ThisWorkbook.Activate: ActiveWindow.Visible = True' Né barra delle applicazioni né sfarfallio del cursore. – sevenkul
Aprire la cartella di lavoro come nascosto e quindi impostare come "salvati" in modo che gli utenti non viene richiesto quando si chiudere.
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, sebbene non venga richiesto di salvare le modifiche nel file Excel da cui si legge. 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 possibile memorizzare il listino prezzi su una posizione condivisa su una rete da qualche parte e renderlo di sola lettura.
Il problema con 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, quindi la soluzione migliore che ho trovato è quella di ridurre al minimo il tempo che la cartella di lavoro aperta è visibile riattivando la finestra originale come rapidamente possibile:
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...
Perché hai bisogno di azioni con 'ActiveWindow'? Penso che nascondere la finestra della cartella di lavoro dopo che è stata aperta ha lo stesso effetto – Winand
Un approccio molto più semplice che non comporta la manipolazione finestre 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 nella cartella di lavoro deve essere sempre 1
. Se qualcuno è a conoscenza di condizioni di gara che lo renderebbero falso, fatemelo sapere.
Arresta il lampeggio nella barra delle applicazioni ma provoca il lampeggiamento del cursore. Persino Application.Cursor non aiuta (in Office 2010 x64). – sevenkul
Vi consiglio vivamente di bloccare il sessione di applicazione prima di aprire la cartella di lavoro di destinazione: 'App.AutomationSecurity = msoAutomationSecurityForceDisable' ' App.EnableEvents = False' ' App.Calculation = xlCalculationManual' - e si potrebbe prendere in considerazione enumerando anche la raccolta di AddIns e la disabilitazione: ** l'avvio lento di componenti aggiuntivi ritarderà l'avvio della sessione dell'app **. –
@Nile Tutti sembrano grandi idee –