Страницы: 1 2 След.
RSS
Запуск макроса при изменении значения одной конкретной ячейки
 
Доброе утро! Помогите заставить правильно работать макрос.
Скрытый текст

Он рабочий, но только любые изменения в любых ячейках на этом листе другими макросами, они(другие макросы) всегда обращаются к этой процедуре, что замедляет работу макроса. Нужно чтобы к этой процедуре было обращение только когда происходит изменение в ячейке указанной в этой процедуре но ни как не в каждой ячейке. Я пытался подставить код как рекомендует Юрий М тут но не известно почему не вышло.
Изменено: OSA913 - 25.07.2017 08:34:47
 
что-то в этом роде:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Range("A1").Address Then
        '<код>
    ElseIf Target.Address = Range("B1").Address Then
        '<код>
    End If
End Sub
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D3,F3,X3,Z3,AR3,AT3,AR5,AT5")) Is Nothing And Target.Count = 1 Then
    On Error Resume Next
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Select Case Target.Address
        Case "$D$3"
            Set KeyCells = Range("M3")
        Case "$F$3"
            Set KeyCells = Range("N3")
        Case "$X$3"
            Set KeyCells = Range("AE3")
        Case "$Z$3"
            Set KeyCells = Range("AG3")
        Case "$AR$3"
            Set KeyCells = Range("AX3")
        Case "$AT$3"
            Set KeyCells = Range("AY3")
        Case "$AR$5"
            Set KeyCells = Range("BA3")
        Case "$AT$5"
            Set KeyCells = Range("BC3")
    End Select
    KeyCells = Target
    CopyData1
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Изменено: Sanja - 25.07.2017 15:55:58
Согласие есть продукт при полном непротивлении сторон
 
