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?
70
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.
quelle
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
quelle
ThisWorkbook.Activate: ActiveWindow.Visible = False: Application.ScreenUpdating = False
ALLER ANDERE CODE HIERApplication.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. :) :)
quelle
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 FehlerEin 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.quelle
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...
quelle
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.
quelle
Ö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.
quelle
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.
quelle