Remkomplekty.ru

IT Новости из мира ПК
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel событие изменения ячейки

Vba excel событие изменения ячейки

Я в VBA НОЛЬ. Пишу, вообще-то на делфях. Но приспичило написать к екселю. Столкнулся с проблемой вот такой:

как отловить сообщение от екселя на изменение содержимого конкретной ячейки? (A1 или B1)

меня интересуют ячеки A1, B1, C1. Я хочу чтобы, после внесения пользователем в ячейки A1, B1 данных, считалось C1, как A1+B1.

1. какая ячека редактируется (ловить сообщение на изменение)

2. сделать пересчёт С1

Помогите кодом, пожайлуста.

Номер ответа: 1
Автор ответа:
dedtolya

Может не надо усложнять?

Для данного случая достаточно формулы в [c1]»=A1+B1″

Ну а если уж больно хоцца в VBA -прошу:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target = Range(«A1») Or Target = Range(«B1») Then

Range(«C1»).Value = Range(«A1»).Value + Range(«B1»).Value

«Этот код поместить кликнув правой на имени листа и в контекстном меню выбрать «Исходный текст»

Номер ответа: 2
Автор ответа:
AlekseyITN

извиняюсь за корявость кода, НО. оно ни фига не пашет.

Private Sub Worksheet_Change(ByVal Target As Range)

If Target = Range(«B2») Or Target = Range(«C2») Or Target = Range(«D2») Or Target = Range(«E2») Or Target = Range(«F2») Or Target = Range(«H2») Or Target = Range(«G2») Then
My (Target.Address)
Range(«J2»).Value = 3301 * N * k1 * k2 * k3 * k4 * k5 * k6
Exit Sub
End If

If Target = Range(«B3») Or Target = Range(«C3») Or Target = Range(«D3») Or Target = Range(«E3») Or Target = Range(«F3») Or Target = Range(«H3») Or Target = Range(«G3») Then
My (Target.Address)
Range(«J3»).Value = (1132 + 206.69 * N) * k1 * k2 * k3 * k4 * k5 * k6
Exit Sub
End If

Private Sub My(ByVal Stroka As String)
NumberOfLetters = Len(Stroka)
MsgBox Stroka
If NumberOfLetters = 4 Then
NomerStroki = Right(Stroka, 1)
End If
If NumberOfLetters = 5 Then
NomerStroki = Right(Stroka, 2)
End If
If NumberOfLetters = 6 Then
NomerStroki = Right(Stroka, 3)
End If

If Range(«B» + NomerStroki).Value <> 0 Then
N = Range(«B» + NomerStroki).Value
Else
Range(«J» + NomerStroki).Value = «введите число»
End If
If Range(«C» + NomerStroki).Value = 0 Then
k1 = 1
Else: k1 = Range(«C» + NomerStroki).Value
End If

If Range(«D» + NomerStroki).Value = 0 Then
k2 = 1
Else: k2 = Range(«D» + NomerStroki).Value
End If

If Range(«E» + NomerStroki).Value = 0 Then
k3 = 1
Else: k3 = Range(«E» + NomerStroki).Value
End If

If Range(«F» + NomerStroki).Value = 0 Then
k4 = 1
Else: k4 = Range(«F» + NomerStroki).Value
End If

If Range(«G» + NomerStroki).Value = 0 Then
k5 = 1
Else: k5 = Range(«G» + NomerStroki).Value
End If

If Range(«H» + NomerStroki).Value = 0 Then
k6 = 1
Else: k6 = Range(«H» + NomerStroki).Value
End If
End Sub

Почему когда я захожу в ячейку F3, ничего не изменяю в ней. переключаюсь на E3, то оно считает Бог знает что. перемножает строку 3 и впихивает это всё в результат второй строки J2. ПОЧЕМУ?

Как отследить событие(например выделение ячеек) в любой книге?

Иногда при разработке надстройки просто необходимо отследить какое-либо событие в книге. Но модуль ЭтаКнига и модули листов надстройки позволяют отследить лишь те события, которые происходят в той книге, в которой этот код прописан. А как же другие книги? Как, например, отследить событие открытия любой книги в Excel и сделать какое-то действие в зависимости от имени открытой книги? Или как отследить выделение ячейки в любой книге? Изменение значений ячеек?

