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

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


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.


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

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


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


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

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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.