У меня большой файл проекта VBA / Excel .xlsm
, который внезапно начал перестать отвечать (я вынужден принудительно выйти из Excel), когда я нажимаю кнопку «Удалить строку», которая вызывает мою подпрограмму RemoveComparison
. Странно то, что саб иногда работает (и работал в прошлом). Это похоже на то, как если бы Excel вызывал максимум памяти, когда вызывался этот RemoveComparison
, а иногда - нет. Проблема исчезнет, если я закомментирую Application.Calculation = xlAutomatic
в последней строке. Однако, когда RemoveComparison
работает, для его завершения требуется около 2 полных секунд, так как я считаю, что скрытие строк или, возможно, удаление OLEObjects
вызывает большой пересчет на других листах, когда я устанавливаю режим расчета обратно на xlAutomatic
.
Кто-нибудь замечает, что может быть причиной того, что Excel перестает отвечать?
Вот скриншот рабочей книги. Кнопка «Удалить строку» вызывает sub RemoveComparison()
, который удаляет ComboBoxManagerComparison7
в этом случае (тот, у которого S & P 500), а также удаляет Comparison7CheckBox
перед тем, как скрыть ячейки (которые содержат формулы, ссылающиеся на другие листы). Если команда «Удалить строку» работает так же, как и раньше, повторное нажатие кнопки приведет к удалению сравнения 6 и т. Д.
![Screenshot](https://i.stack.imgur.com/vVtDR.png)
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 не отвечает.