Если не знаете что такое надстройка — Как создать свою надстройку?

На самом деле все до смешного просто:
В модуле ЭтаКнига главной книги(надстройка либо PERSONAL.XLS) необходимо создать переменную, которая будет ссылкой на все приложение Excel

Private WithEvents App As Application

На событие открытия главной книги (той, в которой пишется код и в которой объявили переменную App — опять же это надстройка либо PERSONAL.XLS) присваиваем этой переменной App значение запущенного приложения Excel:

Private Sub Workbook_Open() Set App = Application End Sub

Т.е. мы теперь имеем как бы свою локальную управляемую ссылку на Excel. Это позволит нам получить доступ к событиям приложения Excel из VBA и отследить их. И среди прочих событий есть такие, которые относятся ко всем открытым книгам. Т.е. то же выделение ячеек мы сможем обработать только внутри своей надстройки, но срабатывать оно будет при выделении ячеек в любой открытой книге.
Теперь создаем непосредственно событие — аналогично выбору других событий в книге в левом окне выбора объектов выбираем App. В правом появятся все доступные события для нашего объекта App:

в этом окне перечислены все события, которые могут быть «перехвачены» в любой открытой книге, а не только той, в которой этот код записан. Сразу после выбора какого-либо события из списка автоматически будет создана пустая процедура, в которую надо будет лишь добавить необходимый код.
Рассмотрим некоторые из этих событий.

Вот так, например, будет выглядеть код отслеживания открытия любой книги :

Private Sub App_WorkbookOpen(ByVal Wb As Workbook) MsgBox «Вы открыли книгу:» & Wb.Name End Sub

Теперь при открытии любой книги будет появляться сообщение с именем именно открытой книги.
Wb — это переменная событийной процедуры. Для каждой процедуры они могут отличаться или вовсе отсутствовать. Но если они есть — значит можно их использовать. Например, в этой процедуре( App_WorkbookOpen ) Wb это открываемая книга, т.е. объект типа Workbook. И к ней можно обращаться как к любой книге: перебрать листы, изменить какие-то свойства и т.п. Например, в коде выше я просто вывожу в информационное окно с именем открываемой книги.

Сам по себе код не заработает. Т.к. назначение значения переменной App происходит только при открытии самой книги(надстройки или PERSONAL), то после создания кодов надо будет сохранить эту книгу и открыть заново

А с помощью этого кода можно отследить создание новой книги :

Private Sub App_NewWorkbook(ByVal Wb As Workbook) MsgBox «Вы создали новую книгу» End Sub

Отслеживаем выделение ячеек во всех открытых книгах :

Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) MsgBox «Вы выделили ячейку с адресом: » & Target.Address End Sub

Читать еще:  Как сделать ячейку активной в excel

Target — это объект Range(ячейка или диапазон ячеек), которые были выделены в книге.
Sh — это объект Worksheet, ячейки которого были выделены.
Таким образом у нас есть две переменные, которые мы можем использовать. Например, можно производить определенные действия только на листах с конкретным именем:

Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name = «Отчет» Then MsgBox «Вы выделили ячейку с адресом: » & Target.Address End If End Sub

А процедура ниже поможет отследить изменение значений ячеек во всех открытых книгах и отменить нежелательные изменения:

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim bUndo As Boolean If Sh.Name <> «Для изменений» Then If Sh.Name = «Описание» Then ‘для этого листа можно изменять только ячейки диапазона «A16:B20» If Intersect(Target, Sh.Range(«A16:B20»)) Is Nothing Then MsgBox «На этом листе изменять можно только ячейки в диапазоне ‘A16:B20’!», vbCritical, «www.excel-vba.ru» bUndo = True End If Else ‘для всех других листов, кроме листа «Для изменений» — изменять значения ячеек вообще нельзя MsgBox «Ячейки на этом листе нельзя изменять!», vbCritical, «www.excel-vba.ru» bUndo = True End If If bUndo Then With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End If End Sub

В приложенном к статье файле будет чуть более понятно что делает эта процедура.

