Диаграммы Excel - установка ряда заканчивается динамично

Первая проблема с вашим кодом заключается в том, что он поворачивает значок вокруг своего угла, а не по центру, поэтому он оказывается не в том месте. Вторая проблема заключается в том, что Leaflet использует свойство иконки style.transform для его позиционирования, поэтому поворот поворачивается при каждом увеличении карты.

Плагин Leaflet.RotatedMarker , предложенный @IvanSanchez, выглядит как элегантное решение. Если вы не можете использовать плагин, вам может помочь следующее:

Стиль CSS:

.u-turn-icon {
   transform-origin: center;
}

Javascript:

map.on("zoomstart", function(ev) {
  let icons = document.getElementsByClassName("u-turn-icon");
  for(let icon of icons) {
    icon.style.visibility = "hidden";
  }
});

map.on("zoomend", function(ev){
  let icons = document.getElementsByClassName("u-turn-icon");
  for(let icon of icons) {
    icon.style.transform += " rotate(20deg)";
    icon.style.visibility = "";
  }
});

map.fire("zoomend");

Этот код просто сбрасывает вращение каждого значка разворота каждый раз, когда карта масштабируется. Значок скрыт в начале увеличения и отображается в конце, поэтому вы не заметите его вращение. Событие zoomend запускается вручную, чтобы установить правильное вращение значка до масштабирования карты.

7
задан Lance Roberts 15 October 2008 в 23:46
поделиться

6 ответов

Хорошо, я должен был провести немного больше исследования, вот то, как заставить его работать, полностью в рамках электронной таблицы (без VBA):

Используя A1 как конец Вашего желаемого диапазона и диаграмма, находящаяся на том же листе как данные:

Назовите первую ячейку данных (C5) как именованный диапазон, скажите TESTRANGE.
Созданный именованный диапазон MYDATA как следующая формула:

=OFFSET (TESTRANGE, 0, 0, Sheet1! 1$A$, 1)

Теперь, перейдите к вкладке SERIES диалогового окна ДАННЫХ источника диаграммы и измените свой оператор VALUES на:

=Sheet1! MYDATA

Теперь каждый раз Вы изменяете значение ячейки A1, оно изменит диаграмму.

Благодаря Robert Mearns для ловли дефектов в моем предыдущем ответе.

6
ответ дан 6 December 2019 в 21:21
поделиться

Это может быть достигнуто на двух шагах:

  • Создайте динамический именованный диапазон
  • Добавьте некоторый код VBA для обновления источника данных диаграмм к именованному диапазону

Создайте динамический именованный Диапазон

Введите номер строк в Вашем диапазоне данных в ячейку на Вашей таблице данных.

Создайте именованный диапазон на своей таблице данных (Вставьте - Имя - Определяет), названный MyRange, который имеет формулу, подобную это:

=OFFSET(Sheet1!$A$1,0,0,Sheet1!$D$1,3)

Обновите формулу для соответствия расположению

  • Sheet1! 1$A$ устанавливает это на верхнюю левую сторону Вашего диапазона данных
  • Sheet1! 1$D$ устанавливает это на ячейку, содержащую количество строк
  • 3 устанавливает это значение к числу столбцов

Тест, что именованный диапазон работает:

Выберите выпадающие меню Edit - Переходят В, вводят MyRange в поле ссылки. Ваша область данных для диаграммы должна быть выбрана.

Добавьте некоторый код VBA

Откройте VBA IDE (Alt-F11)

Выберите Sheet1 в окне VBAProject и введите этот код

Private Sub Worksheet_Change(ByVal Target As Range)

        If Target.Address <> "$D$1" Then Exit Sub
    'Change $D$1 to the cell where you have entered the number of rows
    'When the sheet changes, code checks to see if the cell $D$1 has changed

       ThisWorkbook.Sheets("Sheet1").ChartObjects(1).Chart.SetSourceData _
         Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange")
    '  ThisWorkbook.Sheets("Chart1").SetSourceData _
         Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange")
    'The first line of code assumes that chart is embedded into Sheet1
    'The second line assumes that the chart is in its own chart sheet
    'Uncomment and change as required

    'Add more code here to update all the other charts

End Sub

Вещи наблюдать за

Непосредственно не используйте именованный диапазон в качестве источника данных для диаграммы. При вводе именованного диапазона "MyRange" как Исходные данные - Диапазон Данных для диаграммы Excel автоматически преобразует именованный диапазон в фактический диапазон. Любые будущие изменения в Вашем именованном диапазоне поэтому не обновят Вашу диаграмму.

На производительность могли бы повлиять упомянутые выше подходы.

Функция СМЕЩЕНИЯ в именованном диапазоне "энергозависима", что означает, что это повторно вычисляет каждый раз, когда любая ячейка в рабочей книге вычисляет. Если производительность является проблемой, замените ее ИНДЕКСНОЙ формулой.

=Sheet1!$A$1:INDEX(Sheet1!$1:$65536,Sheet1!$D$1,2)

Огни кода каждый раз данные изменяются на Sheet1. Если производительность является проблемой, измените код для выполнения только при необходимости (т.е. через кнопку или меню).

3
ответ дан 6 December 2019 в 21:21
поделиться

Вы могли посмотреть на динамические диапазоны. При использовании функции СМЕЩЕНИЯ можно указать стартовую ячейку и количество строк и столбцов для выбора. Этот сайт имеет немного полезной информации о присвоении имени к диапазону СМЕЩЕНИЯ.

1
ответ дан 6 December 2019 в 21:21
поделиться

+1s для решения для имени.

Обратите внимание, что имена действительно действительно не ссылаются на диапазоны, они ссылаются на формулы. Вот почему можно определить имя к чему-то как "=OFFSET (...)" или "=COUNT (...)". Можно создать названные константы, просто сделать ссылку имени что-то как "=42".

Названные формулы и формулы массива являются двумя методами рабочего листа, что я обращаюсь not-quite-power-user к рабочим листам много раз.

1
ответ дан 6 December 2019 в 21:21
поделиться

Можно установить диапазон для диаграммы динамично в Excel. Можно использовать что-то как следующий код VBA, чтобы сделать это:

Private Sub Worksheet_Change(ByVal Target as Range)
    Select Case Target 
    Case Cells(14, 2)
        Sheet1.ChartObjects(1).Chart.SetSourceData Range("$C5:$C$" & Cells(14,2))
    ...
    End Select
End Sub

В этом случае ячейка, содержащая количество последней строки, которая будет включать, является B14 (помните строку сначала при обращении к объекту Ячеек). Вы могли также использовать переменную вместо ссылки Ячеек, если бы Вы хотели сделать это полностью в коде. (Это работает и в 2007 и в 2003.) Можно присвоить эту процедуру кнопке и нажать ее для обновления диаграммы, после того как Вы обновляете ячейку, содержащую последнюю строку.

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

Править: И поскольку PConroy указывает в комментарии, Вы могли поместить этот код в событие Change для того рабочего листа, так, чтобы ни кнопка, ни сочетание клавиш не были необходимы для выполнения кода. Можно также добавить код так, чтобы он обновил каждую диаграмму только, когда ячейка соответствия редактируется.

Я обновил пример выше для отражения этого.

1
ответ дан 6 December 2019 в 21:21
поделиться

Простой способ сделать это - просто скрыть строки / столбцы, которые вы не хотите включать - когда вы переходите к графику, он автоматически исключает скрытые строки / столбцы

0
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: