首页 > 解决方案 > 删除 OLEObjects 并隐藏行后 VBA 设置计算模式后 Excel 停止响应

问题描述

我有一个大型 VBA/Excel 项目文件,当我单击调用我的子程序.xlsm的“删除行”按钮时,它突然开始停止响应(被迫强制退出 Excel) 。RemoveComparison奇怪的是,潜艇偶尔会起作用(并且过去曾起作用)。就好像 Excel 在RemoveComparison调用它时有时会耗尽内存,而其他时候则不会。Application.Calculation = xlAutomatic如果我在最后一行注释掉,问题就会消失。但是,什么时候RemoveComparison起作用,大约需要 2 秒才能完成,因为我相信OLEObjects当我将计算模式设置回xlAutomatic.

有没有人发现可能导致 Excel 停止响应的原因?

这是工作簿的屏幕截图。Remove Row 按钮调用在这种情况下RemoveComparison()删除的子程序ComboBoxManagerComparison7(带有 S&P 500 的子程序),并且Comparison7CheckBox在隐藏单元格(其中包含引用其他工作表的公式)之前删除。如果删除行像以前一样工作,再次单击该按钮将删除比较6,等等。

截屏

 Sub RemoveComparison()
        Application.Calculation = xlManual
        Dim CurrentNumberOfComparisons As Integer

    With Sheets("Manager")
        'get current number of comparisons (to determine which ComboBox, etc. to remove)
        CurrentNumberOfComparisons = .Range("NumberOfComparisons").Value

        If CurrentNumberOfComparisons = 1 Then
            MsgBox ("Min 1 comparison")
            Exit Sub
        End If

        Dim ComboBoxName As String
        'determine name of ComboBox to remove
        ComboBoxName = "ComboBoxManagerComparison" & CurrentNumberOfComparisons

        Call DeleteComboBox(ComboBoxName, Sheets("Manager"))

        #If DEBUGREMOVECOMPARISON Then
            Debug.Print "Deleted ComboBox"
        #End If

        Dim CheckBoxName As String
        'determine name of CheckBox to remove
        CheckBoxName = "Comparison" & CurrentNumberOfComparisons & "CheckBox"
        Call DeleteCheckBox(CheckBoxName, Sheets("Manager"))

        #If DEBUGREMOVECOMPARISON Then
            Debug.Print "Deleted CheckBox"
        #End If

        Dim ComparisonCellToHideNamedRange As String
        'determine which cells to hide
        ComparisonCellToHideNamedRange = "selectedManagerComparison" & CurrentNumberOfComparisons & "Name"

        Dim ComparisonCellToHide As Range

        Set ComparisonCellToHide = .Range(ComparisonCellToHideNamedRange)

        Range(Rows(ComparisonCellToHide.row), Rows(ComparisonCellToHide.row + 3)).Hidden = True

        'update current number of comparisons
        .Range("NumberOfComparisons").Value = CurrentNumberOfComparisons - 1

        #If DEBUGREMOVECOMPARISON Then
            Debug.Print "Success"
        #End If

    End With
    Application.Calculation = xlAutomatic
End Sub

Sub DeleteComboBox(ComboBoxName As String, Sheet As Worksheet)

With Sheet
    .OLEObjects(ComboBoxName).Delete
End With

End Sub

Sub DeleteCheckBox(CheckBoxName As String, Sheet As Worksheet)

    With Sheet
        .OLEObjects(CheckBoxName).Delete
    End With
End Sub

编辑:仍然不清楚为什么从xlManual返回到xlAutomatic子中的切换会导致无响应,但是如果我注释掉子的最后一行Application.Calculation = xlAutomatic并手动单击公式->计算选项->自动,即使没有单元格也会重新计算整个工作表被编辑。我知道隐藏单元格会导致重新计算,但是隐藏一行是否会导致重新计算整个工作表(即使隐藏的行没有依赖项)?

编辑:如果我将 ComboBoxes 和 CheckBoxes 移动到工作表的另一部分而不是在 sub 中删除它们,Excel 将停止崩溃。我不确定为什么删除这些 OLEObjects 会导致 Excel 输入无响应。

标签: excelvbaperformance

解决方案


推荐阅读