Естественно, в таких процедурах можно назначить выполнение и других(нужных) действий. Например, вызов макроса ( Call ИмяМакроса ). Макрос в таком случае должен быть размещен в стандартном модуле и иметь статус Public (или вовсе без статуса). Сам модуль должен тоже находится в той же книге.

Tips_Macro_How_Catch_Events.xls (60,5 KiB, 3 865 скачиваний)

Статья помогла? Поделись ссылкой с друзьями!

Поиск по меткам

Супер. очень доходчиво, понятно. То что искал. Ставлю +1 в гугл плюс

Всё это хорошо, но при необходимости повторного выбора этой же ячейки событие не происходит и, естественно, программа выполнятся не будет (проверено). Что можете посоветовать в этом случае. я не проверяю другие книги, но в открытой нужно выбрать конкретную ячейку и обработать содержимое, в результате чего содержимое может изменится. Я использую следующую конструкцию:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox («Вы выбрали ячейку с адресом: » & Target.Row & » » & Target.Column) End Sub

И для того чтобы снова выбрать ту же ячейку приходится заводить незначащие ячейки, чтобы выбрав их иметь возможность вернутся к предыдущему выбору.
Очень уж мудрёно получилось, но надеюсь понятно.

Ничего не посоветую, т.к. события не произойдет, если ячейка уже выделена. Может имеет смысл присмотреться к событию Worksheet_Change, раз содержимое обрабатываете без выхода из ячейки?

Ну, и как же сделать РАБОЧЕЕ событие для отслеживания события при свёртывании приложения Excel?

Imort, для начала задать вопрос не «ну, и как же» — здесь Вам никто ничего не должен. После чего прочитать внимательно статью и сделать как написано. И просмотреть все доступные события. Может тогда найдете событие WindowResize. И найдете у передаваемого объекта Wn свойство WindowState.

Спасибо, отличный макрос

Ни auto_open на листе, ни Workbook_Open на книге не срабатывают. Как еще можно запустить макрос автоматически?

Игорь, давайте поменьше категоризма и побольше конкретики. Кто сказал, что auto_open должен быть на листе? Эта процедура размещается в стандартном модуле, т.к. она использовалась в те лихие времена, когда событийные процедуры листов и книг не встраивались в листы и книги.
Не работает только у Вас. Значит и дело в Вас или Вашем ПК, Excel. Опишите подробно свои действия — как что и куда записываете, как проверяете работу. Включены ли макросы вообще.

Дмитрий, прошу помощи)

У меня есть форма — нажимая на кнопку открывается нужный мне файл Excel, а форма сворачивается.
Как сделать так, чтобы после закрытия файла — форма опять отображалась?

Private WithEvents App_calc As Application
Sub Workbook_Open()
Set App_calc = Application
End Sub

Private Sub App_calc_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
If Wb.Name = «123_456_3.xlsm» Then
Application.EnableEvents = True
Cancel = False
F_Main_NEW.Show
End If
End Sub

Так не получается — форма открывается, а файл не закрывается, пока форму не закроешь 🙂

У Вас главная проблема в том, что форма показывается в модальном режиме. Это означает, что после показа формы дальнейшее выполнение кода в той процедуре, из которой форма вызвана, приостанавливается до тех пор, пока форма не будет закрыта.
Поэтому варианта два:
1. Отображать форму не модально: F_Main_NEW.Show 0
2. Отображать форму с запозданием. Создаете отдельную процедуру:

Sub ShowMainUF() F_Main_NEW.Show End Sub

а в процедуре WorkbookBeforeClose вызывать уже через Application.OnTime эту процедуру:

Private Sub App_calc_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) If Wb.Name = «123_456_3.xlsm» Then Application.OnTime Now+TimeValue(«00:00:01″),»ShowMainUF» End If End Sub

Тогда сначала книга будет закрыта, а потом уже отображена форма.

