如果尚未打开,如何打开Excel

时间:2017-08-18 08:48:49

标签: excel vba outlook outlook-vba

我试图找到一种使用Outlook VBA打开Excel的方法,但前提是它尚未打开。我设法在互联网上找到一些打开Excel的代码,进行更改然后关闭它,但如果Excel工作簿已经打开(它确实应用了更改,但它不再关闭Excel,它就不会表现得很好)工作簿,它只是留下一个灰色的内部;而且,有时它甚至不再显示在资源管理器中,我必须从任务管理器关闭它)。 如果有人能够解释大部分代码的作用,我也将不胜感激。

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

我知道xlWbxlSheet对象的作用以及它们如何声明,我也理解environ函数和strPath字符串的作用,但我不明白为什么我们需要bXStarted布尔值,Set xlApp = GetObject做什么,为什么Application.StatusBar消息没有显示,{{1 }和GetObject以及为什么需要这么多的错误测试。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

get对象和create对象之间的区别在于标题,其中一个将打开excel.application,如果出现错误err<>0,则会创建excel.application。我认为您将收到一条saveas消息,因为该文件可能没有保存,但是打开,并且您指示它保存,error resume next正在跳过它。尝试在.close之前保存如果删除on error resume next,则不会跳过该错误并显示错误。

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