Трюк №87. Как при помощи макросов помечать и сбрасывать пометку ячеек при выделении
Иногда бывает трудно делать выбор при помощи флажков. К счастью, этот процесс можно упростить, написав немного кода.
При помощи рабочих книг Excel можно собирать данные для опросов. Обычно это делается путем вывода некоторого количества ответов, рядом с которыми стоят флажки. Пользователь выбирает нужные ответы, устанавливая соответствующие флажки. Проблема с применением этого метода заключается в том, что скоро в рабочей книге появятся сотни флажков.
Вместо этого можно написать немного очень простого кода VBA, чтобы помечать любую ячейку в указанном диапазоне одновременно с ее выделением. Если ячейка в указанном диапазоне уже помечена, код снимет пометку. Трюк этого кода заключается в использовании буквы «а» в ячейке, для которой установлен шрифт Marlett. Когда настанет время суммировать результаты, нужно будет просто подсчитать буквы «а» при помощи функции СЧЁТЕСЛИ (COUNTIF), например, так: =COUNITIF($A$1:A$100;"a")
, в русской версии Excel: =СЧЁТЕСЛИ($А$1:А$100;"а")
.
Следующие примеры кода работают только в диапазоне А1:А100, но их можно легко модифицировать для любого диапазона. Чтобы использовать этот код, перейдите на рабочий лист, на котором должны появиться пометки, правой кнопкой мыши щелкните ярлычок с именем листа и в контекстном меню выберите команду Исходный текст (View Code). Вставьте либо КОД 1 (если хотите, чтобы ячейка помечалась в момент, когда ее выделяют), либо КОД 2 (если хотите, чтобы ячейка помечалась двойным щелчком), приведенный в листинге 7.12.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | // Листинг 7.12 //КОД 1 - установить флажок одновременно с выделением Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("Al:A100")) Is Nothing Then Target.Font.Name = "Marlett" If Target = vbNullString Then Target = "a" Else Target = vbNullString End If End If End Sub //КОД 2 - установить флажок двойным щелчком Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range. Cancel As Boolean) If Not IntersectCTarget, Range("Al:A100")) Is Nothing Then Cancel = True //Предотвращает переход в режим редактирования Target.Font.Name = "Marlett" If Target = vbNullString Then Target = "a" Else Target = vbNullString End If End If End Sub |
Поместив нужный код на место, закройте окно, чтобы вернуться в Excel, и сохраните рабочую книгу. Если хотите проверить, помечена ли ячейка, проверьте ее содержимое.