Доброе утро! Помогите заставить правильно работать макрос.
Скрытый текст
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim KeyCells As Range
Set KeyCells = Range("D3")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range("M3") = Range("D3")
CopyData
End If
Set KeyCells = Range("F3")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range("N3") = Range("F3")
CopyData
End If
Set KeyCells = Range("X3")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range("AE3") = Range("X3")
CopyData
End If
Set KeyCells = Range("Z3")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range("AG3") = Range("Z3")
CopyData
End If
Set KeyCells = Range("AR3")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range("AX3") = Range("AR3")
CopyData
End If
Set KeyCells = Range("AT3")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range("AY3") = Range("AT3")
CopyData
End If
Set KeyCells = Range("AR5")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range("BA3") = Range("AR5")
CopyData
End If
Set KeyCells = Range("AT5")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Range("BC3") = Range("AT5")
CopyData
End If
Application.EnableEvents = True
End Sub
Он рабочий, но только любые изменения в любых ячейках на этом листе другими макросами, они(другие макросы) всегда обращаются к этой процедуре, что замедляет работу макроса. Нужно чтобы к этой процедуре было обращение только когда происходит изменение в ячейке указанной в этой процедуре но ни как не в каждой ячейке. Я пытался подставить код как рекомендует Юрий М тут но не известно почему не вышло.
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
Когда в vba клавишей F8 проверяю ход выполнения макроса "QQ", он заходит в процедуру "Private Sub Worksheet_Change" после изменения значения в каждой ячейке. Нужно чтобы в "Private Sub Worksheet_Change" желтая стрелка не попадала.
Что значит не работает? Вы поймите, что Событие изменения ячейки возникает при изменении ЛЮБОЙ ячейки на листе, и обработчик этого события (Private Sub Worksheet_Change) будет выполняться в ЛЮБОМ случае. Другое дело КАК он будет выполняться. Проверьте мой макрос (чуть подкорректировал его в сообщении #3) и сравните время выполнения со своим. У Вас же проблема в том что работа макроса замедляется. Но это именно из-за того, что Ваш код написан не оптимально
Согласие есть продукт при полном непротивлении сторон
Точно. Спасибо! Действительно оптимальней такой вариант. Только теперь макрос "CopyData1" не всегда срабатывает. Как его поставить в коде чтобы он срабатывал всегда при изменении значения в любой ячейке листа?
Логично. Тогда отключайте обработку событий сразу после начала процедуры
Код
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
.......
Согласие есть продукт при полном непротивлении сторон
Решил от нее избавиться и перенести ее тело в процедуру события листа "Worksheet_Change" написал код в варианте предложенном Sanja. Макросы стали работать быстрее, но некоторые значения из ячеек не хотят копироваться.
Скрытый текст
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
If Not Intersect(Target, Range("D3,F3,X3,Z3,AR3,AT3,AR5,AT5,AW42,I42,J42,J3,M3,N3,Q3,S3,Q30,R3,AE3,AG3,Y21,AI3,BF3,BH3,AX3,AY3,AZ3,BA3,AS18,BB3")) Is Nothing And Target.Count = 1 Then
On Error Resume Next
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("BB3")
Case "$AW$42"
Set KeyCells = Range("BF3")
Case "$I$42"
Set KeyCells = Sheets(9).Range("D17")
Case "$J$42"
Set KeyCells = Sheets(9).Range("D18")
Case "$J$3"
Set KeyCells = Sheets(9).Range("R2")
Case "$M$3"
Set KeyCells = Sheets(9).Range("R3")
Case "$N$3"
Set KeyCells = Sheets(9).Range("R4")
Case "$Q$3"
Set KeyCells = Sheets(9).Range("R5")
Case "$S$3"
Set KeyCells = Sheets(9).Range("R6")
Case "$Q$30"
Set KeyCells = Sheets(9).Range("U2")
Case "$R$3"
Set KeyCells = Sheets(9).Range("V2")
Case "$AE$3"
Set KeyCells = Sheets(10).Range("R2")
Case "$AG$3"
Set KeyCells = Sheets(10).Range("R3")
Case "$Y$21"
Set KeyCells = Sheets(10).Range("R4")
Case "$AI$3"
Set KeyCells = Sheets(10).Range("E17")
Case "$BF$3"
Set KeyCells = Sheets(11).Range("E17")
Case "$BH$3"
Set KeyCells = Sheets(11).Range("E18")
Case "$AX$3"
Set KeyCells = Sheets(11).Range("T2")
Case "$AY$3"
Set KeyCells = Sheets(11).Range("U2")
Case "$AZ$3"
Set KeyCells = Sheets(11).Range("V2")
Case "$BA$3"
Set KeyCells = Sheets(11).Range("R3")
Case "$AS$18"
Set KeyCells = Sheets(11).Range("R4")
Case "$BB$3"
Set KeyCells = Sheets(11).Range("R5")
End Select
KeyCells.Value = Target
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Я думаю что из-за этого например из D3 должно копироваться в M3 и также на др лист в R3. Как раз не копируются значения там где нужно их копировать сразу в два места. Помогите сделать чтобы можно было копировать значение с одной ячейки в два места. Сейчас составлю простой пример и приложу в следующем посте.
Напишите пожалуйста обычными словами -ЧТО, КУДА, ПРИ КАКИХ УСЛОВИЯХ должно копироваться. Потому что Ваш код неправилен и из него не понятно что Вы хотите получить на выходе
Согласие есть продукт при полном непротивлении сторон
Доброе утро) Хочу чтобы при изменении значения в любой из ячеек в A1:A4 в первом листе, значение из ячейки A1 копировалось в B1, A2 в B2, A3 в B3, A4 в B4 и так же из A1 и A2 в первом листе копировалось в A1 и A2 на втором листе.
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
Согласие есть продукт при полном непротивлении сторон
Некоторые ячейки не копируют значения в другой лист когда значение в них определяется формулой, копируются только при ручном вводе значения. Сделал такую же ситуацию на своем файле-примере копирует нормально. Не пойму почему так. Проверил код несколько раз-все написал правильно.
В реальном файле проблема точно такая же как и в файле-примере выше. Событием "Worksheet_Change" выполняется перенос значения из ячейки A1(лист1) в ячейку B1(лист1) и в ячейку A1(лист2) когда ввожу значение в A1 в ручную - с этим проблем уже нет. Когда жму на ячейку A5(лист1), макрос задает ячейке A1(лист1) формулу =A2*A3(лист1) - с этим проблем тоже нет. Проблема - когда меняю значение в A2(лист1), в A1 меняется значение (т.к. формула), но оно не копируется в ячейку B1(лист1) и в ячейку A1(лист2). Как это поправить?