Спасибо, но пока не работает макрос(
 
Покажите файл-пример
Согласие есть продукт при полном непротивлении сторон
 
Когда в vba клавишей F8 проверяю ход выполнения макроса "QQ", он заходит в процедуру "Private Sub Worksheet_Change" после  изменения значения в каждой ячейке. Нужно чтобы в "Private Sub Worksheet_Change"  желтая стрелка не попадала.
Изменено: OSA913 - 25.07.2017 11:43:38
 
Вариант webley так же работает как мой. Может так должно быть ..?
 
Цитата
OSA913 написал: заходит в процедуру "Private Sub Worksheet_Change" после  изменения значения в каждой ячейке
Правильно. Потому что возникает событие Изменения ячейки
Согласие есть продукт при полном непротивлении сторон
 
Цитата
OSA913 написал: но пока не работает макрос
Что значит не работает? Вы поймите, что Событие изменения ячейки возникает при изменении ЛЮБОЙ ячейки на листе, и обработчик этого события (Private Sub Worksheet_Change) будет выполняться в ЛЮБОМ случае. Другое дело КАК он будет выполняться. Проверьте мой макрос (чуть подкорректировал его в сообщении #3) и сравните время выполнения со своим. У Вас же проблема в том что работа макроса замедляется. Но это именно из-за того, что Ваш код написан не оптимально
Согласие есть продукт при полном непротивлении сторон
 
Доброе утро! Sanja, сам макрос не работает именно Ваш вариант. Посмотрите пожалуйста в примере. Сверху  два варианта за комментированные они работают.
 
OSA913, У вас
Код
Case "A1"
У Sanja
Код
Case "$D$3"
Разницу улавливаете ?)
Target.Address возвращает "$A$1" а не "A1"
 
Не работает(
 
OSA913,А я собственно не понимаю, как оно должно работать ?)  Так нужно ?
 
Точно. Спасибо! Действительно оптимальней такой вариант. Только теперь макрос "CopyData1" не всегда срабатывает. Как его поставить в коде чтобы он срабатывал всегда при изменении значения в любой ячейке листа?
 
Цитата
OSA913 написал:
теперь макрос "CopyData1" не всегда срабатывает
Перенесите CopyData1 после End If
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
Перенесите CopyData1 после End If
Будет непрерывный цикл т.к. CopyData1 меняя значения в ячейках снова возвращается в "Private Sub Worksheet_Change".
 
Логично. Тогда отключайте обработку событий сразу после начала процедуры
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
If Not Intersect(Target, Range("A1,A2,A3,A4,A5,A6,A7,A8")) Is Nothing And Target.Count = 1 Then
    On Error Resume Next
    Select Case Target.Address
    .......
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал: Логично...
Хотя не совсем. Мы же не знаем что Ваш макрос CopyData1 делает. Может он не изменяет ячейки на текущем листе
Согласие есть продукт при полном непротивлении сторон
 
Работает! Спасибо друзья!
 
Некоторые макросы слегка притормаживают, проверил, оказалось все из-за процедуры "CopyData", которая выглядит таким образом:
Скрытый текст

Решил от нее избавиться и перенести ее тело в процедуру события листа "Worksheet_Change" написал код в варианте предложенном Sanja. Макросы стали работать быстрее, но некоторые значения из ячеек не хотят копироваться.
Скрытый текст

Я думаю что из-за этого например из D3 должно копироваться в M3 и также на др лист в R3. Как раз не копируются значения там где нужно их  копировать сразу в два места. Помогите сделать чтобы можно было копировать значение с одной ячейки в два места. Сейчас составлю простой пример и приложу в следующем посте.
Изменено: OSA913 - 05.08.2017 09:11:49
 
Вот простой пример. Значения не копируются на лист2.
 
Напишите пожалуйста обычными словами -ЧТО, КУДА, ПРИ КАКИХ УСЛОВИЯХ должно копироваться. Потому что Ваш код неправилен и из него не понятно что Вы хотите получить на выходе
Согласие есть продукт при полном непротивлении сторон
 
Доброе утро) Хочу чтобы при изменении значения в любой из ячеек в A1:A4 в первом листе, значение из ячейки A1 копировалось в B1, A2 в B2, A3 в B3, A4 в B4 и так же из A1 и A2 в первом листе копировалось в A1 и A2 на втором листе.
Изменено: OSA913 - 05.08.2017 10:09:52
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
If Not Intersect(Target, Range("A1,A2,A3,A4")) Is Nothing And Target.Count = 1 Then
    On Error Resume Next
        Select Case Target.Address
        Case "$A$1"
          Set KeyCells = Range("B1")
          Set KeyCells2 = Sheets(2).Range("A1")
        Case "$A$2"
          Set KeyCells = Range("B2")
          Set KeyCells2 = Sheets(2).Range("A2")
        Case "$A$3"
            Set KeyCells = Range("B3")
        Case "$A$4"
            Set KeyCells = Range("B4")
    End Select
    KeyCells.Value = Target
    If Not KeyCells2 Is Nothing Then
        KeyCells2.Value = Target
    End If
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Некоторые ячейки не копируют значения в другой лист когда значение в них определяется формулой, копируются только при ручном вводе значения. Сделал такую же ситуацию на своем файле-примере копирует нормально. Не пойму почему так. Проверил код несколько раз-все написал правильно.
 
Цитата
OSA913 написал: Не пойму почему так
Потому что
Цитата
OSA913 написал: значение в них определяется формулой
Ручной ввод и изменение значения формулой это разные вещи. 'Повешайте' код на событие Private Sub Worksheet_Calculate()
Согласие есть продукт при полном непротивлении сторон
 
Не помогло. Но в файле-примере работает.
 
Хотя нет. В примере тоже перестало копировать когда в A1 ввел значение вручную.
 
Вы в реальном файле формулу тоже кодом вставляете? Покажите уже пример в РЕАЛЬНОЙ СТРУКТУРЕ и что Вы в нем пытаетесь получить. Я уже просил
Цитата
Sanja написал: ЧТО, КУДА, ПРИ КАКИХ УСЛОВИЯХ должно копироваться
Что и Куда Вы объяснили, а вот про условия не хотите. Где данные изменяются вручную? Где формулой? Где формула вставляется кодом?
Согласие есть продукт при полном непротивлении сторон
 
В реальном файле проблема точно такая же как и в файле-примере выше. Событием "Worksheet_Change" выполняется перенос значения из ячейки A1(лист1) в ячейку B1(лист1) и в ячейку A1(лист2) когда ввожу значение в A1 в ручную - с этим проблем уже нет. Когда жму на ячейку A5(лист1), макрос задает ячейке A1(лист1) формулу =A2*A3(лист1) - с этим проблем тоже нет. Проблема - когда меняю значение в A2(лист1), в A1 меняется значение (т.к. формула), но оно не копируется в ячейку B1(лист1) и в ячейку A1(лист2). Как это поправить?
Страницы: 1 2 След.
Читают тему
Наверх