2009-02-23 20 views

Antwort

59

Nicht sicher, ob man sie unsichtbar in der aktuellen Instanz Excel öffnen kann

Sie allerdings eine neue Instanz von Excel öffnen kann, es verstecken und öffnen Sie dann die Arbeitsmappe

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 

Wie andere geschrieben haben, Stellen Sie sicher, dass Sie aufräumen, nachdem Sie alle geöffneten Arbeitsmappen beendet haben

+0

Es stoppt das Blinken in der Taskleiste, verursacht aber das Blinken im Cursor. Auch Application.Cursor hilft nicht (in Office 2010 x64). – sevenkul

+4

ich empfehlen, dass Sie die App-Sitzung sperren, bevor Sie die Ziel Arbeitsmappe öffnen: 'App.AutomationSecurity = MsoAutomationSecurityForceDisable' ' App.EnableEvents = False' ' App.Calculation = xlCalculationManual' - Und Sie könnten erwägen Aufzählen die AddIns-Sammlung und auch diese deaktivieren: ** langsame Add-In-Startups verzögern den Start der App-Sitzung **. –

+0

@Nile Sie klingen alle nach tollen Ideen –

0

In Excel verbergen Sie die Arbeitsmappen und speichern Sie sie als ausgeblendet. Wenn deine App sie lädt, werden sie nicht angezeigt.

Bearbeiten: Nach dem erneuten Lesen wurde klar, dass diese Arbeitsmappen nicht Teil Ihrer Anwendung sind. Eine solche Lösung wäre für Benutzerarbeitsmappen nicht geeignet.

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 sich daran erinnern, nachdem Sie fertig sind.

+2

Um nur zu betonen, müssen Sie bereinigen, nachdem Sie mit einer unsichtbaren Instanz fertig sind. Wenn Sie nicht in der Lage sind, Excel-Dateien durch Doppelklicken oder Starten aus anderen Apps zu öffnen, wenn sie sich nicht abmelden oder wissen, wie Prozesse abgebrochen werden können (weil die Dateien im unsichtbaren Fenster geöffnet werden). – David

23

Wenn das Ihren Bedürfnissen entspricht, würde ich einfach

Application.ScreenUpdating = False 

verwenden, um mit dem zusätzlichen Vorteil des Codes zu beschleunigen, anstatt es zu verlangsamen, indem eine zweite Instanz von Excel.

9

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. Leihen die Verbindungszeichenfolge aus einem Projekt, das ich es benutzt habe auf, wird es aussehen ein bisschen wie folgt 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“ ist der Name der Registerkarte in der Arbeitsmappe. Es gibt ein paar Tutorials im Web mit den Details, was Sie tun können und was nicht.

Ich dachte nur, ich würde hinzufügen. :)

+0

Das ist cool !!!! –

+0

funktioniert das für dich? es scheint bei Excel 2003 nicht zu funktionieren –

+0

@ShawnZhang Die meisten Excel-Dateien, die wir gelesen haben, wurden im Format 2000/2003 exportiert, da dies das Programm des Senders ist. Es gibt eine Variation der Verbindungszeichenfolge, die wir für 2007/2010-Dateien getestet haben, die ebenfalls funktioniert. – AnonJr

8

Um eine Arbeitsmappe zu öffnen, wie in der vorhandenen Instanz von Excel versteckt, verwenden folgende:

Application.ScreenUpdating = False 
    Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True 
    ActiveWindow.Visible = False 
    ThisWorkbook.Activate 
    Application.ScreenUpdating = True 
+0

Dank, es funktionierte, als ich wie folgt verwenden: 'ThisWorkbook.Activate: ActiveWindow.Visible = False: Application.ScreenUpdating = false' ALLE ANDEREN CODE HIER ' Application.ScreenUpdating = True: ThisWorkbook.Activate: ActiveWindow.Visible = True 'Weder Taskleiste noch Cursor flackern. – sevenkul

1

der Arbeitsmappe öffnen als versteckte und dann, als „gespeichert“, so dass die Benutzer nicht gefragt, wenn sie ausschließen.

Dies ist etwas abgeleitet von der Antwort von Ashok geschrieben.

Indem Sie es auf diese Weise tun, werden Sie nicht dazu aufgefordert, Änderungen in der Excel-Datei zu speichern, von der Sie gelesen haben. Das ist gut, wenn die Excel-Datei, aus der Sie lesen möchten, 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 aus dieser Preisliste validiert werden.

Sie können die Preisliste dann an einem freigegebenen Speicherort in einem Netzwerk speichern und schreibgeschützt machen.

2

Das Problem mit den Antworten von iDevlop und Ashok ist, dass das grundlegende Problem ein Excel-Designfehler ist (anscheinend), bei dem die Open-Methode die Application.ScreenUpdating-Einstellung von False nicht einhält. Folglich hat das Setzen auf False für dieses Problem keinen Vorteil.

Wenn Patrick McDonalds Lösung aufgrund des Aufwands beim Starten einer zweiten Instanz von Excel zu mühsam ist, dann ist die beste Lösung, die ich gefunden habe, die Zeit zu minimieren, in der die geöffnete Arbeitsmappe durch erneutes Aktivieren des ursprünglichen Fensters sichtbar ist schnell wie möglich:

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

Warum brauchen Sie Aktionen mit 'ActiveWindow'? Ich denke, nur das Arbeitsmappenfenster zu verstecken, nachdem es geöffnet wurde, hat den gleichen Effekt – Winand

3

Ein viel einfacher Ansatz, der nicht aktiven Fenster Manipulation mit sich bringt:

Dim wb As Workbook 
Set wb = Workbooks.Open("workbook.xlsx") 
wb.Windows(1).Visible = False 

Von dem, was ich den Windows-Index für die Arbeitsmappe immer 1 sein sollte sagen. Wenn jemand irgendwelche Rassenbedingungen kennt, die das unwahr machen würden, lass es mich wissen.

Verwandte Themen