Добрый день, уважаемые программисты! У меня имеется код макроса, который выполняет роль обыкновенного автоматического счетчика. Пояснение: работа всей схемы таблицы Excel состоит из последовательно идущих 4ёх шагов. На 1ом шаге вводятся цифровые значения вручную, на 2ом и 3ем шаге значения обрабатываются формулами, а на 4ом шаге работает макрос счетчика, который вычисляет данные из 3го шага. Счетчик отлично работает, начиная со 2го или 3го шага, но с 1 шага (куда я ввожу данные) он не работает (макрос выдает ошибку). На сколько я правильно понимаю, для полноценной работы схемы таблицы Excel необходимо перевести код макроса с события Change на событие Calculate. К сожалению, у меня уже опустились руки, чего я только не делал…. Не могли бы вы помочь мне в этом вопросе и добить уже в конце концов этот счетчик? Файл прилагаю.
Добрый день, уважаемые программисты! У меня имеется код макроса, который выполняет роль обыкновенного автоматического счетчика. Пояснение: работа всей схемы таблицы Excel состоит из последовательно идущих 4ёх шагов. На 1ом шаге вводятся цифровые значения вручную, на 2ом и 3ем шаге значения обрабатываются формулами, а на 4ом шаге работает макрос счетчика, который вычисляет данные из 3го шага. Счетчик отлично работает, начиная со 2го или 3го шага, но с 1 шага (куда я ввожу данные) он не работает (макрос выдает ошибку). На сколько я правильно понимаю, для полноценной работы схемы таблицы Excel необходимо перевести код макроса с события Change на событие Calculate. К сожалению, у меня уже опустились руки, чего я только не делал…. Не могли бы вы помочь мне в этом вопросе и добить уже в конце концов этот счетчик? Файл прилагаю.andalexm
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("A3:A4")) Is Nothing Then Exit Sub With Target(1, 4) .Value = .Value + 1 End With End Sub
[/vba]
andalexm, привет может, все проще? [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("A3:A4")) Is Nothing Then Exit Sub With Target(1, 4) .Value = .Value + 1 End With End Sub
В последовательности должна срабатывать вся цепочка. К стати я попробовал подменить в вашем примере массив "A3:A4" на "С3:С4" и по прежнему не работает и похоже все потому, что в этих ячейках содержатся формулы
В последовательности должна срабатывать вся цепочка. К стати я попробовал подменить в вашем примере массив "A3:A4" на "С3:С4" и по прежнему не работает и похоже все потому, что в этих ячейках содержатся формулыandalexm
Да вы правы это логично, но дело в том, что оригинальные формулы в С3:С4 собирают данные еще и с других ячеек. Этот пример таблицы я сделал попроще для понимания, хотя он и не логичен, но суть проблемы хорошо отображает.
Да вы правы это логично, но дело в том, что оригинальные формулы в С3:С4 собирают данные еще и с других ячеек. Этот пример таблицы я сделал попроще для понимания, хотя он и не логичен, но суть проблемы хорошо отображает.andalexm
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Me.Range("A3:A4")) Is Nothing Then Exit Sub If Target.Count > 1 Then Exit Sub
If IsEmpty(Target) Or Not IsNumeric(Target) Then Exit Sub Else Target.Offset(0, 1) = Target.Value * 2 Target.Offset(0, 2) = Target.Offset(0, 1).Value * 2 Target.Offset(0, 3) = Target.Offset(0, 3) + 1 End If
End Sub
[/vba]
не пойму зачем только привязывать счетчик к 3 столбцу, если там стоят формулы на 1 столбец. Если надо привяжу к 3 столбцу
может так попробовать?
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Me.Range("A3:A4")) Is Nothing Then Exit Sub If Target.Count > 1 Then Exit Sub
If IsEmpty(Target) Or Not IsNumeric(Target) Then Exit Sub Else Target.Offset(0, 1) = Target.Value * 2 Target.Offset(0, 2) = Target.Offset(0, 1).Value * 2 Target.Offset(0, 3) = Target.Offset(0, 3) + 1 End If
End Sub
[/vba]
не пойму зачем только привязывать счетчик к 3 столбцу, если там стоят формулы на 1 столбец. Если надо привяжу к 3 столбцуfan-vba
Сообщение отредактировал fan-vba - Среда, 17.01.2018, 20:47
fan-vba ваш пример интересен, но он не последователен. Задача работы таблице состоит в том, что один шаг влияет на другой, тот на третий и в итоге в последнюю очередь включается счетчик макроса.
fan-vba ваш пример интересен, но он не последователен. Задача работы таблице состоит в том, что один шаг влияет на другой, тот на третий и в итоге в последнюю очередь включается счетчик макроса.andalexm
nilem да, я все делаю как вы говорите но в оригинальном файле зацикливается. Я сейчас ваш вариант еще прорабатываю, но пока не получается понять почему он у меня зацикливается. А так я все убрал кроме Worksheet_Calculate
nilem да, я все делаю как вы говорите но в оригинальном файле зацикливается. Я сейчас ваш вариант еще прорабатываю, но пока не получается понять почему он у меня зацикливается. А так я все убрал кроме Worksheet_Calculateandalexm
не пойму зачем только привязывать счетчик к 3 столбцу, если там стоят формулы на 1 столбец. Если надо привяжу к 3 столбцу
Насколько я понимаю параметр Target в макросе считывающий текстовое, а не численное значение ячейки. И воспринимающий считанный текст - как адрес ячейки. Ну при событии Kалькулейт - этот макрос будет срабатывать вообще при любом вычислении на листе по этому я и хочу весь макрос перевисти в Калькулейт. А формулы в оригинальном файле в шаге 3 собирают данные со многих других ячеек, вот поэтому для меня так важно вычисление счетчика именно с 3го шага с ячейки в которой содержится формула и вот в том случаи как эта формула выдаст любое новое значение должен сработать счетчик.
не пойму зачем только привязывать счетчик к 3 столбцу, если там стоят формулы на 1 столбец. Если надо привяжу к 3 столбцу
Насколько я понимаю параметр Target в макросе считывающий текстовое, а не численное значение ячейки. И воспринимающий считанный текст - как адрес ячейки. Ну при событии Kалькулейт - этот макрос будет срабатывать вообще при любом вычислении на листе по этому я и хочу весь макрос перевисти в Калькулейт. А формулы в оригинальном файле в шаге 3 собирают данные со многих других ячеек, вот поэтому для меня так важно вычисление счетчика именно с 3го шага с ячейки в которой содержится формула и вот в том случаи как эта формула выдаст любое новое значение должен сработать счетчик.andalexm
параметр target в данном коде не считывает никакие значения с ячейки, он определяет текущую ячейку, которую вы хотите изменить и тут не важно текст там или цыфры, а срабатывание именно на цифры здесь определяется условием [vba]
Код
If IsEmpty(Target) Or Not IsNumeric(Target) Then
[/vba] диапазон срабатывания данного кода описывается в строке [vba]
Код
If Intersect(Target, Me.Range("A3:A4")) Is Nothing Then Exit Sub
[/vba] т.е. данный макрос запустится только если изменяется значение в ячеках А3 и А4 (т.е. налюбые изменениия в столбцах B, C, D макос не реагирует), поэтому никаких калькулейт тут не надо.
Все дело в том, что я не вижу как на самом деле у вас организован оригинальный код. Метод с Target применим только для организации кода с ручным изменением данных в конкретных ячейках. Если же вы тут говорите о последовательностях, то на 3 этапе у вас происходит пересчет программно и тут уже надо задаваться переменными и сравнивать до и после выполнения 3 шага. Тогда если эти значения будут различны - плюсовать счетчик
параметр target в данном коде не считывает никакие значения с ячейки, он определяет текущую ячейку, которую вы хотите изменить и тут не важно текст там или цыфры, а срабатывание именно на цифры здесь определяется условием [vba]
Код
If IsEmpty(Target) Or Not IsNumeric(Target) Then
[/vba] диапазон срабатывания данного кода описывается в строке [vba]
Код
If Intersect(Target, Me.Range("A3:A4")) Is Nothing Then Exit Sub
[/vba] т.е. данный макрос запустится только если изменяется значение в ячеках А3 и А4 (т.е. налюбые изменениия в столбцах B, C, D макос не реагирует), поэтому никаких калькулейт тут не надо.
Все дело в том, что я не вижу как на самом деле у вас организован оригинальный код. Метод с Target применим только для организации кода с ручным изменением данных в конкретных ячейках. Если же вы тут говорите о последовательностях, то на 3 этапе у вас происходит пересчет программно и тут уже надо задаваться переменными и сравнивать до и после выполнения 3 шага. Тогда если эти значения будут различны - плюсовать счетчикfan-vba
что оригинальные формулы в С3:С4 собирают данные еще и с других ячеек
не важно откуда собираются и как формируются формулы - главное что это формулы листа и они будут пересчитаны при изменении значений в ячеках А3 и А4 корректно и учитывая эти новые данные (главное чтобы подсчет значений на 3 этапе не был организован макросом ) Здесь важен 1 этап - ввод значений для пересчета формул и последний - изменение показаний счетчика, не вижу смысла обсуждать 2 и 3 этапы, т.к. там формулы и они автоматически все пересчитывают.
что оригинальные формулы в С3:С4 собирают данные еще и с других ячеек
не важно откуда собираются и как формируются формулы - главное что это формулы листа и они будут пересчитаны при изменении значений в ячеках А3 и А4 корректно и учитывая эти новые данные (главное чтобы подсчет значений на 3 этапе не был организован макросом ) Здесь важен 1 этап - ввод значений для пересчета формул и последний - изменение показаний счетчика, не вижу смысла обсуждать 2 и 3 этапы, т.к. там формулы и они автоматически все пересчитывают.fan-vba
Сообщение отредактировал fan-vba - Среда, 17.01.2018, 22:32
Если же вы тут говорите о последовательностях, то на 3 этапе у вас происходит пересчет программно и тут уже надо задаваться переменными и сравнивать до и после выполнения 3 шага. Тогда если эти значения будут различны - плюсовать счетчик
Похоже так и есть.... Вы можете написать этот код который будет сравнивать выполнение до и после программного пересчета 3 шага ?
Если же вы тут говорите о последовательностях, то на 3 этапе у вас происходит пересчет программно и тут уже надо задаваться переменными и сравнивать до и после выполнения 3 шага. Тогда если эти значения будут различны - плюсовать счетчик
Похоже так и есть.... Вы можете написать этот код который будет сравнивать выполнение до и после программного пересчета 3 шага ?andalexm