Дмитрий, добрый день!
Подскажите, пожалуйста.Хочу чтобы при сохранении файла в определенном листе фиксировалась дата сохранения(так сказать журнал изменений файла). Т.е. прописываю нужный мне код на Sub Workbook_AfterSave. Отрабатывает отлично. Но на случай сохранения файла через закрытие и появления диалогового окна о сохранении, я добавил этот же код на событие Workbook_BeforeClose. но к сожалению при нажатии пользователем на кнопку отмены — скрипт уже отработал. Есть ли возможность отловить эти кнопки на диалоговом окне сохранения? Заранее благодарю за помощь.
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
With Sheets(3)
lLastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
.Range(«A» & lLastRow).Value = Now
.Range(«B» & lLastRow).Value = Application.UserName
End With
End Sub

Читать еще:  Функции впр в excel примеры видео

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=»999999″
With Sheets(3)
lLastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
.Range(«A» & lLastRow).Value = Now
.Range(«B» & lLastRow).Value = Application.UserName
End With
If Cancel Then Sheets(1).Unprotect Password:=»999999″
End Sub

Sub Workbook_Open()
Sheets(1).Unprotect Password:=»999999″
End Sub

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме — добро пожаловать на Форум

Как получить старое значение измененной ячейки в Excel VBA?

Я обнаруживаю изменения в значениях определенных ячеек в электронной таблице Excel, как это.

предполагая, что это не слишком плохой способ кодирования, как мне получить значение ячейки до изменения?

14 ответов

объявить переменную say

и SelectionChange событие

и в Worksheet_Change событие

вы можете использовать событие для изменения ячейки, чтобы запустить макрос, который делает следующее:

у меня есть альтернативное решение для вас. Можно создать скрытый лист для сохранения старых значений диапазона интересов.

удалить его, когда книга закрыта.

и измените событие Worksheet_Change следующим образом.

вот способ, который я использовал в прошлом. Обратите внимание, что вам нужно добавить ссылку на среду выполнения сценариев Microsoft, чтобы вы могли использовать объект Dictionary — если вы не хотите добавлять эту ссылку, вы можете сделать это с коллекциями, но они медленнее, и нет элегантного способа проверить .Существует (вы должны поймать ошибку).

Как и любой подобный метод, у этого есть свои проблемы-во-первых, он не будет знать «старое» значение, пока значение не будет фактически изменено. Фиксировать это вам нужно будет поймать открытое событие в книге и пройти через лист.UsedRange населяя OldVals. Кроме того, он потеряет все свои данные, если вы сбросите проект VBA, остановив отладчик или что-то подобное.

Мне тоже пришлось это сделать. Я нашел решение от «Chris R» действительно хорошо, но подумал, что оно может быть более совместимым, не добавляя никаких ссылок. Крис, ты говорил об использовании коллекции. Итак, вот еще одно решение с использованием Collection. И в моем случае это не так уж и медленно. Кроме того, с помощью этого решения при добавлении события «_SelectionChange» он всегда работает (нет необходимости в workbook_open).

  • напишите это в ThisWorkbook модуль
  • закройте и откройте книгу

попробуйте это, он не будет работать для первого выбора, тогда он будет работать хорошо:)

мне нужно было захватить и сравнить старые значения с новыми значениями, введенными в сложную таблицу планирования. Мне нужно было общее решение, которое работало, даже когда пользователь менял много строк одновременно. Решение реализовало класс и коллекцию этого класса.

есть три листа, на которых я отслеживаю ячейки. Каждый лист получает свою собственную коллекцию как глобальную переменную в модуле с именем ProjectPlan как следует:

суб InitDictionaries вызывается из рабочего листа.откройте, чтобы установить коллекции.

для управления каждой коллекцией объектов oldValue используются три модуля: Add, Exists и Value.

тяжелый подъем выполняется в обратном вызове Worksheet_SelectionChange. Один из четырех показан ниже. Единственное отличие-это коллекция, используемая в вызовах ADD и EXIST.

значение вызов вызывается из кода, выполненного, например, из обратного вызова Worksheet_Change. Мне нужно назначить правильную коллекцию на основе имени листа:

и затем я могу вычислить сравнение некоторого текущего значения с исходным значением.

давайте сначала посмотрим, как обнаружить и сохранить значение одной ячейки интереса. Предположим Worksheets(1).Range(«B1») ваша ячейка интереса. В обычном модуле используйте следующее:

затем в модуле рабочих листов (1):

это будет захватить изменение Worksheets(1).Range(«B1») , происходит ли изменение из-за того, что пользователь активно выбирает эту ячейку на листе и изменяет значение, или из-за других кодов VBA, которые изменяют значение Worksheets(1).Range(«B1») .

С мы объявили переменную StorageArray как public, вы можете ссылаться на его последнее значение в других модулях в том же проекте VBA.

чтобы расширить нашу область до обнаружения и сохранения значений нескольких интересующих ячеек, вам необходимо:

  • объявить StorageArray как двумерный массив с количеством строк, равным числу ячеек ведется наблюдение.
  • изменить Sub SaveToStorageArray процедура для более общего Sub SaveToStorageArray(TargetSingleCell as Range) и изменить соответствующий коды.
  • изменить Private Sub Worksheet_Change процедура для размещения мониторинга этих нескольких ячеек.

приложение: Для получения дополнительной информации о времени жизни переменных, пожалуйста, обратитесь к:https://msdn.microsoft.com/en-us/library/office/gg278427.aspx

в ответ на ответ Мэтта Роя я нашел этот вариант отличным ответом, хотя я не мог опубликовать как таковой с моим текущим рейтингом. 🙁

Итак, спасибо Мэтту Рою за доведение этого кода до нашего сведения и Крису.R для размещения исходного кода.

мне нужна была эта функция, и мне не понравились все решения выше, попробовав большинство, поскольку они либо

  1. медленно
  2. имеют сложные последствия, такие как использование приложения.расстегивать.
  3. не захватывать, если они не были выбраны
  4. не захватывает значения, если они не были изменены до
  5. слишком сложно

Ну, я очень много думал об этом, и я завершил решение для полной отмены, повтора история.

захватить старое значение на самом деле очень легко и очень быстро.

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

для захвата всех значений я использовал эту простую команду

Да, просто это, на самом деле excel вернет массив, если диапазон является несколькими ячейками, поэтому нам не нужно использовать для каждой команды, и это очень быстро

следующий подраздел-это полный код, который должен быть вызван в Workbook_SheetActivate. Для фиксации изменений необходимо создать еще одну подзаголовок. Например, у меня есть sub под названием «catchChanges», который работает на Workbook_SheetChange. Он будет захватывать изменения, а затем сохранять их на другом листе истории изменений. затем выполняется UpdateCache, чтобы обновить кэш новые значения

Читать еще:  Tab в excel

Теперь получить старое значение очень просто, так как массив имеет тот же адрес ячеек

примеры если мы хотим ячейку D12, мы можем использовать следующее

Это фрагмент, объясняющий метод, я надеюсь, что всем это нравится

VBA Excel. Изменение значений других ячеек из функции

Изменение значений других ячеек из пользовательской функции VBA Excel с помощью методов Range.Replace и Application.Volatile. Примеры кода.

Функция с методом Range.Replace

Пользовательская функция не предназначена для изменения значений ячеек, кроме той, в которой она расположена. Попытка присвоить какое-либо значение из функции другой ячейке приводит к неработоспособности функции и отображению в ячейке, где она расположена, сообщения «#ЗНАЧ!».

Но, как ни странно, внутри процедуры Function работает метод Range.Replace, которым мы воспользуемся для изменения значений других ячеек из пользовательской функции.

Пример 1
Эта функция заменяет значение ячейки Cell1 на значение ячейки Cell2 увеличенное на 100. Сама функция размещается в третьей ячейке, чтобы не возникла циклическая ссылка.

В этом примере мы не присваиваем пользовательской функции значение, поэтому отображается значение по умолчанию – 0. Если объявить эту функцию как строковую: Function Primer1(Cell1 As Range, Cell2 As Range) as String , будет возвращена пустая строка.

Изменение значения ячейки C1 (Cell2) приведет к пересчету значения ячейки B1 (Cell1).

Попробуйте очистить или перезаписать ячейку B1 (Cell1), ничего не получится, так как функция Primer1 вновь перезапишет ее значением C1 (Cell2) + 100.

Метод Application.Volatile

Рассмотрим пересчет функции на следующем примере:

Пример 2

Эта функция будет пересчитываться только при изменении значений ячеек B1 и C1, присвоенных переменным Cell1 и Cell2. При изменении значения ячейки C2, значение ячейки B2 не изменится, так как не будет запущен пересчет функции Primer2.

Функция Primer2 начнет вести себя по-другому, если добавить в нее оператор Application.Volatile (переименуем ее в Primer3):

Пример 3

Теперь при смене значения в ячейке C2, значение ячейки B2 тоже изменится.

В предыдущих примерах функциям не присваивалось конечное значение, чтобы показать, что такое возможно. При присвоении значения пользовательской функции следует следить за тем, чтобы не возникало циклических ссылок между ячейками с изменяемыми функцией значениями, в том числе и той, в которой размещена функция.

Безопасное использование функции

Если вам все-таки хочется в важном проекте VBA Excel с помощью одной пользовательской функции изменять значения нескольких ячеек, есть полностью безопасный вариант.

Он заключается в добавлении дополнительного аргумента в пользовательскую функцию, с помощью которого для каждой ячейки можно вывести отдельный результат. Функция размещается в каждой изменяемой ячейке.

В простых случаях для выбора можно использовать функцию Choose или, в более сложных, оператор If…Then…Else и оператор Select Case.

Пример 4
Используем функцию Choose для выбора способа вычисления пользовательской функции в зависимости от значения дополнительного аргумента:

События в Excel

Термин “Событие Excel” используется для обозначения определённых действий, совершаемых пользователем в Excel. Например, когда пользователь переключает лист рабочей книги – это событие. Ввод данных в ячейку или сохранение рабочей книги – это тоже события Excel.

События могут быть связаны с рабочим листом Excel, с диаграммами, рабочей книгой или непосредственно с самим приложением Excel. Программисты могут создавать код VBA, который будет выполняться автоматически при наступлении того или иного события.

Например, чтобы макрос запускался каждый раз, когда пользователь переключает рабочий лист в книге Excel, нужно создать код VBA, который будет выполняться каждый раз при возникновении события SheetActivate рабочей книги.

А если нужно, чтобы макрос запускался каждый раз при переходе на какой-то определённый рабочий лист (например, Лист1), то код VBA должен быть связан с событием Activate для этого листа.

Код VBA предназначенный для обработки событий Excel, должен быть помещён в соответствующем объекте рабочего листа или книги в окне редактора VBA (редактор можно открыть нажатием Alt+F11). Например, код, который должен выполняться каждый раз при возникновении определённого события на уровне рабочего листа, должен быть размещён в окне кода для этого рабочего листа. Это показано на рисунке:

В редакторе Visual Basic можно посмотреть набор всех событий Excel, доступных на уровне рабочей книги, рабочего листа или диаграммы. Откройте окно кода для выбранного объекта и в левом выпадающем меню в верхней части окна выберите тип объекта. В правом выпадающем меню вверху окна будут показаны события, определённые для этого объекта. На рисунке ниже показан список событий, связанных с рабочим листом Excel:

Кликните по нужному событию в правом выпадающем меню, и в окно кода для этого объекта будет автоматически вставлена процедура Sub. В заголовке процедуры Sub Excel автоматически вставляет необходимые аргументы (если таковые имеются). Остаётся только добавить код VBA, чтобы определить, какие действия процедура должна выполнить, когда нужное событие будет обнаружено.

Пример

В следующем примере каждый раз при выборе ячейки B1 на рабочем листе Лист1 появляется окно с сообщением.

Чтобы выполнить это действие, нам нужно использовать событие рабочего листа Selection_Change, которое возникает каждый раз, когда изменяется выделение ячейки или диапазона ячеек. Функция Selection_Change получает в качестве аргумента Target объект Range. Так мы узнаём, какой диапазон ячеек был выделен.

Событие Selection_Change происходит при любом новом выделении. Но нам нужно, чтобы набор действий был выполнен только при выделении ячейки B1. Для этого будем отслеживать событие только в заданном диапазоне Target. Как это реализовано в программном коде, показанном ниже:

Ссылка на основную публикацию
Adblock
detector