Новости:

Теперь на форум можно залогиниться / зарегистрироваться с помощью ВКонтакте. Уже существующие пользователи могут связать свою учетную запись с аккаунтом ВКонтакте одним кликом в профиле пользователя http://forum.msexcel.ru/index.php?action=profile;area=account

Главное меню

Код в модуле_листа. О чем он?

Автор Алексей Вагрант, 16.01.2017, 14:31

« назад - далее »

Алексей Вагрант

Обнаружил у себя на вспомогательном листе следующую запись:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim adrs As String
If Not Application.Intersect(Target, Range("A2:I100")) Is Nothing Then
    Select Case Target.Address
        Case "$F$10"
            adrs = "A1"
        Case "$G$10"
            adrs = "B1"
        Case "$H$10"
            adrs = "C1"
        Case "$I$10"
            adrs = "D1"
        Case "$E$7"
            adrs = "D7"
    End Select
    Sheets("Год").Activate
    Sheets("Год").Range(adrs).Select
End If
End Sub

Подскажите, о чем она?  ::)

cheshiki1

при выделении ячейки на листе срабатывает код макроса.
проверяем если выделенная ячейка принадлежит диапазону "A2:I100" то смотрим адрес выделенной ячейки и если адрес "$F$10" то переменной adrs присваиваем значение "A1" если нет смотрим дальше.....
активируем лист "Год"
выделяем ячейку с адресом из полученной переменной.
Как то так.

vikttur

#2
Если выделена любая из ячеек диапазона A2:I100 и этого адреса нет в условиях поверки, будет ошибка  на строке:
Sheets("Год").Range(adrs).Select (переменная adrs не определена)
Для устранения ошибки и сокращения диапазона срабатывания кода измените строку:
If Not Application.Intersect(Target, Range("E7,F10:I10")) Is Nothing Then

Алексей Вагрант

Модуль работает, но...
В первоначальном варианте, без сокращения диапазона, при нажатии на ячейку вне диапазона открывается лист Год с произвольной ячейкой.
При сокращении диапазона до значений, задействованных в модуле, такого не происходит, но мой диапазон будет значительно расширен. Значит ли это, что в If Not Application.Intersect(Target, Range("E7,F10:I10")) Is Nothing Then надо прописывать все задействованные ячейки (они разбросаны по всему листу и между ними есть пустые ячейки, на которые я могу случайно нажать).

vikttur

Код срабатывает при выделении любой ячейки листа.
После этого проверяет, входит ли ячейка в указанный диапазон. Если не входит, макорос прекращает работу. Если входит - поверяет условия.
В зависимости от того, какой диапазон указан, и будут проходить проверки. Можно указать хоть весь диапазон листа.

Предположил, что будет ошибка, т.к. не указан адрес Range(adrs),

Алексей Вагрант


vikttur

#6
Dim adrs As Stringэто объявление переменной. Т.е. мы сообщаем системе, что под переменную нужно выделить определенный размер памяти. Тип переменной - String (строка, текст). После объявления переменная пуста: adrs="".
При выполнении одного из условий в переменную записывается адрес:
adrs = "A1", adrs = "D1"...
Перед завершением кода нужно активировать ячейку другого листа по этому адресу. Но если ни одно из условий не выполнено, переменная так и останется пустой:
Sheets("Год").Range("").Select
Эта строка говорит о том, что на листе "Год" нужно выделить ячейку "" :)

========================
Проверка.
Открыть редактор VBA, в любой модуль вписать код:
Sub test()
    Sheets("Год").Activate ' переходим на лист [i]Год[/i]
    Sheets("Год").Range("B5").Select ' выделяем ячейку [i]B5[/i]
    Sheets("Год").Range("").Select ' ОШИБКА: нет адреса
End Sub

Для удобства просмотра разместить на экране два окна - Excel (лист) и VBA (модуль). Активировать любой другой лист, не "Год".
Стать в любую строку кода и выполнить его пошагово (нажимая F8).
========================

Для устранения ошибки в Select Case добавить после всех еще одно условие - для всех прочих:
    Case Else
        adrs = "A5"

Вот теперь порядок - при любом результате адрес ячейки получен.

ЦитироватьКод срабатывает при выделении любой ячейки листа.
Почему у Вас ошибка не возникает - не знаю. Возможно, задействован еще какой-либо макрос.

kuklp1

Как вариант покороче и проще:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim adrs As String, s$
    If Application.Intersect(Target, Range("A2:I100")) Is Nothing Then Exit Sub
        s = Target.Address
        adrs = Switch(s = "$F$10", "A1", s = "$G$10", "B1", s = "$H$10", "C1", s = "$I$10", "D1", s = "$E$7", "D7")
        If adrs <> "" Then Application.Goto Sheets("Год").Range(adrs)
End Sub
Я, как всегда, чертовски адекватен... Email: kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728, E332314026771