提问人:Guriuz 提问时间:9/25/2023 最后编辑:Guriuz 更新时间:9/25/2023 访问量:85
Excel 保留在后台
Excel remains in the background
问:
使用访问VBA我打开一个excel文件,我执行一系列操作(按照以下代码)我关闭了所有内容,但excel仍在运行。 事实上,如果我重复相同的过程,我会得到一个错误:文件是只读的。我必须打开“进程资源管理器”并手动终止进程。 我哪里错了? 谢谢
`Public Function agg_file_codifiche(Cognome, Nome, CF, password As String) As Long
Dim oExcel As Excel.Application
Dim oExcelWrkBk As Excel.Workbook
Dim oExcelWrSht As Excel.Worksheet
Dim xlsfile, xlssheet As String
Dim ur, code As Long
Set oExcel = CreateObject("Excel.Application")
xlsfile = "C:\Users\*****\Documenti\_LAVORO_\CODIFICHE_UNIPAM\Codifiche unipam.xlsx"
xlssheet = "Codifiche"
Set oExcelWrkBk = oExcel.Workbooks.Open(xlsfile, , False)
Set oExcelWrSht = oExcelWrkBk.Sheets(xlssheet)
oExcel.Visible = False
With oExcelWrSht
ur = .Cells(Rows.Count, 3).End(xlUp).Row
badge_code = .Cells(ur + 1, 1).Value
code = .Cells(ur + 1, 2).Value
.Cells(ur + 1, 3).Value = Cognome & " " & Nome
.Cells(ur + 1, 4).Value = password
.Cells(ur + 1, 5).Value = CF
.Cells(ur + 1, 8).Value = Format(Date, "Short Date")
End With
oExcelWrkBk.Save
oExcelWrkBk.Close
oExcel.Quit
Exit_Point:
Set oExcelWrSht = Nothing
Set oExcelWrkBk = Nothing
Set oExcel = Nothing
agg_file_codifiche = code
Exit Function
Error_Handler:
MsgBox Err & " - " & Err.Description
GoTo Exit_Point
End Function`
答:
3赞
Rory
9/25/2023
#1
您错过了对象引用。其内容应为:
ur = .Cells(.Rows.Count, 3).End(xlUp).Row
而不是:
ur = .Cells(Rows.Count, 3).End(xlUp).Row
评论
0赞
Guriuz
9/25/2023
通过此修改,它立即起作用
0赞
Siddharth Rout
9/25/2023
Rory,虽然添加对象引用是一个好习惯,但这不会导致应用程序保持打开状态。由于用户使用的是早期绑定,因此他将获得 Rows.Count 的正确值。我在没有添加对象引用的情况下测试了 OPs 代码,excel 应用程序正确关闭......
0赞
Siddharth Rout
9/25/2023
我怀疑,OP 没有发布完整的代码。在其他地方发生错误,导致代码在不关闭应用程序的情况下退出。由于 OP 有,他没有意识到工作簿仍然打开。OP提到 事实上,如果我重复相同的过程,我会得到一个错误:文件是只读的。oExcel.Visible = False
0赞
Rory
9/26/2023
@SiddharthRout其实没有。对 Rows 的非限定引用将创建一个隐式(应用程序)变量,该变量仅在调用应用程序关闭时才会清除。这就是为什么添加点可以解决问题的原因。
0赞
Siddharth Rout
9/26/2023
罗里,它不是仍然挂起的应用程序,但工作簿也处于打开状态,因此用户会收到只读警报。我知道隐式变量问题。它通常发生在互操作中,因此 GC 收集。在 VBA 中,我从未见过这种情况发生。就像我说的,我测试了它,没有留下任何实例:)
0赞
FunThomas
9/25/2023
#2
我看到您的代码有 2 个问题:
(a) 你有一个错误处理程序(Label),但你没有使用它(你的代码中没有语句)。如果现在遇到错误,并且调用代码使用自己的错误处理程序,则工作簿不会关闭,Excel 也不会停止。Error_Handler
On Error Goto Error_Handler
(b) 如果将使用错误处理程序并发生错误,则代码还将跳过关闭工作簿和 Excel 的语句。
代码可能如下所示:
Public Function agg_file_codifiche(Cognome, Nome, CF, password As String) As Long
Dim oExcel As Excel.Application
Dim oExcelWrkBk As Excel.Workbook
Dim oExcelWrSht As Excel.Worksheet
Dim xlsfile, xlssheet As String
Dim ur, code As Long
On Error Goto Error_Handler
Set oExcel = New Excel.Application
(...)
oExcelWrkBk.Save
Exit_Point:
If Not oExcelWrkBk is Nothing Then
oExcelWrkBk.Close
Set oExcelWrkBk = Nothing
End If
If Not oExcel Is Nothing Then
oExcel.Quit
Set oExcel = Nothing
End If
agg_file_codifiche = code
Exit Function
Error_Handler:
MsgBox Err & " - " & Err.Description
GoTo Exit_Point
End Function
顺便说一句:你使用晚期绑定而不是早期绑定有什么原因吗?
更新:由于代码已使用早期绑定来声明变量,因此我更新了打开 Excel 应用程序的语句。
评论
0赞
Rory
9/25/2023
OP 未使用后期绑定。这些变量被声明为特定的对象类型,而不是 .Object
0赞
Guriuz
9/25/2023
你是对的。实际上,我的代码包括错误处理,但我在更改中忘记了它......不好意思!' On Error Resume Next Set oExcel = GetObject(, “Excel.Application”) If Err <> 0 then Err.Clear On Error GoTo Error_Handler Set oExcel = CreateObject(“Excel.Application”) Else On Error GoTo Error_Handler End If'
0赞
FunThomas
9/25/2023
@Rory:你是对的,而且不对。这些变量是使用早期绑定声明的(我承认我没有注意到这一点),但用于创建 Excel 应用程序的代码。CreateObject
0赞
Rory
9/25/2023
用于实例化对象的方法不会以任何方式确定其绑定上下文。OP 的代码是早期绑定的。:)
0赞
FunThomas
9/25/2023
好的,没错。但是当语句为 时,编译器不会抛出错误。CreateObject("Word.Application")
0赞
Applecore
9/25/2023
#3
除了将 Excel 对象设置为无外,您还需要关闭/退出它们:
Exit_Point:
Set oExcelWrSht = Nothing
oExcelWrkBk.Close
Set oExcelWrkBk = Nothing
oExcel.Quit
Set oExcel = Nothing
agg_file_codifiche = code
Exit Function
评论
Dim oExcel As Excel.Application
Set oExcel = CreateObject("Excel.Application")
Dim oExcel As Excel.Application
Dim ws As Worksheet
Dim oExcel As New Excel.Application
oExcel.Visible = False
False