Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сумма нарастающим итогом при любых изменениях в ячейке - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сумма нарастающим итогом при любых изменениях в ячейке (Макросы/Sub)
Сумма нарастающим итогом при любых изменениях в ячейке
light26 Дата: Четверг, 27.04.2017, 20:49 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1267
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
Всем привет. Есть необходимость в суммировании значений нарастающим итогом. Хотел применить такой код[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim a
a = Array("$A$1")
        For i = 0 To UBound(a)
            If Target.Address Like "*" & a(i) & "*" Then
        With Target
            .Offset(, 1) = .Offset(, 1) + .Value
            End With
        Exit For
    End If
    Next
End Sub
[/vba]но быстро понял, что он не будет работать. Дело в том, что значения в ячейку А1 на втором листе подтягиваются из ячейки А1 первого листа. Как я уже догадался, макрос не отслеживает изменения в ячейке, если в ней просто ссылка на другую. Вышел из положения просто записав[vba]
Код
Sub Макрос1()
    Range("D1").Formula = "=A1+B1" 'вводим формулу в D1
    Range("D1").Copy 'копируем ячейку D1
    Range("B1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'вставляем в В1 значения из буфера
    Range("D1").ClearContents ' очищаем содержимое ячейки D1
End Sub
[/vba]но ведь можно еще больше упростить :)
Подскажите, пожалуйста, как. И, если не трудно, прокомментируйте каждую строку в "упрощенном" коде. :)
Спасибо
К сообщению приложен файл: 6106709.xlsx(10Kb)


Я не волшебник. Я только учусь

Сообщение отредактировал light26 - Четверг, 27.04.2017, 21:00
 
Ответить
СообщениеВсем привет. Есть необходимость в суммировании значений нарастающим итогом. Хотел применить такой код[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim a
a = Array("$A$1")
        For i = 0 To UBound(a)
            If Target.Address Like "*" & a(i) & "*" Then
        With Target
            .Offset(, 1) = .Offset(, 1) + .Value
            End With
        Exit For
    End If
    Next
End Sub
[/vba]но быстро понял, что он не будет работать. Дело в том, что значения в ячейку А1 на втором листе подтягиваются из ячейки А1 первого листа. Как я уже догадался, макрос не отслеживает изменения в ячейке, если в ней просто ссылка на другую. Вышел из положения просто записав[vba]
Код
Sub Макрос1()
    Range("D1").Formula = "=A1+B1" 'вводим формулу в D1
    Range("D1").Copy 'копируем ячейку D1
    Range("B1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'вставляем в В1 значения из буфера
    Range("D1").ClearContents ' очищаем содержимое ячейки D1
End Sub
[/vba]но ведь можно еще больше упростить :)
Подскажите, пожалуйста, как. И, если не трудно, прокомментируйте каждую строку в "упрощенном" коде. :)
Спасибо

Автор - light26
Дата добавления - 27.04.2017 в 20:49
Nic70y Дата: Четверг, 27.04.2017, 21:16 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3917
Репутация: 829 ±
Замечаний: 0% ±

Excel 2013
честно говоря нифига не понял на какое событие должно прибавляться.
активация второго листа?
каждый ввод в ячейку первого должен суммироваться?
или еще как?
откуда берется значение в ячейке A1 первого листа?


ЯД(poison) 41001841029809
+7 978 049 98 74 (мтс)
 
Ответить
Сообщениечестно говоря нифига не понял на какое событие должно прибавляться.
активация второго листа?
каждый ввод в ячейку первого должен суммироваться?
или еще как?
откуда берется значение в ячейке A1 первого листа?

Автор - Nic70y
Дата добавления - 27.04.2017 в 21:16
light26 Дата: Четверг, 27.04.2017, 21:33 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1267
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
честно говоря нифига не понял на какое событие должно прибавляться.
после того, как в А1 на первом листе вставили значения из скопированного файла, на втором листе в А1 значение поменяется. Макрос должен отследить изменения в ячейке А1 (на любом листе) и к значению в ячейке В1 второго листа прибавить значение ячейки А1 второго листа. Значение в А1 первого листа могут и не измениться, например было 4, в вставили 4, но эта 4 должна также прибавиться к ячейке В1 второго листа.
каждый ввод в ячейку первого должен суммироваться?
Да, именно после каждой вставки скопированных значений в ячейку макрос должен суммировать значения в ячейку В1


Я не волшебник. Я только учусь

Сообщение отредактировал light26 - Четверг, 27.04.2017, 21:38
 
Ответить
Сообщение
честно говоря нифига не понял на какое событие должно прибавляться.
после того, как в А1 на первом листе вставили значения из скопированного файла, на втором листе в А1 значение поменяется. Макрос должен отследить изменения в ячейке А1 (на любом листе) и к значению в ячейке В1 второго листа прибавить значение ячейки А1 второго листа. Значение в А1 первого листа могут и не измениться, например было 4, в вставили 4, но эта 4 должна также прибавиться к ячейке В1 второго листа.
каждый ввод в ячейку первого должен суммироваться?
Да, именно после каждой вставки скопированных значений в ячейку макрос должен суммировать значения в ячейку В1

Автор - light26
Дата добавления - 27.04.2017 в 21:33
Nic70y Дата: Четверг, 27.04.2017, 21:58 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3917
Репутация: 829 ±
Замечаний: 0% ±

