Excel перестает отвечать после того, как VBA устанавливает режим расчета после удаления объектов OLEObject и скрытия строк - PullRequest
1 голос
/ 14 марта 2019

У меня большой файл проекта VBA / Excel .xlsm, который внезапно начал перестать отвечать (я вынужден принудительно выйти из Excel), когда я нажимаю кнопку «Удалить строку», которая вызывает мою подпрограмму RemoveComparison. Странно то, что саб иногда работает (и работал в прошлом). Это похоже на то, как если бы Excel вызывал максимум памяти, когда вызывался этот RemoveComparison, а иногда - нет. Проблема исчезнет, ​​если я закомментирую Application.Calculation = xlAutomatic в последней строке. Однако, когда RemoveComparison работает, для его завершения требуется около 2 полных секунд, так как я считаю, что скрытие строк или, возможно, удаление OLEObjects вызывает большой пересчет на других листах, когда я устанавливаю режим расчета обратно на xlAutomatic .

Кто-нибудь замечает, что может быть причиной того, что Excel перестает отвечать?

Вот скриншот рабочей книги. Кнопка «Удалить строку» вызывает sub RemoveComparison(), который удаляет ComboBoxManagerComparison7 в этом случае (тот, у которого S & P 500), а также удаляет Comparison7CheckBox перед тем, как скрыть ячейки (которые содержат формулы, ссылающиеся на другие листы). Если команда «Удалить строку» работает так же, как и раньше, повторное нажатие кнопки приведет к удалению сравнения 6 и т. Д.

Screenshot

 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 и вручную нажму Формулы-> Параметры расчета-> Автоматически, весь рабочий лист пересчитывается, даже если ячейки не редактируются. Я понимаю, что скрытие ячеек приводит к пересчету, но должно ли скрытие строки вызывать пересчет всего листа (даже если у скрытой строки нет зависимостей)?

РЕДАКТИРОВАТЬ : Excel перестает падать, если я перемещаю ComboBoxes и CheckBoxes на другую часть листа, а не удаляю их в подпрограмме. Я не уверен, почему удаление этих OLEObjects привело к тому, что Excel не отвечает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...