Связывание шкалы оси диаграммы Excel со значениями в ячейках

У меня есть диаграмма Ганта, и я смотрю на запланированные и фактические даты. проблема в том, что диаграмма не синхронизирует дату начала / окончания.

Я пытаюсь связать значения max / min с ячейкой с помощью VBA, но это не так.

Я пытался использовать этот сайт: https://peltiertech.com/link-excel-chart-axis-scale-to-values-in-cells/

но его код не работает для моей диаграммы.

вот изображение:  введите описание изображения здесь

даты ДОЛЖНЫ быть одинаковыми и изменяться вместе, если я изменю некоторые значения в таблице справа какие-либо идеи? Благодарность

Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet.ChartObjects("Chart 2").Chart 
Select Case Target.Address 

Case "$G$161" 
.Axes(xlCategory).MaximumScale = Target.Value 

Case "$F$163" 
.Axes(xlCategory).MinimumScale = Target.Value 

Case "$G$161" 
.Axes(xlValue).MaximumScale = Target.Value 

Case "$F$163" 
.Axes(xlValue).MinimumScale = Target.Value 

End Select 
End With 
End Sub

person aj_bk    schedule 23.08.2017    source источник
comment
Пожалуйста, поделитесь с нами кодом, который вы пробовали. Спасибо   -  person nishit dey    schedule 23.08.2017
comment
Private Sub Worksheet_Change (ByVal Target As Range) с ActiveSheet.ChartObjects (Диаграмма 2) .Chart Выберите Case Target.Address Case $ G $ 161 .Axes (xlCategory) .MaximumScale = Target.Value Case $ F $ 163 .Axes (xlCategory) .MinimumScale .MinimumScale. = Target.Value Case $ G $ 161 .Axes (xlValue) .MaximumScale = Target.Value Case $ F $ 163 .Axes (xlValue) .MinimumScale = Target.Value End Select End With End Sub   -  person aj_bk    schedule 23.08.2017
comment
прямо как с сайта   -  person aj_bk    schedule 23.08.2017
comment
В точечной диаграмме можно задать Axes (xlCategory). И это применимо только к Axes.   -  person Dy.Lee    schedule 23.08.2017
comment
Ну, я не использую точечную диаграмму. есть ли макрос для гистограммы?   -  person aj_bk    schedule 23.08.2017
comment
Вероятно, вы не сможете эффективно использовать два case оператора для данного значения. Не могли бы вы уточнить, что вы имеете в виду под словом «не работает», и более подробно рассказать о структуре вашего рабочего листа, в частности, являются ли литералы значений этих ячеек G161 и F163 или они содержат формулу (которая не запускает Worksheet_Change событие.   -  person David Zemens    schedule 23.08.2017
comment
да, это формулы Vlookup. диаграмма представляет собой простую диаграмму Ганта с временем цикла и датами. но поскольку я сравниваю фактическое и запланированное, я показываю две диаграммы Ганта на одной диаграмме.   -  person aj_bk    schedule 23.08.2017


Ответы (2)


Код, который вы использовали повторно, представляет собой простую демонстрационную программу, которая позволяет управлять осями диаграммы при изменении одной из 6 определенных ячеек на листе. Однако эти изменения предназначены для внесения пользователем с клавиатуры. Внесение такого изменения запускает событие Worksheet_Change и позволяет идентифицировать измененную ячейку. Код внутри процедуры обработки событий изменяет оси диаграммы, в соответствии с которыми была изменена конкретная ячейка рабочего листа.

Ваша проблема, как отметил в своем комментарии Дэвид Зименс, заключается в том, что если ячейка меняет значение из-за того, что оно пересчитывается по формуле, это изменение не вызывает событие Worksheet_Change. (Конечно, вполне возможно, что внесенное вручную изменение в другом месте на листе вызовет как событие Worksheet_Change, так и пересчет, в результате чего интересующая ячейка изменит свое значение с помощью формулы. Однако в этом случае аргумент Target будет определить ячейку, которая была изменена вручную, а не пересчитанная по формуле.)

Выбросьте структуру Select ... Case, которая действительно полезна только в контексте демонстрационной программы, которую вы пытаетесь использовать повторно. Вместо этого измените код так, чтобы он безоговорочно обновлял все 4 свойства вашей диаграммы непосредственно из ячеек G161 и F163 (поэтому используйте ws.Range("G161").Value и ws.Range("F163").Value вместо Target.Value для назначения свойств диаграммы, где ws представляет тот лист, на котором расположены эти ячейки, например ActiveSheet или Worksheets("Sheet1") или как там называется рабочий лист). Оберните назначение свойств диаграммы во вложенный элемент Workbook_SheetChange, а не Worksheet_Change, и ваша диаграмма будет обновляться при каждом пересчете книги.

Это не очень чистое решение, поскольку оно не определяет, действительно ли ячейки F163 и G161 изменяются при пересчете. Таким образом, существует риск того, что 4 свойствам без необходимости будут присвоены неизменные значения. Однако, если у вас нет очень большой книги и вы не выходите за пределы возможностей своего компьютера, это не имеет значения с практической точки зрения.

person DMM    schedule 23.08.2017
comment
Спасибо. я сделал то, что ты сказал. немного изменился кое-где. - person aj_bk; 24.08.2017

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet.ChartObjects("Chart 2").Chart
ActiveSheet.ChartObjects("Chart 2").Activate
' for main axes
ActiveChart.Axes(xlValue).MaximumScale = Worksheets("Single 
Tool").Range("$G$161").Value
ActiveChart.Axes(xlValue).MinimumScale = Worksheets("Single 
Tool").Range("$F$163").Value

'for secondary axes
ActiveChart.Axes(xlValue, xlSecondary).MaximumScale = Worksheets("Single 
Tool").Range("$G$161").Value
ActiveChart.Axes(xlValue, xlSecondary).MinimumScale = Worksheets("Single 
Tool").Range("$F$163").Value


End With
End Sub

я обнаружил, что это работает лучше всего. Спасибо вам всем

person aj_bk    schedule 24.08.2017