Ich möchte vorhandene Excel-Dateien mit einem Makro durchsuchen, aber ich möchte diese Dateien nicht anzeigen, wenn sie vom Code geöffnet werden. Gibt es eine Möglichkeit, sie sozusagen "im Hintergrund" zu öffnen?
Ich möchte vorhandene Excel-Dateien mit einem Makro durchsuchen, aber ich möchte diese Dateien nicht anzeigen, wenn sie vom Code geöffnet werden. Gibt es eine Möglichkeit, sie sozusagen "im Hintergrund" zu öffnen?
Antworten:
Ich bin mir nicht sicher, ob Sie sie in der aktuellen Excel-Instanz unsichtbar öffnen können
Sie können jedoch eine neue Excel-Instanz öffnen, 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, wie andere gepostet haben, sicher, dass Sie aufräumen, nachdem Sie mit geöffneten Arbeitsmappen fertig sind
wkbAny.windows(1).Visible=False
Wenn das Ihren Bedürfnissen entspricht, würde ich einfach verwenden
Application.ScreenUpdating = False
mit dem zusätzlichen Vorteil, dass Sie Ihren Code beschleunigen können, 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
ThisWorkbook.Activate: ActiveWindow.Visible = False: Application.ScreenUpdating = False
ALLER ANDERE CODE HIER Application.ScreenUpdating = True: ThisWorkbook.Activate: ActiveWindow.Visible = True
Weder die Taskleiste noch der Cursor flackern.
Obwohl Sie Ihre Antwort haben, ist es für diejenigen, die diese Frage finden, auch möglich, eine Excel-Tabelle als JET-Datenspeicher zu öffnen. Wenn Sie die Verbindungszeichenfolge aus einem Projekt ausleihen, für das ich sie verwendet habe, sieht sie 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 "Registrierungsliste" der Name der Registerkarte in der Arbeitsmappe ist. Es gibt ein paar Tutorials im Web, die genau 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. :) :)
SELECT * FROM [Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\somefolder\myfile.xlsx].[sheetName$];
Funktioniert mit XLS und XLSX ohne einen Fehler
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
Soweit ich das beurteilen kann, sollte der Windows-Index in der Arbeitsmappe immer sein 1
. Wenn jemand irgendwelche Rennbedingungen kennt, die dies unwahr machen würden, lass es mich wissen.
Das Problem bei den Antworten von iDevlop und Ashok besteht darin, dass das grundlegende Problem (anscheinend) ein Excel-Entwurfsfehler ist, bei dem die Open-Methode die Application.ScreenUpdating-Einstellung von False nicht berücksichtigt. Folglich ist das Setzen auf False für dieses Problem nicht von Vorteil.
Wenn die Lösung von Patrick McDonald aufgrund des Overheads 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 sichtbar ist, 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...
ActiveWindow
? Ich denke, nur das Ausblenden des Arbeitsmappenfensters nach dem Öffnen hat den gleichen Effekt
Öffnen Sie die Arbeitsmappe als versteckt 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 etwas abgeleitet von der Antwort von Ashok.
Auf diese Weise werden Sie jedoch nicht aufgefordert, Änderungen in der Excel-Datei, aus der Sie lesen, wieder zu speichern. Dies ist ideal, wenn die Excel-Datei, aus der Sie lesen, als Datenquelle für die Validierung gedacht ist. 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 werden.
Sie können die Preisliste dann an einem gemeinsam genutzten Ort in einem Netzwerk irgendwo speichern und schreibgeschützt machen.
Ö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.
Blenden Sie in Excel die Arbeitsmappen aus und speichern Sie sie als versteckt. 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.