从简单处考虑, 在.Quit之前将.Visible置为True就可以了, 至于原因我也不知道. 类似的一个现象是我在通过AtviveX操作ACAD(14)时, 如果在.Quit时不让其可见, 则会丢失所以的工具栏.
从严格的角度考虑, 我觉得Form_Load()应该这样做:
Private Sub Form_Load()
On Error Resume Next
' 首先检查有无Excel运行
Set objExcel = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
' 如果没有, 再创建一个
Set objExcel = CreateObject("Excel.Application")
Err.Number = 0
End If
' 我是用Excel自带的这个宏来测试的
' 用objExcel来指明AddIns的对象
macroXla = CStr(objExcel.AddIns("MS Query 加载宏").FullName)
'macroXla = "E:\Exchange\原程序\开发中\GlobeFormula.xla"
Text1.Text = macroXla
' 如果是CreateObject的 , 则结束之
If Not objExcel.UserControl Then
' objExcel.Visible = True ' 采用原来的方法, 可以将Excel先可见在.Quit
objExcel.Quit
Set objExcel = Nothing
End If
End Sub
就是AddIns直接指明操作的对象: objExcel.AddIns, 如果已有Excel进程了, 就不会再创建新的Excel进程; 如果还没有, 则先CreateObject创建一个新的Excel赋给objExcel, 再objExcel.AddIns(), 后面的.Quit也能正常运行. 如果这样做了, objExcel应该定义为一个全局变量:
Dim macroXla As String
Dim objExcel As Excel.Application
我的本意是:打开宏文件,然后执行其中的相应函数。如果我按照下面的直接打开,然后执行函数,最后关闭。但是这样的太死了。
Set objWbMacro = objExcel.Workbooks.Open("E:\Exchange\原程序\开发中\GlobeFormula.xla")
我这么处理:
On Error Resume Next
Set objWbMacro = objExcel.Workbooks(AddIns("GlobeFormula").Name)
If Err.Number <> 0 Then
Set objWbMacro = Workbooks.Open(AddIns("GlobeFormula").FullName)
End If
程序比上面的灵活多了,但是在打开,执行函数。有两个excel进程。关闭后有一个关不掉,我发现是AddIns("GlobeFormula")这个调用产生的。我不想要这个进程,但是不知道怎么关掉。
Private Sub Command1_Click()
Dim objExcel As Excel.Application
Dim objWbMacro As Excel.Workbook
Dim objReport As Excel.Workbook
Dim sheetX As Worksheet
On Error GoTo h
If objExcel Is Nothing Then
Set objExcel = CreateObject("Excel.Application")
End If
On Error GoTo h
If Not objExcel Is Nothing Then
objReport.Close (False)
Set objReport = Nothing
objWbMacro.Close (False)
Set objWbMacro = Nothing
objExcel.Quit
Set objExcel = Nothing
End If
Exit Sub
h:
objExcel.Quit
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim tempxls As Excel.Application
macroXla = CStr(AddIns("GlobeFormula").FullName)
'macroXla = "E:\Exchange\原程序\开发中\GlobeFormula.xla"
Text1.Text = macroXla
Set tempxls = GetObject("", "Excel.Application")
If Not tempxls.UserControl Then
tempxls.Quit
Set tempxls = Nothing
End If