Öffnen Sie die Excel-Datei zum Lesen mit VBA ohne Anzeige

70

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?

nicht nicht
quelle

Antworten:

82

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

Patrick McDonald
quelle
Es stoppt das Blinken in der Taskleiste, bewirkt jedoch das Blinken im Cursor. Auch Application.Cursor hilft nicht (in Office 2010 x64).
Sevenkul
8
Ich empfehle dringend, dass Sie die App-Sitzung sperren, bevor Sie die Zielarbeitsmappe öffnen: "App.AutomationSecurity = msoAutomationSecurityForceDisable" "App.EnableEvents = False" "App.Calculation = xlCalculationManual" Auch: Langsame Add-In-Starts verzögern den Start der App-Sitzung .
Nigel Heffernan
@Nile Sie alle klingen nach großartigen Ideen
Patrick McDonald
Dies ist ein großartiger Code. Ich möchte jedoch Arbeitsblätter in diese versteckte Arbeitsmappe kopieren, und ich fürchte, das ist nicht möglich, oder?
mauek unak
1
Nach @mauek unak Bemerkung und der Einfachheit halber denke ich, dass die richtige Antwort bei weitem @pstratonwkbAny.windows(1).Visible=False
Siyon DP
33

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.

Patrick Honorez
quelle
1
Dieser Code funktioniert nicht. Excel hat ein Problem, das verhindert, dass es tatsächlich das tut, wofür Sie es benötigen. Es wird nur verhindern, dass Sie die Funktionsweise des Makros sehen, die tatsächliche Eröffnung des zweiten Buches und die Arbeitsmappe selbst werden weiterhin angezeigt
RobertW081171
Funktioniert gut für mich?
SAL
22

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
Ashok
quelle
Danke, es hat funktioniert, wenn ich so benutze: ThisWorkbook.Activate: ActiveWindow.Visible = False: Application.ScreenUpdating = False ALLER ANDERE CODE HIER Application.ScreenUpdating = True: ThisWorkbook.Activate: ActiveWindow.Visible = TrueWeder die Taskleiste noch der Cursor flackern.
Sevenkul
12

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

AnonJr
quelle
@ShawnZhang Die meisten Excel-Dateien, die wir gelesen haben, wurden im Format 2000/2003 exportiert, da das Programm des Absenders dies ausgibt. Es gibt eine Variation der Verbindungszeichenfolge, die wir für 2007/2010-Dateien getestet haben und die ebenfalls funktioniert.
AnonJr
@ShawnZhang Noch wichtiger ist, dass der Tab-Name (in den eckigen Klammern mit dem $ am Ende) einige lustige Einschränkungen aufweist, die ich momentan nicht finden kann. Das Gleiche gilt für die Spaltenüberschriften.
AnonJr
1
Bei den Jet OLEDB-Treibern tritt beim Lesen von Excel ein Speicherverlust auf (alle Versionen und die ODBC-Treiber des Vorgängers): Wenn Sie dies in einer Benutzersitzung mehrmals tun , werden Fehlermeldungen zum verfügbaren Speicher angezeigt . Ignorieren Sie diese Fehler auf eigene Gefahr - Ihre Anwendung friert möglicherweise ein oder stürzt ab. Microsoft erkennt nicht an, dass dieses Problem besteht, und es gibt keinerlei Dokumentation dazu.
Nigel Heffernan
Das funktioniert auch mit ACE / DAO unter Verwendung der Syntax. 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
Patrick Honorez
11

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.

wooobie
quelle
4

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...
pstraton
quelle
Warum brauchen Sie Aktionen mit ActiveWindow? Ich denke, nur das Ausblenden des Arbeitsmappenfensters nach dem Öffnen hat den gleichen Effekt
Winand
@Windand: Wie oben beschrieben, geht es darum, die Zeit zu minimieren, in der die neu geöffnete Arbeitsmappe angezeigt wird, indem das ursprüngliche Fenster so schnell wie möglich wieder aktiviert wird. Das Ausblenden der geöffneten Arbeitsmappe ist je nach Ihren Anforderungen optional.
Pstraton
@Windand: Das Reaktivieren eines bereits gerenderten Fensterbilds ist extrem schnell, während das Aufheben der Zuweisung eines sichtbaren Fensters die Manipulation von Systemressourcen erfordert, was zweifellos langsamer ist. Ist der Unterschied genug, um sich darum zu kümmern? Weiß nicht.
Pstraton
2

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

Pen123
quelle
1

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

guillermooo
quelle
2
Nur um zu betonen, müssen Sie bereinigen, nachdem Sie mit einer unsichtbaren Instanz fertig sind. Wenn Sie dies nicht tun, kann der Benutzer Excel-Dateien möglicherweise nicht durch Doppelklicken oder Starten von anderen Apps öffnen, es sei denn, sie melden sich ab oder wissen, wie Prozesse abgebrochen werden (da die Dateien im unsichtbaren Fenster geöffnet werden).
David
0

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.

JohnW
quelle