Шаг 50 - Определяем выделенную ячейку

Давайте посмотрим как определить событие выбора определной ячейки. Первое - это надо определить, что вообще что-то выбрали. Для этого создайте книгу. Запустите редактор VBA и щелкните на листе. Для данного листа будет создана функция SelectionChange, если ее нет, то у Вас всегда есть возможность ее выбрать. Теперь впишите код сообщения в функцию, чтобы увидеть, что происходит.

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
	MsgBox Target.Address
End Sub

У Вас теперь есть возможность щелкать по ячейкам конкретного листа, я еще раз повторяю и вы получите сообщение с адресом ячейки. Сообщение выбора ячейки обрабатывается локально. А что если у нас надо обрабатывать это сообшение с трех листов и желательно вместе. Для этого нужно создать модуль и в нем процедуру обработки. Я пока поместил туда просто вывод информационного окна.

Public Sub Selection_Cell(ByVal Addres As String, ByVal List As String)
	MsgBox Addres + " " + List
End Sub

И соотвественно надо пересылать туда данный с каждого листа.

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
	Selection_Cell Target.Address, Target.Worksheet.Name
End Sub

Вот с этого момента можно вставлять вызов функции Selection_Cell на каждый лист в ответ на реакцию выделения.

Но это еще не все. Дело в том, что передается объект типа RANGE, то есть нет разницы передана одна ячейка или диапазон. Но при выделении диапазона внутрь него может попасть и наша ячейка. Итак, нам надо бы анализировать диапазон. Давайте договоримся, что нам надо обязательно отловить момент выделения ячейки $A$1. Вот на всех листах. У нас для этого все есть. Процедура общая, в которой есть адрес. И реакция на выделение на каждом листе. Смотрим код:

Public Sub Selection_Cell(ByVal Addres As String, ByVal List As String)
	On Error GoTo Ends
	Dim Test As Range
	Dim Find As Range
	Dim Result As Range
	Dim x As Integer

	Set Find = Range("$A$1")
	Set Test = Range(Addres)

	Set Result = Intersect(Test, Find)
	x = Result.Count
	MsgBox "$A$1"
Ends:
End Sub

Идея простая. Мы имеем переданный диапазон Test и нужный Find. Как узнать, что один включает другой ??? Вызовем операцию пересечения Intersect. Результатом будет диапазон, который содержит пересечение. Так вот если искомая нам ячейка в нем есть, то нормально, а если нет, то обращение к Count вызовет ошибку. Этим мы и воспользовались.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.