我在Outlook VBA中为自己编写了一种自制的票务系统,并且我使用Excel来存储所有持久数据。我有一个函数用Outlook编写来从.csv获取一些数据并将其返回。这一切都运行正常,但在关闭工作簿后,退出应用程序,并将应用程序设置为空,我仍然运行Excel进程!这是我的代码:
Private Function GetNewTicketNumber() As Integer
Dim xlApp As Excel.Application
Set xlApp = New Excel.Application
With xlApp
.Visible = False
.EnableEvents = False
.DisplayAlerts = False
End With
Dim FileStr As String
Dim NumberBook As Workbook
Dim TheRange As Range
FileStr = "C:\OMGITSAPATH.csv"
Set NumberBook = Workbooks.Open(FileStr)
Set TheRange = NumberBook.Worksheets(1).Range("A1")
GetNewTicketNumber = TheRange.Value
TheRange.Value = TheRange.Value + 1
NumberBook.Save
NumberBook.Close
xlApp.Quit
With xlApp
.Visible = True
.EnableEvents = True
.DisplayAlerts = True
End With
Set xlApp = Nothing
End Function
我在这里做错了什么吗?我的问题类似于here,但我已禁用DisplayAlerts ...我该怎么做才能解决这个问题?
答案 0 :(得分:3)
这里提出的问题正是你所拥有的。这条线
Range("a1").Value = Range("a1").Value + 1
让xl实例保持打开状态
问题的最常见原因是对自动化应用程序的“全局”引用。不幸的是,在某些情况下,可以直接引用自动化对象的实体(属性/方法/对象)。该引用对于调用应用程序实际上是全局的。因此,只要调用程序处于活动状态,引用就会保持不变。因此,当调用者处于活动状态时,操作系统不会结束自动应用程序。
重新下面的代码(也使用后期绑定 - 排除了不合格的可能性)。
请改变你的道路。
码
Private Function GetNewTicketNumber() As Long
Dim xlApp As Object
Dim objWB As Object
Dim objWs As Object
Dim FileStr As String
FileStr = "C:\temp\test.xlsx"
Set xlApp = CreateObject("excel.application")
With xlApp
.EnableEvents = False
.DisplayAlerts = False
End With
Set objWB = xlApp.Workbooks.Open(FileStr)
Set objWs = objWB.Sheets(1)
GetNewTicketNumber = objWs.Range("A1")
objWs.Range("A1") = objWs.Range("A1") + 1
objWB.Save
objWB.Close
Set objWB = Nothing
xlApp.Quit
Set xlApp = Nothing
End Function