Всем привет. Мои познания VBA ограничены макрорекордером и, иногда, методом научного тыка. Когда первым способом решить задачу невозможно, а второй не помогает, я обращаюсь за помощью к Вам, уважаемые форумчане. Итак, есть код[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim a a = Array("$P$11", "$P$13", "$P$15", "$P$17", "$P$19", "$P$21", "$P$23", "$P$25", "$P$26") For i = 0 To UBound(a) If Target.Address Like "*" & a(i) & "" Then With Target Application.EnableEvents = False .Offset(, -2) = .Offset(, -2) + .Value .Offset(, -4) = .Offset(, -4) + .Value Application.EnableEvents = True End With Exit For End If Next End Sub
[/vba]он работает для суммирования нарастающим итогом в ячейках столбцов L и N значений, вводимых в ячейки столбца P. До недавнего времени этого было достаточно. Сейчас требования изменились и мне нужно, чтобы суммирование нарастающим итогом выполнялось еще и в ячейках столбцов S и U, но значений, вводимых в ячейки столбца W. Я пробовал просто продублировать код с изменением диапазона a = Array("$Р$11", "$Р$13", "$Р........ "$Р$26") на a = Array("$W$11", "$W$13", "$W........ "$W$26"), пытался заменить "а" на "b" (Dim b, b = Array, For i = 0 To UBound(b), If Target.Address Like "*" & b(i) & "" Then) и ряд других попыток. Для знающего человека это, возможно, покажется глупым и смешным, но мне казались эти варианты возможным решением задачи. Я ошибся и теперь прошу у Вас помощи
Всем привет. Мои познания VBA ограничены макрорекордером и, иногда, методом научного тыка. Когда первым способом решить задачу невозможно, а второй не помогает, я обращаюсь за помощью к Вам, уважаемые форумчане. Итак, есть код[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim a a = Array("$P$11", "$P$13", "$P$15", "$P$17", "$P$19", "$P$21", "$P$23", "$P$25", "$P$26") For i = 0 To UBound(a) If Target.Address Like "*" & a(i) & "" Then With Target Application.EnableEvents = False .Offset(, -2) = .Offset(, -2) + .Value .Offset(, -4) = .Offset(, -4) + .Value Application.EnableEvents = True End With Exit For End If Next End Sub
[/vba]он работает для суммирования нарастающим итогом в ячейках столбцов L и N значений, вводимых в ячейки столбца P. До недавнего времени этого было достаточно. Сейчас требования изменились и мне нужно, чтобы суммирование нарастающим итогом выполнялось еще и в ячейках столбцов S и U, но значений, вводимых в ячейки столбца W. Я пробовал просто продублировать код с изменением диапазона a = Array("$Р$11", "$Р$13", "$Р........ "$Р$26") на a = Array("$W$11", "$W$13", "$W........ "$W$26"), пытался заменить "а" на "b" (Dim b, b = Array, For i = 0 To UBound(b), If Target.Address Like "*" & b(i) & "" Then) и ряд других попыток. Для знающего человека это, возможно, покажется глупым и смешным, но мне казались эти варианты возможным решением задачи. Я ошибся и теперь прошу у Вас помощиlight26
Вообще то вы правильно делали добавляя список ячеек.. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim a If Not Intersect(Target, Columns("P:P")) Is Nothing Or _ Not Intersect(Target, Columns("W:W")) Is Nothing Then a = Array("$P$11", "$P$13", "$P$15", "$P$17", "$P$19", "$P$21", "$P$23", "$P$25", "$P$26", _ "$W$11", "$W$13", "$W$15", "$W$17", "$W$19", "$W$21", "$W$23", "$W$25", "$W$26") For i = 0 To UBound(a) If Target.Address Like "*" & a(i) & "" Then With Target Application.EnableEvents = False .Offset(, -2) = .Offset(, -2) + .Value .Offset(, -4) = .Offset(, -4) + .Value Application.EnableEvents = True End With Exit For End If Next End If End Sub
[/vba]
Вообще то вы правильно делали добавляя список ячеек.. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim a If Not Intersect(Target, Columns("P:P")) Is Nothing Or _ Not Intersect(Target, Columns("W:W")) Is Nothing Then a = Array("$P$11", "$P$13", "$P$15", "$P$17", "$P$19", "$P$21", "$P$23", "$P$25", "$P$26", _ "$W$11", "$W$13", "$W$15", "$W$17", "$W$19", "$W$21", "$W$23", "$W$25", "$W$26") For i = 0 To UBound(a) If Target.Address Like "*" & a(i) & "" Then With Target Application.EnableEvents = False .Offset(, -2) = .Offset(, -2) + .Value .Offset(, -4) = .Offset(, -4) + .Value Application.EnableEvents = True End With Exit For End If Next End If End Sub
Вообще то вы правильно делали добавляя список ячеек.
Спасибо за решение. Просто, как все гениальное Я не допетрил, что [vba]
Код
If Target.Address Like "*" & a(i) & "" Then With Target Application.EnableEvents = False .Offset(, -2) = .Offset(, -2) + .Value .Offset(, -4) = .Offset(, -4) + .Value
[/vba]будет одинаково работать и для диапазона "$P$11", "$P$13", "$P$15", "$P$17", "$P$19", "$P$21", "$P$23", "$P$25", "$P$26" и для диапазона "$W$11", "$W$13", "$W$15", "$W$17", "$W$19", "$W$21", "$W$23", "$W$25", "$W$26. Хотя, как я вижу, этого было бы недостаточно, т.к. в коде появилась строка [vba]
Код
If Not Intersect(Target, Columns("P:P")) Is Nothing Or _ Not Intersect(Target, Columns("W:W")) Is Nothing Then
[/vba]роль которой я не знаю. Вижу, что цель команды - столбцы P и W, но что конкретно?.. Если попытаться переводить, то получается что-то вроде: "Если не пересекаются (цель - столбец Р) ничего или не пересекается (цель - столбец W) ничего, то..." С чем не пересекаются?
Вообще то вы правильно делали добавляя список ячеек.
Спасибо за решение. Просто, как все гениальное Я не допетрил, что [vba]
Код
If Target.Address Like "*" & a(i) & "" Then With Target Application.EnableEvents = False .Offset(, -2) = .Offset(, -2) + .Value .Offset(, -4) = .Offset(, -4) + .Value
[/vba]будет одинаково работать и для диапазона "$P$11", "$P$13", "$P$15", "$P$17", "$P$19", "$P$21", "$P$23", "$P$25", "$P$26" и для диапазона "$W$11", "$W$13", "$W$15", "$W$17", "$W$19", "$W$21", "$W$23", "$W$25", "$W$26. Хотя, как я вижу, этого было бы недостаточно, т.к. в коде появилась строка [vba]
Код
If Not Intersect(Target, Columns("P:P")) Is Nothing Or _ Not Intersect(Target, Columns("W:W")) Is Nothing Then
[/vba]роль которой я не знаю. Вижу, что цель команды - столбцы P и W, но что конкретно?.. Если попытаться переводить, то получается что-то вроде: "Если не пересекаются (цель - столбец Р) ничего или не пересекается (цель - столбец W) ничего, то..." С чем не пересекаются?light26
Я не волшебник. Я только учусь
Сообщение отредактировал light26 - Воскресенье, 08.03.2015, 16:09
Эта строчка не обязательна. Но не будет лишней. Было что при каждом изменении в любой ячейке проходит цикл на проверку а не является ли нужная ячейка ячейкой из списка. Просто если столбцы не P или W (столбцы изменяемой ячейки) то не обязательно по этому списку проходиться. Соответственно если изменяемая ячейка пересекается со столбцом p или w то продолжаем обработку, если нет, то пропускаем.
С чем не пересекаются? - не пересекается с изменяемой ячейкой (это Target)
Ещё мне кажется что Like "*" & a(i) & "" здесь лишнее. достаточно просто Like a(i) или = a(i)
Эта строчка не обязательна. Но не будет лишней. Было что при каждом изменении в любой ячейке проходит цикл на проверку а не является ли нужная ячейка ячейкой из списка. Просто если столбцы не P или W (столбцы изменяемой ячейки) то не обязательно по этому списку проходиться. Соответственно если изменяемая ячейка пересекается со столбцом p или w то продолжаем обработку, если нет, то пропускаем.
С чем не пересекаются? - не пересекается с изменяемой ячейкой (это Target)
Ещё мне кажется что Like "*" & a(i) & "" здесь лишнее. достаточно просто Like a(i) или = a(i)Leanna
Лучше день потерять, потом за пять минут долететь!
Сообщение отредактировал Leanna - Воскресенье, 08.03.2015, 16:24
Leanna, спасибо за разъяснения. Что касается Like "*" & a(i) & "", возможно, Вы правы. Как я писал ранее, мои познания VBA - это макрорекордер и метод "научного тыка"
Leanna, спасибо за разъяснения. Что касается Like "*" & a(i) & "", возможно, Вы правы. Как я писал ранее, мои познания VBA - это макрорекордер и метод "научного тыка" light26
Я не волшебник. Я только учусь
Сообщение отредактировал light26 - Воскресенье, 08.03.2015, 19:56