Лучший ответ, который я одобряю, - это решение @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](https://i.stack.imgur.com/t8sha.jpg)