Добрый день! Опытные форумчане, помогите решить еще один вопрос. На Листе1 в ячейке А2 в течение дня изменяются данные. Также меняются и Показатели 1 и 2.
Что необходимо сделать? При изменении данных в ячейке А2 необходимо копировать их на Лист2 с соответствующими значениями Показателей, и построить график по столбцу В. График должен показывать последние 50 значений. Пример того, как должно выглядеть в приложении. Буду вам очень признателен! Спасибо!
Добрый день! Опытные форумчане, помогите решить еще один вопрос. На Листе1 в ячейке А2 в течение дня изменяются данные. Также меняются и Показатели 1 и 2.
Что необходимо сделать? При изменении данных в ячейке А2 необходимо копировать их на Лист2 с соответствующими значениями Показателей, и построить график по столбцу В. График должен показывать последние 50 значений. Пример того, как должно выглядеть в приложении. Буду вам очень признателен! Спасибо!mra12101
Что необходимо сделать? При изменении данных в ячейке А2 необходимо копировать их на Лист2 с соответствующими значениями Показателей, и построить график по столбцу В.
Спасибо! Посмотрю. Но основной вопрос касается этого:
Что необходимо сделать? При изменении данных в ячейке А2 необходимо копировать их на Лист2 с соответствующими значениями Показателей, и построить график по столбцу В.
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A2")) Is Nothing Then u = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row Sheets(2).Range("b" & u + 1) = [a2] Sheets(2).Range("c" & u + 1) = [c2] Sheets(2).Range("d" & u + 1) = [d2] Sheets(2).Range("a" & u + 1) = Sheets(2).Range("a" & u) + 1 ActiveSheet.ChartObjects("Диаграмма 1").Chart.SetSourceData Source:=Sheets(2).Range("B2:B" & u + 1) End If End Sub
Sheets(2).Range("a" & u + 1) = Sheets(2).Range("a" & u + 1).Row - 1
[/vba]файл не менял
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A2")) Is Nothing Then u = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row Sheets(2).Range("b" & u + 1) = [a2] Sheets(2).Range("c" & u + 1) = [c2] Sheets(2).Range("d" & u + 1) = [d2] Sheets(2).Range("a" & u + 1) = Sheets(2).Range("a" & u) + 1 ActiveSheet.ChartObjects("Диаграмма 1").Chart.SetSourceData Source:=Sheets(2).Range("B2:B" & u + 1) End If End Sub
Излишнее цитирование удалено администрацией - это нарушение п.5j Правил форума Добрый день! Спасибо большое за макрос! Но есть проблема. Все работает, когда в ячейке В2 изменяю значение вручную. Но когда ставлю туда формулу (или ссылку на ячейку с формулой), то новые значения уже макрос не видит. И еще, у меня выскакивает ошибка на недопустимое имя диаграммы (когда макрос поместил в свою книгу). Менял на англ. название - не помогает. И можно еще добавить возможность, что бы график показывал 50 последних значений, иначе ооочень большой получиться) И добавьте пожалуйста комменты к строкам макроса, что бы разобраться, что он делает, если не затрудник конечно. Большое спасибо!
Излишнее цитирование удалено администрацией - это нарушение п.5j Правил форума Добрый день! Спасибо большое за макрос! Но есть проблема. Все работает, когда в ячейке В2 изменяю значение вручную. Но когда ставлю туда формулу (или ссылку на ячейку с формулой), то новые значения уже макрос не видит. И еще, у меня выскакивает ошибка на недопустимое имя диаграммы (когда макрос поместил в свою книгу). Менял на англ. название - не помогает. И можно еще добавить возможность, что бы график показывал 50 последних значений, иначе ооочень большой получиться) И добавьте пожалуйста комменты к строкам макроса, что бы разобраться, что он делает, если не затрудник конечно. Большое спасибо!mra12101
таки да, макрос на это и рассчитан, можно конечно попробовать прикрутить Калькулят, но не рекомендую, т.к. может насохранять не то, что нужно формула же на что-то ссылается - вот и на это повесить макрос
Private Sub Worksheet_Change(ByVal Target As Range) ' Range("A2") - ячейка в которой _ отслеживается изменение If Not Intersect(Target, Range("A2")) Is Nothing Then 'последняя заполненная строка столбца B листа №2 по индексу, _ в данном случае Лист2 u = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row 'на листе №2 ячейка столбца B строки на 1 больше чем _ последняя заполненная строка столбца B листа №2 по индексу, _ т.е слудующая _ приравнивается ячейке a2 текущего листа, _ в данном случае Лист1 Sheets(2).Range("b" & u + 1) = [a2] 'на листе №2 ячейка столбца C строки на 1 больше чем _ последняя заполненная строка столбца B листа №2 по индексу, _ т.е слудующая _ приравнивается ячейке c2 текущего листа, _ в данном случае Лист1 Sheets(2).Range("c" & u + 1) = [c2] 'на листе №2 ячейка столбца D строки на 1 больше чем _ последняя заполненная строка столбца B листа №2 по индексу, _ т.е слудующая _ приравнивается ячейке d2 текущего листа, _ в данном случае Лист1 Sheets(2).Range("d" & u + 1) = [d2] 'нумерация строк _ на листе №2 ячейка столбца A строки на 1 больше чем _ последняя заполненная строка столбца B листа №2 по индексу, _ т.е слудующая _ приравнивается номеру строки этой ячейки -1, _ т.к. таблица начинается со второй строки Sheets(2).Range("a" & u + 1) = Sheets(2).Range("a" & u + 1).Row - 1
'выбираются данные для диаграммы _ на листе №2 с B2 по B следующей после последней заполненной строки _ столбца B листа №2 по индексу 'ActiveSheet.ChartObjects("Диаграмма 1").Chart.SetSourceData Source:=Sheets(2).Range("B2:B" & u + 1)
'ЕСЛИ последняя заполненная строка столбца B листа №2 по индексу < 51, _ т.е. 50 строк, т.к. таблица начинается со 2 стр. ТОГДА 's = 2 - первая ячейка таблицы 'ИНАЧЕ 'берем последние 50 строк 'конец ЕСЛИ If u < 51 Then s = 2 Else: s = u - 48 End If
ActiveSheet.ChartObjects("Диаграмма 1").Chart.SetSourceData Source:=Sheets(2).Range("B" & s & ":B" & u + 1)
таки да, макрос на это и рассчитан, можно конечно попробовать прикрутить Калькулят, но не рекомендую, т.к. может насохранять не то, что нужно формула же на что-то ссылается - вот и на это повесить макрос
Private Sub Worksheet_Change(ByVal Target As Range) ' Range("A2") - ячейка в которой _ отслеживается изменение If Not Intersect(Target, Range("A2")) Is Nothing Then 'последняя заполненная строка столбца B листа №2 по индексу, _ в данном случае Лист2 u = Sheets(2).Cells(Rows.Count, 2).End(xlUp).Row 'на листе №2 ячейка столбца B строки на 1 больше чем _ последняя заполненная строка столбца B листа №2 по индексу, _ т.е слудующая _ приравнивается ячейке a2 текущего листа, _ в данном случае Лист1 Sheets(2).Range("b" & u + 1) = [a2] 'на листе №2 ячейка столбца C строки на 1 больше чем _ последняя заполненная строка столбца B листа №2 по индексу, _ т.е слудующая _ приравнивается ячейке c2 текущего листа, _ в данном случае Лист1 Sheets(2).Range("c" & u + 1) = [c2] 'на листе №2 ячейка столбца D строки на 1 больше чем _ последняя заполненная строка столбца B листа №2 по индексу, _ т.е слудующая _ приравнивается ячейке d2 текущего листа, _ в данном случае Лист1 Sheets(2).Range("d" & u + 1) = [d2] 'нумерация строк _ на листе №2 ячейка столбца A строки на 1 больше чем _ последняя заполненная строка столбца B листа №2 по индексу, _ т.е слудующая _ приравнивается номеру строки этой ячейки -1, _ т.к. таблица начинается со второй строки Sheets(2).Range("a" & u + 1) = Sheets(2).Range("a" & u + 1).Row - 1
'выбираются данные для диаграммы _ на листе №2 с B2 по B следующей после последней заполненной строки _ столбца B листа №2 по индексу 'ActiveSheet.ChartObjects("Диаграмма 1").Chart.SetSourceData Source:=Sheets(2).Range("B2:B" & u + 1)
'ЕСЛИ последняя заполненная строка столбца B листа №2 по индексу < 51, _ т.е. 50 строк, т.к. таблица начинается со 2 стр. ТОГДА 's = 2 - первая ячейка таблицы 'ИНАЧЕ 'берем последние 50 строк 'конец ЕСЛИ If u < 51 Then s = 2 Else: s = u - 48 End If
ActiveSheet.ChartObjects("Диаграмма 1").Chart.SetSourceData Source:=Sheets(2).Range("B" & s & ":B" & u + 1)
[/vba], а после запуска макроса спотыкается об эту строку)). Здесь нужно менять название на [vba]
Код
ActiveSheet.ChartObjects("Chart 1")
[/vba] Может пригодиться кому.
Еще раз благодарю за такой подробный макрос.
Если есть у кого идеи как адаптировать макрос так, что бы он видел изменения в ячейке (НЕ ручками), буду очень признателен. Данные в эксель поступают по DDE в виде текста, а формулами преобразуются уже в понятные для него числа. Спасибо!
Nic70y, спасибо Вам огромное!
Что касается ошибки, то в рекордере пишет [vba]
Код
ActiveSheet.ChartObjects("Диагр. 1")
[/vba], а после запуска макроса спотыкается об эту строку)). Здесь нужно менять название на [vba]
Код
ActiveSheet.ChartObjects("Chart 1")
[/vba] Может пригодиться кому.
Еще раз благодарю за такой подробный макрос.
Если есть у кого идеи как адаптировать макрос так, что бы он видел изменения в ячейке (НЕ ручками), буду очень признателен. Данные в эксель поступают по DDE в виде текста, а формулами преобразуются уже в понятные для него числа. Спасибо!mra12101
Неа, не реагирует. Ячейка меняется, а новые строки не копирует. Данные поступают по =ДРВ(КодПрог,сервер,элемент1,[элемент2],...) Как я думаю, нужно сделать сравнение данных входящей ячейки (А2) с последними данными по этой ячейке на Листе2. То есть если текущее значение равно последнему значению, то ничего не делать, если не равно, то создать новую строку с этими данными. Как-то так. Такое возможно?
Неа, не реагирует. Ячейка меняется, а новые строки не копирует. Данные поступают по =ДРВ(КодПрог,сервер,элемент1,[элемент2],...) Как я думаю, нужно сделать сравнение данных входящей ячейки (А2) с последними данными по этой ячейке на Листе2. То есть если текущее значение равно последнему значению, то ничего не делать, если не равно, то создать новую строку с этими данными. Как-то так. Такое возможно?mra12101
Сообщение отредактировал mra12101 - Четверг, 23.11.2017, 11:22
текущее значение равно последнему значению, то ничего не делать
ну если Вы в этом уверены, то [vba]
Код
Private Sub Worksheet_Calculate() If Sheets(2).Range("B2") = "" Then uu = "" Else: uu = Application.VLookup(9E+307, Sheets(2).Range("B:B"), 1, 1) End If If [a2] <> uu Then
текущее значение равно последнему значению, то ничего не делать
ну если Вы в этом уверены, то [vba]
Код
Private Sub Worksheet_Calculate() If Sheets(2).Range("B2") = "" Then uu = "" Else: uu = Application.VLookup(9E+307, Sheets(2).Range("B:B"), 1, 1) End If If [a2] <> uu Then