it-swarm.com.de

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

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?

55
notnot

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

72

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.

30
Patrick Honorez

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
18
Ashok

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

11
AnonJr

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.

7
Anthony Lusardi

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

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

1
guillermooo

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

1
Pen123

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.

0
JohnW