Ich möchte vorhandene Excel-Dateien mit einem Makro durchsuchen, diese Dateien jedoch nicht anzeigen, wenn sie vom Code geöffnet werden. Gibt es eine Möglichkeit, sie sozusagen "im Hintergrund" zu öffnen?
Ich bin nicht sicher, ob Sie sie in der aktuellen Excel-Instanz unsichtbar öffnen können
Sie können jedoch eine neue Instanz von Excel öffnen, diese ausblenden und dann die Arbeitsmappen öffnen
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
Stellen Sie sicher, dass Sie bereinigen, nachdem Sie alle geöffneten Arbeitsmappen abgeschlossen haben
Wenn das Ihren Bedürfnissen entspricht, würde ich einfach nutzen
Application.ScreenUpdating = False
mit dem zusätzlichen Vorteil, dass Sie Ihren Code beschleunigen, anstatt ihn mithilfe einer zweiten Excel-Instanz zu verlangsamen.
Verwenden Sie Folgendes, um eine Arbeitsmappe zu öffnen, die in der vorhandenen Excel-Instanz verborgen ist:
Application.ScreenUpdating = False
Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True
ActiveWindow.Visible = False
ThisWorkbook.Activate
Application.ScreenUpdating = True
Auch wenn Sie Ihre Antwort haben, ist es für diejenigen, die diese Frage finden, auch möglich, eine Excel-Tabelle als JET-Datenspeicher zu öffnen. Das Ausleihen der Verbindungszeichenfolge aus einem Projekt, für das ich sie verwendet habe, sieht ungefähr so aus:
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"
Beachten Sie, dass "RegistrationList" der Name der Registerkarte in der Arbeitsmappe ist. Es gibt ein paar Tutorials im Internet, die beschreiben, was Sie tun können und was nicht, um auf diese Weise auf ein Blatt zuzugreifen.
Ich dachte nur, ich würde hinzufügen. :)
Ein viel einfacherer Ansatz, bei dem keine aktiven Fenster bearbeitet werden:
Dim wb As Workbook
Set wb = Workbooks.Open("workbook.xlsx")
wb.Windows(1).Visible = False
Nach allem, was ich sagen kann, sollte der Windows-Index in der Arbeitsmappe immer 1
Sein. Wenn jemand irgendwelche Rennbedingungen kennt, die das falsch machen würden, lass es mich bitte wissen.
Das Problem bei den Antworten von iDevlop und Ashok ist, dass das grundlegende Problem (anscheinend) ein Excel-Designfehler ist, bei dem die Open-Methode die Application.ScreenUpdating-Einstellung von False nicht berücksichtigt. Infolgedessen ist das Festlegen von False für dieses Problem nicht von Vorteil.
Wenn die Patrick McDonald's-Lösung aufgrund des zusätzlichen Aufwands beim Starten einer zweiten Excel-Instanz zu aufwändig ist, besteht die beste Lösung darin, die Zeit zu minimieren, in der die geöffnete Arbeitsmappe angezeigt wird, indem das ursprüngliche Fenster so schnell wie möglich erneut aktiviert wird:
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...
Öffnen Sie sie aus einer neuen Instanz von 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
Sie müssen daran denken, aufzuräumen, nachdem Sie fertig sind.
Öffnen Sie die Arbeitsmappe als ausgeblendet und legen Sie sie dann als "gespeichert" fest, damit Benutzer beim Schließen nicht dazu aufgefordert werden.
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
Dies ist eine Ableitung der Antwort von Ashok.
Auf diese Weise werden Sie jedoch nicht aufgefordert, Änderungen in der Excel-Datei zu speichern, aus der Sie gelesen haben. Dies ist ideal, wenn die Excel-Datei, aus der Sie lesen, als Datenquelle für die Validierung dient. Wenn die Arbeitsmappe beispielsweise Produktnamen und Preisdaten enthält, kann sie ausgeblendet werden, und Sie können eine Excel-Datei anzeigen, die eine Rechnung mit Dropdown-Listen für Produkte darstellt, die anhand dieser Preisliste validiert wurden.
Sie können die Preisliste dann an einem freigegebenen Ort in einem Netzwerk speichern und schreibgeschützt machen.
Blenden Sie in Excel die Arbeitsmappen aus und speichern Sie sie als ausgeblendet. Wenn Ihre App sie lädt, werden sie nicht angezeigt.
Bearbeiten: Beim erneuten Lesen wurde klar, dass diese Arbeitsmappen nicht Teil Ihrer Anwendung sind. Eine solche Lösung wäre für Benutzerarbeitsmappen ungeeignet.