Страницы: 1
RSS
Можно ли выставить динамический максимум оси Х для графика
 
Подскажите пожалуйста, есть ли решение такой проблемы: есть файл с шаблоном расчетов, куда нужно регулярно вставлять новые данные, и есть в файле график, и каждый раз приходится идти длинный путь, чтобы изменить максимум оси Х:

Формат области построения -> Параметры области построения -> Вертикальная ось значения -> 2 раза Параметры оси -> Максимум

а можно ли как-то сделать, чтобы эксель сам понимал, какое максимальное значение есть у меня в данных, ну или я ему могу дать ссылку на определенную ячейку с этим максимумом?...
ведь когда создаешь диаграмму, он же понимает сам каков максимум, а когда меняются данные он на это не реагирует

заранее спасибо
 
snatg, возможно макросом отслеживать изменения в ячейках и обновлять диаграмму...
но лучше бы файл показать.
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, макросами я не умею, а файл такой
 
snatg, так что-то не понял у меня меняется автоматически как я меняю первую строку - ось X
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, ого, а у меня ничего не происходит ((( моет у меня эксель допотопный... 2013
 
snatg, а вот y не меняется вообще я правильно понял, вам нужно что бы оси максимальное значение брали согласно максимальному на листе с данными? (шото на непонятном кажется)
Изменено: Mershik - 13.04.2021 20:48:36
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, да, мне надо, чтобы если я вставляю данные, а там максимум может быть и 100 и 2000, чтобы график сам сжимался/растягивался
 
Цитата
snatg написал:
чтобы график сам сжимался/растягивался
если нужна именно четкая граница максимума, равная макс.значению в ячейках - только макросом менять при каждом изменении данных.
Если прям четкое значение максимума для оси не нужно - просто установите в настройках оси для максимума - Авто. В новых версиях надо просто нажать кнопку "Сброс" правее от поля со значением Максимум.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
только макросом менять при каждом изменении данных
ну зачем так сразу, а костыли?
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
а костыли?
не люблю я такие костыли :) Если нужно чуть больше настроек для осей - прибавляется проблем и извраты продолжаются. Но главное, чтобы ТС-у подошло :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Если нужно чуть больше настроек для осей
согласен, но для простых задач хватает, типа контрольных карт
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
Дмитрий(The_Prist) Щербаков написал: только макросом менять при каждом изменении данных
это я не умею
Цитата
Дмитрий(The_Prist) Щербаков написал: просто установите в настройках оси для максимума - Авто. В новых версиях надо просто нажать кнопку "Сброс" правее от поля со значением Максимум.
у меня старый эксель, все думаю переустановить... но пока руки не дошли

Цитата
buchlotnik написал: а костыли?
а вы бы не могли пояснить, что именно вы сделали, и как оно работает?
 
Цитата
snatg написал:
что именно вы сделали
нормализацию  :)  
выразил все значения в долях от максимума (принят за единицу) и вместо оси ординат добавил ряд с подписями из диапазона
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
нормализацию  
:)
а получается новую диаграмму делали по каким данным? а то у меня не показывает
 
Цитата
snatg написал:
новую диаграмму делали по каким данным?
по нормализованным - в файле же все есть
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
написал:
Цитата
Дмитрий(The_Prist) Щербаков написал:
только макросом менять при каждом изменении данных
ну зачем так сразу, а костыли?
Костылем не получилось, но нашел на просторах интернета с помощью макроса.
Но дело в том, что изменение максимального и минимального значения меняется корректно только при вводе вручную. Как исправить макрос, чтобы данные менялись при вычислении формулы?

Пример прилагаю.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim chrt As Chart
    If Target.Address = "$A$1" Then
        Set chrt = ActiveSheet.ChartObjects(1).Chart
        chrt.Axes(xlValue).MaximumScale = Range("A1").Value
        chrt.Axes(xlValue).MinorUnit = Round(Range("A1").Value / 4)
    
    End If
 If Target.Address = "$A$2" Then
        Set chrt = ActiveSheet.ChartObjects(1).Chart
        chrt.Axes(xlValue).MinimumScale = Range("A2").Value
        chrt.Axes(xlValue).MinorUnit = Round(Range("A2").Value / 4)
    
    End If

End Sub
Изменено: bugser - 02.05.2022 14:09:42
 
Вариант для оси Y (как в примере) без необходимости ячеек A1:A2
Код
Private Sub Worksheet_Change(ByVal Target As Range)
  Const MyChart = 1 ' Номер или "имя" диаграммы активного листа
  Dim chrt As Chart, rng As Range
  Set chrt = ChartObjects(MyChart).Chart
  Set rng = Range(Split(chrt.SeriesCollection(1).Formula, ",")(2))
  If Intersect(Target, rng) Is Nothing Then Exit Sub
  With WorksheetFunction
    chrt.Axes(xlValue).MaximumScale = .Round(.Max(rng.Value) + 0.5, 0)
    'chrt.Axes(xlValue).MinorUnit = .Round(.Min(rng.Value) / 4, 0)
  End With
End Sub
Изменено: ZVI - 02.05.2022 23:45:17
 
Вариант для обеих осей:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
  
  Const MyChart = 1 ' Номер или "имя" диаграммы активного листа
  
  Dim chrt As Chart, rng As Range
  Set chrt = ChartObjects(MyChart).Chart
  
  ' Ось Y
  Set rng = Range(Split(chrt.SeriesCollection(1).Formula, ",")(2))
  If Not Intersect(Target, rng) Is Nothing Then
    With WorksheetFunction
      chrt.Axes(xlValue).MaximumScale = .Round(.Max(rng.Value), 0)
    End With
  End If
  
  ' Ось X
  Set rng = Range(Split(chrt.SeriesCollection(1).Formula, ",")(1))
  If Not Intersect(Target, rng) Is Nothing Then
    With WorksheetFunction
      chrt.Axes(xlCategory).MaximumScale = .Round(.Max(rng.Value), 0)
    End With
  End If
  
