2017-08-18 2 views
0

Ich versuche, eine Möglichkeit zum Öffnen von Excel mit Outlook VBA zu finden, aber nur, wenn es nicht bereits geöffnet ist. Ich habe im Internet Code gefunden, der Excel öffnet, Änderungen vornimmt und dann schließt, aber es verhält sich nicht gut, wenn die Excel-Arbeitsmappe bereits geöffnet ist (die Änderungen werden zwar übernommen, aber die Excel-Arbeitsmappe wird nicht mehr geschlossen). und es hinterlässt es einfach mit einem grauen Inneren, manchmal zeigt es sich auch nicht mehr im Explorer und ich muss es vom Aufgabenmanager schließen. Ich würde es auch sehr schätzen, wenn jemand erklären könnte, was der meiste Code tut.So öffnen Sie Excel, wenn nicht bereits geöffnet

Public xlApp As Object 
Public xlWB As Object 
Public xlSheet As Object 
Sub ExportToExcel() 
    Dim enviro As String 
    Dim strPath As String 
    'Get Excel set up 
enviro = CStr(Environ("USERPROFILE")) 
'the path of the workbook 
strPath = enviro & "\Documents\test2.xlsx" 
    On Error Resume Next 
    Set xlApp = GetObject(, "Excel.Application") 
    If Err <> 0 Then 
     Application.StatusBar = "Please wait while Excel source is opened ... " 
     Set xlApp = CreateObject("Excel.Application") 
     bXStarted = True 
    End If 
    On Error GoTo 0 
    'Open the workbook to input the data 
    Set xlWB = xlApp.Workbooks.Open(strPath) 
    Set xlSheet = xlWB.Sheets("Sheet1") 
    ' Process the message record 
    On Error Resume Next 
    xlWB.Close 1 
    If bXStarted Then 
     xlApp.Quit 
    End If 
End Sub 

Ich weiß, was die xlWb und xlSheet Objekte tun, und wie sind sie erklärt, und ich verstehe auch, was die environ Funktion und strPath Zeichenfolge zu tun, aber ich weiß nicht, warum wir undestand die bXStarted boolean benötigen, was Set xlApp = GetObject tut, warum die Application.StatusBar Nachricht nicht angezeigt wird, der Unterschied zwischen GetObject und CreateObject und warum so viele Fehlertests benötigt werden. Vielen Dank im Voraus.

Antwort

1

Der Unterschied zwischen Get-Objekt und Create-Objekt ist im Titel, man wird geöffnet excel.application, wenn es einen Fehler err<>0 dann ein excel.application erstellt. Ich denke, dass Sie eine saveas Nachricht erhalten werden, da die Datei nicht speichern, aber offen ist, und Sie es anweisen, zu speichern, überspringt das error resume next es. Versuchen Sie, vor nur einer .close zu speichern Wenn Sie die on error resume next entfernen, wird der Fehler nicht übersprungen und wird angezeigt.

Sub explaination() 

Dim blnDidICreateExcel As Boolean   ' Please read MSDN on boolean 
Dim objToHoldExcelCreatedOrNot As Object ' Please read MSDN on objects create/get 

' Does the user have Excel open, if i try to get it, then there will be an error logically if not 
Set objToHoldExcelCreatedOrNot = GetObject(, "Excel.Application") 

' Was there an error 
If Err <> 0 Then 
    ' There was, so i need to create one 
    Set objToHoldExcelCreatedOrNot = CreateObject("Excel.Application") 
    blnDidICreateExcel = True  ' Yes, i created it 
End If 

' Do the neccessary 

' CLose the workbook 

' Did i create this Excel, if so tidy up 

If blnDidICreateExcel Then objToHoldExcelCreatedOrNot.Quit 

End Sub 
+0

Die Sache ist, das Skript speichert Änderungen. Wie auch immer, schlägst du vor, ich schreibe eine 'xlWB.Save 1' vor die' xlWB.Close 1'? – NAlexP

+0

nehmen Sie den on-Fehler heraus und sehen Sie, was der Fehler zuerst ist. –

+0

Die Idee aus dem Code sieht so aus, als ob sie nicht dazu gedacht ist, eine Arbeitsmappe zu schließen, die bereits geöffnet ist. Wenn Sie möchten, dass die Arbeitsmappe geschlossen wird, entfernen Sie die XStarted-Prüfung vor dem Schließen. –

Verwandte Themen