我试图找到一种使用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
我知道xlWb
和xlSheet
对象的作用以及它们如何声明,我也理解environ
函数和strPath
字符串的作用,但我不明白为什么我们需要bXStarted
布尔值,Set xlApp = GetObject
做什么,为什么Application.StatusBar
消息没有显示,{{1 }和GetObject
以及为什么需要这么多的错误测试。
提前谢谢。
答案 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