End Sub
 
Цитата
написал:
Private Sub Worksheet_Change(ByVal Target As Range)  Const MyChart = 1 ' Номер или "имя" диаграммы активного листа  Dim chrt As Chart, rng As Range  Set chrt = ChartObjects(MyChart).Chart  Set rng = Range(Split(chrt.SeriesCollection(1).Formula, ",")(2))  If Intersect(Target, rng) Is Nothing Then Exit Sub  With WorksheetFunction    chrt.Axes(xlValue).MaximumScale = .Round(.Max(rng.Value) + 0.5, 0)    chrt.Axes(xlValue).MinorUnit = .Round(.Min(rng.Value) / 4, 0)  End WithEnd Sub
Спасибо за помощь. Этот вариант у меня не работает как нужно:
  1. При задании значения диаграммы "1" - макрос выдает ошибку.
  2. При других манипуляциях со значениями значения оси Y улетают в отрицательные значения и обратно уже не возвращаются.
И приоритет конечно, чтобы значения Минимума и Максимума оси Y задавалось именно формулой.
 
Мой код приведен для примера из сообщения #16, в котором устанавливается максимальное значение оси Y диаграммы, а не оси X, как в названии этой темы.
Минимальное значение осей там не корректируется, подразумевая, что они автоматические.
MinorUnit - это шаг дополнительной горизонтальной сетки, а не  минимальное значение оси Y, и этот шаг должен быть больше нуля.

> При задании значения диаграммы "1" - макрос выдает ошибку.
О каком конкретно значении речь? Константа MyChart задает номер или имя диаграммы на активном листе.
А текстовые значение в диапазоне F4:G8 диаграмма Excel воспринимает как нулевые, если что.
> При других манипуляциях со значениями значения оси Y улетают в отрицательные значения и обратно уже не возвращаются.
Нужен пример, где и что конкретно меняется, чтобы понять о чем речь.
Повторю - минимальное значение осей не корректируется, подразумевая, что они автоматические.
> И приоритет конечно, чтобы значения Минимума и Максимума оси Y задавалось именно формулой.
Вместо:   .Round(.Max(rng.Value) + 0.5, 0)
впишите:  Range("A1").Value
Аналогично - и для ячейки A2.

Если ищите решение, отличающееся от того, что написано в названии темы, то напишите в своем новом сообщении правильное название, тогда модераторы смогут исправить название темы.
Изменено: ZVI - 02.05.2022 23:54:25
 
ZVI, ок.
  1. В сообщении №16 приведен пример изменения Max и Min границы значения оси Y на диаграмме в зависимости от значения ячеек A1 и A2 (ось Х не интересует).
  2. Min значение границы оси Y там корректируется ручным изменением ячейки A2.
  3. Как я это смотрю: нажимаем на диаграмме на диапазон значений оси Y - справа "Формат Оси" - Параметры оси - Границы - Минимум и Максимум
Цитата
А текстовые значение в диапазоне F4:G8 диаграмма Excel воспринимает как нулевые, если что.
Видимо я что-то не понимаю. Диаграмма при изменении любого значения из диапазона F4:G8 изменяется в соответствии со значением измененной ячейки.

Цитата
написал:
Нужен пример, где и что конкретно меняется, чтобы понять о чем речь.
Пример приложил.

Пример в сообщении №16 максимально отражает то, что я хочу видеть в конечном итоге. Изменяя ячейки А1 и А2 я могу отслеживать диапазон моей диаграммы.
P.S. Про MinorUnit прочитал, для меня как обывателя в создании макросов грамотная речь пока что сложно.
Изменено: bugser - 03.05.2022 15:16:15
 
Я так понимаю решения нет? Предложенный вариант ZVI - не вычисляет если в ячейке формула. Приходится вручную вбивать, нажимать Enter и только тогда Min и Max меняется. Вычисление формулой не работает.
 
Ну например так:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim objAxis As Axis
Set objAxis = ActiveSheet.ChartObjects("Диаграмма 2").Chart.Axes(xlValue)
    objAxis.MinimumScale = Range("B17").Value2
    objAxis.MaximumScale = Range("C17").Value2
End Sub


Реагирует на любой чих, в том числе изменение B17 С17 через формулы
Изменено: tutochkin - 06.05.2022 20:24:42
 
tutochkin, Спасибо! То, что надо.
 
tutochkin, сегодня опробовал. Не совсем работает так как нужно (я не правильно описал).
Прилагаю пример. Возможно ли сделать изменение диапазона переключателем? (пример во вложении).
 
Цитата
bugser написал:
Возможно ли сделать изменение диапазона переключателем?
Повесь на выключатели макрос и будет работать
Код
Sub Перекл2_Щелчок()
Dim objAxis As Axis
Set objAxis = ActiveSheet.ChartObjects("Диаграмма 2").Chart.Axes(xlValue)
    objAxis.MinimumScale = Range("B17").Value2
    objAxis.MaximumScale = Range("C17").Value2
End Sub
Sub Перекл1_Щелчок()
Dim objAxis As Axis
Set objAxis = ActiveSheet.ChartObjects("Диаграмма 2").Chart.Axes(xlValue)
    objAxis.MinimumScale = Range("B17").Value2
    objAxis.MaximumScale = Range("C17").Value2
End Sub
Изменено: tutochkin - 08.05.2022 16:25:25
 
вопрос перенесен в отд.тему
Изменено: temp_nov - 23.01.2024 22:19:29
Страницы: 1
Наверх