Excel 2013
после цитат и редактирования весь пост сбился :(

вставка вручную производиться?
листов в которые вставляется много или один?

если это событие первого листа, то в его модуль
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
    Sheets(2).[b1] = Sheets(2).[b1] + [a1]
End If
End Sub
[/vba]


ЯД(poison) 41001841029809
+7 978 049 98 74 (мтс)


Сообщение отредактировал Nic70y - Четверг, 27.04.2017, 22:02
 
Ответить
Сообщениепосле цитат и редактирования весь пост сбился :(

вставка вручную производиться?
листов в которые вставляется много или один?

если это событие первого листа, то в его модуль
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
    Sheets(2).[b1] = Sheets(2).[b1] + [a1]
End If
End Sub
[/vba]

Автор - Nic70y
Дата добавления - 27.04.2017 в 21:58
light26 Дата: Четверг, 27.04.2017, 22:53 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1267
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
после цитат и редактирования весь пост сбился
Ага, есть такое :(


Я не волшебник. Я только учусь
 
Ответить
Сообщение
после цитат и редактирования весь пост сбился
Ага, есть такое :(

Автор - light26
Дата добавления - 27.04.2017 в 22:53
light26 Дата: Четверг, 27.04.2017, 22:58 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1267
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
вставка вручную производиться?
Да. мне прислали отчет, я скопировал данные оттуда и вставил в сводный (18 цехов - 18 файлов)
листов в которые вставляется много или один?
Лист один. Но есть объединенные ячейки. Забыл сразу упомянуть об этом.
если это событие первого листа, то в его модуль
Ну как, вставляем на первый лист, а суммирование - на втором


Я не волшебник. Я только учусь
 
Ответить
Сообщение
вставка вручную производиться?
Да. мне прислали отчет, я скопировал данные оттуда и вставил в сводный (18 цехов - 18 файлов)
листов в которые вставляется много или один?
Лист один. Но есть объединенные ячейки. Забыл сразу упомянуть об этом.
если это событие первого листа, то в его модуль
Ну как, вставляем на первый лист, а суммирование - на втором

Автор - light26
Дата добавления - 27.04.2017 в 22:58
light26 Дата: Четверг, 27.04.2017, 23:30 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1267
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
    Sheets(2).[b1] = Sheets(2).[b1] + [a1]
End If
End Sub
Не-а, не пахает :(


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
    Sheets(2).[b1] = Sheets(2).[b1] + [a1]
End If
End Sub
Не-а, не пахает :(

Автор - light26
Дата добавления - 27.04.2017 в 23:30
RAN Дата: Четверг, 27.04.2017, 23:43 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4419
Репутация: 872 ±
Замечаний: 0% ±

2010
Вадим, Change, это меняю.
Модно часы на трусы, можно трусы мужские, на трусы женские. Но когда трусы мужские на трусы мужские, да еще и свои, это не меняю, это переодеваю. А Excel переодеваться не умеет.
Может он захочет посчитать, а не переоделся ли ты? (Calculate)


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеВадим, Change, это меняю.
Модно часы на трусы, можно трусы мужские, на трусы женские. Но когда трусы мужские на трусы мужские, да еще и свои, это не меняю, это переодеваю. А Excel переодеваться не умеет.
Может он захочет посчитать, а не переоделся ли ты? (Calculate)

Автор - RAN
Дата добавления - 27.04.2017 в 23:43
light26 Дата: Пятница, 28.04.2017, 00:05 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1267
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
Вадим, Change, это меняю.
Андрей, привет. Ты, как всегда, максимально завуалировал свою подсказку )))
Как я понял, первая строка говорит, что код должен выполняться только для рабочего листа при каких-либо изменениях на нем, так? Изменения на листе происходят, так? Почему тогда макрос не суммирует?


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Вадим, Change, это меняю.
Андрей, привет. Ты, как всегда, максимально завуалировал свою подсказку )))
Как я понял, первая строка говорит, что код должен выполняться только для рабочего листа при каких-либо изменениях на нем, так? Изменения на листе происходят, так? Почему тогда макрос не суммирует?

Автор - light26
Дата добавления - 28.04.2017 в 00:05
light26 Дата: Пятница, 28.04.2017, 00:06 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1267
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
(Calculate)
Эту процедуру попробовать?


Я не волшебник. Я только учусь
 
Ответить
Сообщение
(Calculate)
Эту процедуру попробовать?

Автор - light26
Дата добавления - 28.04.2017 в 00:06
RAN Дата: Пятница, 28.04.2017, 00:10 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4419
Репутация: 872 ±
Замечаний: 0% ±

2010
4 заменить на 2 - изменить
4 заменить на 4 - переодеться
Эту процедуру попробовать?

Да.
PS но я не проверял, это так, гипоФеза. :)


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Пятница, 28.04.2017, 00:12
 
Ответить
Сообщение4 заменить на 2 - изменить
4 заменить на 4 - переодеться
Эту процедуру попробовать?

Да.
PS но я не проверял, это так, гипоФеза. :)

Автор - RAN
Дата добавления - 28.04.2017 в 00:10
light26 Дата: Пятница, 28.04.2017, 00:17 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1267
Репутация: 81 ±
Замечаний: 0% ±

2007, 2010, 2013
PS но я не проверял, это так, гипоФеза.
Потыкался носом, пока не получилось. Оставлю на буходные, а чичас спать :)


Я не волшебник. Я только учусь
 
Ответить
Сообщение
PS но я не проверял, это так, гипоФеза.
Потыкался носом, пока не получилось. Оставлю на буходные, а чичас спать :)

Автор - light26
Дата добавления - 28.04.2017 в 00:17
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сумма нарастающим итогом при любых изменениях в ячейке (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2017 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!