Циклы над флажками с VBA в Excel очень медленно - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть лист Excel с около 4500 флажками (я знаю, это звучит глупо, но это для клиента, пожалуйста, не спрашивайте ...). Просто написал VBA Sub ниже, чтобы снять все флажки вместе. Пока это работает, но это очень медленно, это занимает более 5 минут, пока все boces не будут сняты, и во время работы Sub вся Excel Applikation перестает работать. Я знаю, что 4500 чекбоксов довольно тихо, но мне интересно, действительно ли этого достаточно, чтобы поставить Excel в такие неприятности ... У кого-нибудь есть идеи?

Лучший Michael

Sub DeselectAll()
   Application.EnableCancelKey = False
   Application.Calculation = xlCalculationManual
   Application.ScreenUpdating = False
   Application.EnableEvents = False
   Dim wksA As Worksheet
   Dim intRow As Integer

   Set wksA = Worksheets("Companies")
   For intRow = 1 To 4513
      wksA.CheckBoxes("Checkbox_" & intRow).Value = False
   Next
 End Sub

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Без выбора:

Sub DeselectAll()
  With Worksheets("Companies").CheckBoxes
   .Value = xlOff
  End With
End Sub
0 голосов
/ 10 ноября 2018

Лучший ответ, который я одобряю, - это решение @EvR. Я не пытаюсь ответить, но предлагаю идею обходного пути.

Я проверил время, добавив 4000 ComboBox на чистый лист в пустую книгу с простым 3-строчным циклом (о боже, я забыл отключить обновление экрана, вычисления и т. Д.). Это заняло около 10 минут в моем старом ноутбуке. У меня не хватает смелости повторить испытание снова.

Когда я пытался использовать ваш кусок кода с циклом, это занимало всего 3-4 секунды, а с решением @ EvR без цикла, а выбор занимал 1-2 секунды. Эти времена являются фактическим временем, взятым с Debug.Print или записью в некоторые ячейки. Актуальная драма разворачивается после обновления экрана, расчетов, событий с активным листом. Он становится очень нестабильным, и любой неосторожный щелчок и т. Д. Приводит к тому, что Excel «не отвечает» в течение 2-5 минут.

Хотя Клиент и Босс всегда правы. Однажды в моей жизни мне удалось убедить кого-то в подобном подходе сотен кнопок на рабочем листе к чему-то виртуальному. Моя идея - создать виртуальный флажок на листе. Правильный размер ячейки и границы с проверкой правильности ячеек до «= ChrW (& H2714)» и игнорирования пробела, и простой код, подобный приведенному ниже, может сделать обходной тип обхода.

Public Prvsel As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim isect, Cl As Range
Set isect = Application.Intersect(Target, Range("C1:C4000"))

    If isect Is Nothing Then
    Set Prvsel = Nothing  'Release multiple selection
    Exit Sub
    End If

    If isect.Cells.Count > 1 Then
    Set Prvsel = isect        'storing multiple selection for next click event
    Else
        If Target.Value = ChrW(&H2714) Then
        Target.Value = ""
        Else
        Target.Value = ChrW(&H2714)
        End If
        If Not Prvsel Is Nothing Then
            For Each Cl In Prvsel.Cells
            Cl.Value = Target.Value
            Next Cl
        End If
    End If
End Sub

ScreenShot

0 голосов
/ 09 ноября 2018

Только не зацикливайтесь.

Это хороший пример того, когда Выбор может помочь:

К установите все флажки:

Sub dural()
    ActiveSheet.CheckBoxes.Select
    Selection.Value = xlOn
End Sub

К Снимите отметку Все флажки:

Sub dural2()
    ActiveSheet.CheckBoxes.Select
    Selection.Value = xlOf
End Sub

(проверено на флажках форм)

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