Excel 保留在后台

Excel remains in the background

提问人:Guriuz 提问时间:9/25/2023 最后编辑:Guriuz 更新时间:9/25/2023 访问量:85

问:

使用访问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`
Excel VBA MS-Access

评论

0赞 Foxfire And Burns And Burns 9/25/2023
未经过测试,但您进行了测试,然后看起来您正在创建 2 个 Excel 实例?Dim oExcel As Excel.ApplicationSet oExcel = CreateObject("Excel.Application")
2赞 FunThomas 9/25/2023
不。 刚刚声明了一个变量。Like 将声明一个 Worksheet 变量(但不创建 Worksheet)。如果你使用Dim oExcel As Excel.ApplicationDim ws As WorksheetDim oExcel As New Excel.Application
0赞 Siddharth Rout 9/25/2023
你已经得到了答案......如果你有一个适当的错误处理程序,你就会在自己的:)发现错误此外,由于以下行,您必须手动终止该进程 我的建议是:直到您不能 100% 确定您的代码完全没有错误,请不要隐藏您的对象。一旦一切正常,你就可以隐藏它。在您的情况下,如果您不将 visible 属性设置为,您将直观地看到 Excel 应用程序保持打开状态。oExcel.Visible = FalseFalse

答:

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_HandlerOn 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