2015-11-03 108 views
1

我正在努力弄清楚是否應該在對其進行多次操作後關閉Excel。如果我已經打開了Excel(A.xls,D.xls)並啓動我的Word宏,它從活動文檔獲取值並將其轉儲到B.xls中,我希望我的宏關閉B.xls,但保留A和C.但是,如果我不要已打開A和C,我希望我的宏完成運行後完全關閉Excel。檢查Excel是否從Word打開

我試過多種方式與出成功來實現這一目標:

Dim oXLApp As Object 
    ' Get excel object 
    closeExcelMy = FileHandling.setExcelObject(oXLApp) 

'********************************************************* 
'********* define if we need to close excel after sub is done 
'*********************************************************** 
Function setExcelObject(ByRef oXLApp As Object) As Boolean 
    On Error GoTo notOpen 
    setExcelObject = False 
    Set oXLApp = GetObject(, "Excel.Application") 
' On Error GoTo 0 

' If oXLApp Is Nothing Then 
'  Set oXLApp = CreateObject("Excel.Application") 
'  setExcelObject = True 
' End If 

notOpen: 
    Set oXLApp = CreateObject("Excel.Application") 
    setExcelObject = True 
    '~~> Hide Excel 
    'oXLApp.Visible = True 

' If oXLApp.Workbooks.Count < 1 Then 
'  setExcelObject = True 
' End If 
End Function 

我希望我的函數返回true如果我能以其他方式false關閉Excel。

如何從Word中的VBA中實現此目的?

回答

1

這將檢查工作簿A.xlsC.xls是否都打開。

如果其中一個工作簿未打開,它將關閉整個Excel應用程序。你應該能夠將它用於你的代碼並得到一個可行的解決方案。

Option Explicit 
Function areWorkbooksOpen() As Boolean 

    Dim wbA As Workbook, wbC As Workbook 

    On Error Resume Next ' Turn off error handling 
    Set wbA = Workbooks("A.xls") 
    Set wbC = Workbooks("C.xls") 
    On Error GoTo 0 

    If wbA Is Nothing Or wbC Is Nothing Then 
     areWorkbooksOpen = False 
    Else 
     areWorkbooksOpen = True 
    End If 
End Function 

Sub mainCode() 

    ' Your code 


    If Not areWorkbooksOpen Then 
     Excel.Application.Quit ' Close entire session of excel 
    End If 
End Sub 

編輯

如果您還沒有已經找到Excel應用程序,那麼你就需要做到這一點。以下需要考慮到excel應用程序。

您還需要啓用「的Microsoft Excel 14.0對象庫」引用

Option Explicit 
Function areWorkbooksOpen() As Boolean 
    Dim excelApp As Excel.Application, wb As Workbook 
    Dim wbA As Workbook, wbC As Workbook 

    Set excelApp = GetObject(, "Excel.Application") 

    For Each wb In excelApp.Workbooks 
     If wb.Name = "A.xls" Then 
      Set wbA = wb 
     ElseIf wb.Name = "C.xls" Then 
      Set wbC = wb 
     End If 
    Next wb 

    If wbA Is Nothing Or wbC Is Nothing Then 
     areWorkbooksOpen = False 
    Else 
     areWorkbooksOpen = True 
    End If 

    Set excelApp = Nothing 
End Function 

Sub mainCode() 

    ' Your code 

    If Not areWorkbooksOpen Then 
     Excel.Application.Quit 
    End If 
End Sub 
+0

的問題是,我不知道名字A和C(用戶隨機打開的工作簿數量),也許我可以循環收集工作簿?我使用'Set oXLApp = CreateObject(「Excel.Application」)'來避免設置對象庫的引用。這是因爲我在normal.dotm中傳播宏的原因,並且如果版本更改爲15,它將失敗或? – skatun

+0

我通過excel應用程序集合中的工作簿發佈循環的第二個代碼。但是,如果您不知道工作簿A和C的名稱,我不確定您可以做什麼... –

0

中我找到了解決辦法,也許不是優雅,但它的工作原理。我只是檢查窗口名稱,看它是否被稱爲Excel,請參閱post

Option Explicit 

Private Const GW_HWNDNEXT = 2 
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long 
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 

Sub test() 
Dim closeExcel As Boolean 
closeExcel = ListWins("*Excel*") 
End Sub 
Function ListWins(Optional Title = "*", Optional Class = "*") As Boolean 
    Dim hWndThis As Long 
    ListWins = True 
    hWndThis = FindWindow(vbNullString, vbNullString) 
    While hWndThis 
     Dim sTitle As String, sClass As String 
     sTitle = Space$(255) 
     sTitle = Left$(sTitle, GetWindowText(hWndThis, sTitle, Len(sTitle))) 
     sClass = Space$(255) 
     sClass = Left$(sClass, GetClassName(hWndThis, sClass, Len(sClass))) 
     If sTitle Like Title And sClass Like Class Then 
      ListWins = False 
      Debug.Print sTitle, sClass 
     End If 
     hWndThis = GetWindow(hWndThis, GW_HWNDNEXT) 
    Wend 
End Function 
0

它不應該關閉其他Excel文件。

我用下面的:

Sub SomeMacro() 

Dim ExcelProgram As Object 
Dim ExcelFile As Object 
Dim EventData As Object 

'Here you would be using your script to develop/determine the file path 
ExcelFilePath = "C:\ Some File Path.xls" 

'Starting Excel 
Set ExcelProgram = CreateObject("Excel.Application") 
'Not allowing it to be visible 
ExcelProgram.Application.Visible = False 

'Opening the desired Excel File 
Set ExcelFile = ExcelProgram.Application.Workbooks.Open(ExcelFilePath) 

'Here you would execute some script for the Excel Sheet 


Somecode here 



'Quiting the Excel Application 
ExcelProgram.Quit 

'clean up Objects for next use 
Set ExcelProgram = Nothing 
Set ExcelFile = Nothing 

End Sub 

,並沒有關閉任何其他Excel文件,是開放的,因爲你關閉創建ExcelProgram.Quit而不是Excel.Application.Quit

+0

但是,如果您想要使用已打開的Excel工作簿進行操作,您需要爲那本書設置參考,而不是打開它。在我的情況下,工作簿是由用戶打開(設置參考工作簿的名稱),如果失敗,然後我檢查是否由其他用戶打開,(我只是嘗試讀取它的二進制文件來弄清楚這是否是案例)如果這是工作,然後我檢查用戶是否擅長打開,然後我打開工作簿。我想我可以修改代碼來使用你的方法,我會看看當我得到的時間。謝謝:) – skatun

+0

總是很難理解發布的問題的背景以及可能存在的各種參議員。我很熟悉處理對象和掃描活動文檔。所以這是一個很好的信息問題 –