Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Герои Войны — это продуманное сочетание стратегии и RPG. Собери мощнейшую армию и одолей всех противников! В игре представлено 7  режимов — как для поклонников сражений с PvE, так и PvP.

Герои Войны

Стратегии, Мидкорные, Экшены

Играть

Топ прошлой недели

  • Oskanov Oskanov 9 постов
  • Animalrescueed Animalrescueed 46 постов
  • AlexKud AlexKud 33 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
44
bighouse.live
bighouse.live
3 года назад
MS, Libreoffice & Google docs
Серия Оцифровка

Excel. Долгая дорога оцифровки. Часть 6. Кусочная интерполяция⁠⁠

Ну теперь пора перейти именно к интерполяции исходных данных. Итак, я напомню - у нас был лист с распечатанным графиком, мы его отсканировали, получили набор точек ХY и... имеем вот такую (в лучшем случае) картину (см.первый скрин). Т.е. по данному набору точек невозможно сделать корректную апроксимацию полиномом.

Выходом из данной ситуации является разбиение данных на несколько частей, в данном случае 2 с общей точкой Do=428, создание кусучнозаданной функции (ЕСЛИ меньше 428 одна функция, если больше - вторая функция). Но так в данном случае, а если надо сделать два, три...и больше разбиений? Кропотливая работа. Но зачем, если можно заставить Excel в автоматическом режиме выбирать малое количество точек и проводить через них интерполяционную функцию.

Отчасти кусочную интерполяцию показывал в прошлом посте серии ( Excel. Долгая дорога оцифровки. Часть 5. Создание пользовательской функции для двух аргументов. Ручной вариант ) при поиске решения между заданных критериев.


Как простые варианты рассмотрим кусочную интерполяцию по двум и по четырём точкам для заданных ниже данных.

Допустим нужно определить значение Y при X = 2.5.

При кусочной интерполяции по двум точкам используются две ближайшие заданные точки к X = 2.5. , т.е. 2 и 3, через данные точки провидится линия,и по ней находится Y при X = 2.5..

При кусочной интерполяции по четырём точкам используются две ближайшие заданные точки к X = 2.5. справа и две две ближайшие заданные точки к X = 2.5. слева, т.е. 1 и 2 и 3 и 4, через данные точки провидится кривая (полином 3-й степени),и по ней находится Y при X = 2.5.

Это справедливо для данных за 2-й и перед предпоследней известной точкой. Для данных отрезков и для экстраполяции использую линейную интерполяцию (по 2-м точкам).

Как видно использование кусочной интерполяции по 4-м точкам (голубая линия)немного сглаживает итоговую функцию, что позволяет снимать при оцифровке чуть меньше точек :) .

Вообще правило такое, в зависимости от вида графика:

Ну и собственно с помощью чего сие выполняется:


Макрос кусочной интерполяции при использовании данных с листа

======

' Интерполяция по 2-м, 3-м или 4-м ближайшим (до и после) к заданной (Xisk) точке

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

' Интерполяция происходит косочно, по количеству заданных точек с учётом расположения заданного Х

' Данные из листа Excel.

Public Function kus_interp_Ex(Xt As Range, Yt As Range, Xisk As Single, Optional ByVal toch As Integer = 2) As Variant

Dim i As Long

Dim xd() As Double

Dim yd() As Double

Dim cd() As Double

' toch - указание поиска решения с использованием количества точек (2, 3, 4).

Select Case toch

Case 2 ' Уравнение а·х+b

kus_interp_Ex = linterp(Xt.Rows(Xt.Count - 1), Xt.Rows(Xt.Count), Yt.Rows(Xt.Count - 1), Yt.Rows(Xt.Count), Xisk)

For i = 1 To Xt.Count - 1

If Xisk < Xt.Rows(i + 1) Then

kus_interp_Ex = linterp(Xt.Rows(i), Xt.Rows(i + 1), Yt.Rows(i), Yt.Rows(i + 1), Xisk)

Exit For

End If

Next i

Case 3 ' Уравнение а·х^2+b·x+c Интерполяция по принципу х1 Х х2 х3

kus_interp_Ex = kubterp(Xt.Rows(Xt.Count - 2), Xt.Rows(Xt.Count - 1), Xt.Rows(Xt.Count), _

Yt.Rows(Xt.Count - 2), Yt.Rows(Xt.Count - 1), Yt.Rows(Xt.Count), Xisk)

For i = 1 To Xt.Count - 2

If Xisk < Xt.Rows(i + 1) Then

kus_interp_Ex = kubterp(Xt.Rows(i), Xt.Rows(i + 1), Xt.Rows(i + 2), _

Yt.Rows(i), Yt.Rows(i + 1), Yt.Rows(i + 2), Xisk)

Exit For

End If

Next i

Case 4 ' Уравнение а·х^3+b·x^2+c·x+d Интерполяция по принципу х1 х2 X х3 x4

ReDim xd(1 To 4) As Double

ReDim yd(1 To 4) As Double

If Xisk < Xt.Rows(2) Then ' Экстраполяция ДО и интерполяция ДО второй известной точки - линейна

kus_interp_Ex = linterp(Xt.Rows(1), Xt.Rows(2), Yt.Rows(1), Yt.Rows(2), Xisk)

Else

If Xisk >= Xt.Rows(Xt.Count - 1) Then ' Экстраполяция ЗА и интерполяция ПОСЛЕ второй известной точки - линейна

kus_interp_Ex = linterp(Xt.Rows(Xt.Count - 1), Xt.Rows(Xt.Count), Yt.Rows(Xt.Count - 1), Yt.Rows(Xt.Count), Xisk)

Else ' Между ними считаю по интерполяции полиномом с расположением заданного икса между двух пар точек

For i = 3 To Xt.Count - 1

If Xisk < Xt.Rows(i) Then

xd(1) = Xt.Rows(i - 2): xd(2) = Xt.Rows(i - 1): xd(3) = Xt.Rows(i): xd(4) = Xt.Rows(i + 1)

yd(1) = Yt.Rows(i - 2): yd(2) = Yt.Rows(i - 1): yd(3) = Yt.Rows(i): yd(4) = Yt.Rows(i + 1)

Linia_trenda yd, xd, 3, cd

kus_interp_Ex = cd(1) * Xisk ^ 3 + cd(2) * Xisk ^ 2 + cd(3) * Xisk ^ 1 + cd(4)

Exit For

End If

Next i

End If

End If

Case Else

End Select

End Function

======

Входные данные:

Xt - Столбец исходных Х

Yt  - Столбец исходных Y

Xisk  - X при котором требуется определить Y

toch - количество используемых точек при интерполяции.


Наблюдательный заметит, что в макросе присутствует и интерполяция с использованием 3-х точек. (0_о)


Дополнительная функция, требуемая для макроса кусочной интерполяции - определение коэффициентов полинома линии тренда:


======

' Проведение интерполяции с использованием функционала Excel

' На выходе - коэффициенты полинома. Число точек должно быть минимум на одну больше, чем степень полинома.

' Данные берутся из программы

Public Sub Linia_trenda(ByRef Y() As Double, ByRef x() As Double, ByVal PolyStep As Integer, ByRef c() As Double, Optional ByRef r2 As Double)

Dim stepen As Long

' Ввожу проверку не превышения степени массива

If (UBound(Y) - LBound(Y) - 1) < PolyStep Then

stepen = UBound(Y) - LBound(Y)

Else

stepen = PolyStep

End If

' Объявляю переменные, создаю матрицы под размер данных и степень полинома.

Dim X1() As Double, Y1() As Double

ReDim X1(LBound(Y) To UBound(Y), 1 To stepen) As Double

ReDim Y1(LBound(Y) To UBound(Y), 1 To 1) As Double

ReDim c(1 To stepen + 1) As Double

' Заполню массив Х в соответствии со степенью уравнения.

For i = LBound(x) To UBound(x)

Y1(i, 1) = Y(i)

X1(i, 1) = x(i)

For N = 2 To stepen

X1(i, N) = X1(i, 1) ^ N

Next N

Next i

' Нахожу уравнение.

Dim Coefs As Variant

Coefs = WorksheetFunction.LinEst(Y1, X1, True, True)

' Вытаскиваю коэффициенты полинома.

For i = 1 To stepen + 1

c(i) = Coefs(1, i)

Next i

' Вытаскиваю величину достоверности апроксимации.

r2 = Coefs(3, 1)

End Sub

======

Макрос linterp был представлен в прошлый раз.


Одним из замечательных применений кусочной интерполяции является возможность автоматического создания макросов функций без проблем с невозможностью достоверной апроксимации исходных данных вот в таком виде:


' Поправки Сербия Панчево Страница 39 из 77

Public Function ТЭХ_ПТ80_Рис3(ByRef Go As Single) As Variant

Dim Xt As Variant

Dim Yt As Variant

Xt = Array(13.0042194092827, 13.4767932489451, 14.0675105485232)

Yt = Array(-6.38888888888889E-02, -6.38888888888889E-02, -0.06875)

ТЭХ_ПТ80_Рис3 = kus_interp(Xt, Yt, Go, 4, 2)

End Function


Учтите что kus_interp при использовании данных с листа и из макроса отличаются...

Но об этом в следующий раз.


===========================

Планы на будущее

1. Часть 7. Автоматическое создание макроса функции с использованием кусочной интерполяции.

2. Построим поиск решения.

3. Строим график функции.

Показать полностью 5
[моё] Microsoft Excel Vba Плюшка Длиннопост
9
168
bighouse.live
bighouse.live
3 года назад
MS, Libreoffice & Google docs

Базы данных в Excel. Или ВПР по неограниченному количеству условий⁠⁠

Ответ на пост из соседней темы о ВПР по 2-м условиям.

Довольно часто я встречаю решения выполнения поиска в таблице по двум/трём условиям с применением ВПР/ГПР. Подчас решения очень интересные. Однако что ВПР, что ГПР выдают только одно значение, и решения не масштабируемы. А что делать если необходимо из массива выбрать всю строку, которая будет подчиняться набору критериев?

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

Итак, есть некая таблица и необходимо из неё выбрать все строки подчиняющиеся неким условиям.

Ход поиска однотипен:

1. Столбцы исходной таблицы имеют уникальные заголовки.

2. Для выборки из данной таблицы создаём таблицу условий. При этом заголовок таблицы условий должен совпадать с названием столбца из исходной таблицы, по которому будет проходить выборка. Если выборка по одному столбцу, но по нескольким условиям, то можно написать всё в один столбец (см.скрин ниже). Если условия по нескольким столбцам - по одному условию на столбец, наименования столбцов могут повторяться.

3. Затем переходим в вкладку "Данные" - "Сортировка и фильтр" - "Дополнительно". В открывшемся окне

3.1. отмечаем "скопировать результат в новое место". В этом случае исходная таблица не изменится.

3.2. Исходный диапазон - таблица исходная, вместе с шапкой

3.3. Диапазон условий - таблица условий, вместе с шапкой

3.4. Адрес ячейки с которой будет заполняться итоговая таблица согласно выборки.

Итоговая таблица при этом никак не связана с исходной. И с ней можно проводить любые операции.

Вынос итоговой таблицы в отдельный лист с помощью меню выполнить нельзя, однако можно через макрос, если полностью указать путь с учётом имени страницы назначения :

=====

Sub Выборка()

Range("B3:B37").AdvancedFilter Action:=xlFilterCopy, _

CriteriaRange:=Range("I3:I6"), _

CopyToRange:=Range("K3"), _

Unique:=False

End Sub

=====

где

Range("B3:B37") - исходная таблица

Range("I3:I6") - таблица критериев

Range("K3") - начало вывода результирующей таблицы


Соответственно можно повесить выполнением макроса на кнопку, менять условия и получать новые выборки.


Вызов функции выборки:

AdvancedFilter (Действие, CriteriaRange, CopyToRange, Уникальный)

Причём работа с таблицами как с базами на этом не ограничивается, в частности она позволяет выполнять быстрые расчёты с учётом критериев. Например находить минимальные, максимальные и средние значения только для строк удовлетворяющих критериям. Заметьте - проблемы с числом критериев нет.

Например, если я хочу просуммировать все значения из столбца "Продажи" с учётом того, что они проводились в марте, и контактов было от 35...36, то я создаю таблицу критериев (см.скрин ниже) и в любой ячейке листа формулу  =БДСУММ(B6:G21;F6;B2:В3)

где

B6:G21 - Диапазон исходной таблицы, включая заголовок;

F6 - по какому столбцу буду суммировать;

B2:D3 - при каких условиях суммировать.

Да, сейчас это можно заменить на СУММЕСЛИ, но если будет больше условий? А если суммируется при сложных условиях содержания ячеек?

Насколько способ с использованием баз нагляднее, не так ли?

Варианты задания условий при этом поражают разнообразием. Не всегда можно сходу подобрать условия для СУММЕСЛИ, а тут это просто содержание одной ячейки.

Ну и естественно умные таблицы используются без проблем

==================


Рассмотрим ещё один метод  поиска значения по 2-м, 3-м и более критериям без применение ВПР.

Для сокращения пишу для умной таблицы. К тому же она масштабируема, так что добавление участника не приведёт к необходимости корректировки формулы.

Допустим есть таблица исходных данных (Таблица1), в корой представлены список  сотрудников (столбец Name) с датой их приёма на работу (Start) увольнения с должности (Stop) и названием должности (Role). При этом если человек принят, но ещё не уволился, то его ячейка Stop пустая. Нужно найти должность человека (F3) на какую то дату (F4). Попробуйте это через ВПР прописать ради интереса. А вот так делается без ВПР:

В ячейке F6 собственно формула поиска.

=ЕСЛИОШИБКА(ПРОСМОТР(2;1/(Таблица1[Name]=F3)/(Таблица1[Start]<=F4)/((Таблица1[Stop]="")+(Таблица1[Stop]>=F4));Таблица1[Role]);"нет данных")


Разберём структуру поиска и задания условий:

Таблица1[Name]=F3 - совпадение имени

Таблица1[Start]<=F4 - дата зачисления на работу меньше даты поиска

(Таблица1[Stop]="")+(Таблица1[Stop]>=F4) - дата поиска или меньше даты увольнения или дата увольнения пустая.

Таблица1[Role] - вывод ячейки для которой все три условия истина.


Как видно формула легко масштабируется под любое количество условий.


Ну вот как то так.

Этим постом я хотел показать, что применение ВПР(ГПР) не всегда оправдано (хотя несомненно знание этих функций обязательно), и есть более простые и лёгкие способы.

Показать полностью 7
[моё] Microsoft Excel Vba Плюшка Длиннопост
17
25
bighouse.live
bighouse.live
3 года назад
MS, Libreoffice & Google docs
Серия Оцифровка

Excel. Долгая дорога оцифровки. Часть 5. Создание пользовательской функции для двух аргументов. Ручной вариант⁠⁠

Итак, если понятно как получить уравнение по имеющемуся графику одного аргумента, то перейдём к следующему этапу: Созданию макроса-функции по диаграмме двух аргументов или Y=f(X1,X2). Внешний вид таких диаграмм на скрине ниже.

Excel. Долгая дорога оцифровки. Часть 5. Создание пользовательской функции для двух аргументов. Ручной вариант

Так повелось, что для удобства я называю второй аргумент критерием. Просто кроме зависимости от одного или двух аргументов существуют варианты зависимости от трёх и четырёх аргументов. У меня на практике доходило до пяти... Но для всех таких диаграмм была, как правило, общая ось Х.

В данном случае имеется зависимость от двух аргументов (Go, Qт). При этом для второго аргумента есть 10 критериев (Qт = 0, 20…180).

Решение происходит в два этапа:

Этап 1: для каждого критерия прописывается значение критерия и уравнение линии (не обязательно прямой как в данном примере), соответствующей критерию.

Этап 2: производится проверка перебором соотношения заданного критерия и имеющихся. Как только соотношение krit_kriv(i) Krit < krit_kriv(i + 1) выполняется, происходит поиск значения функции с использованием линейной (в данном случае) интерполяции (или просто через пропорцию) по точкам Y(Xзад, krit_kriv(i)) и Y(Xзад, krit_kriv(i+1.))


Т.е. например нужно определить значение при Gо=400 и Qт = 30. Соответственно я понимаю что искомое находится между критериями Qт = 20 и Qт = 40. Нахожу при данных критериях и при Go = 400 значения Gцнд. И через пропорцию определяю каким будет значение при Qт = 30.


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

=====

' Функция линейной интерполяции по двум точкам методом пропорции

' Необходимое условие X1 < X2

Public Function linterp(ByVal X1 As Single, ByVal X2 As Single, ByVal Y1 As Single, ByVal Y2 As Single, ByVal X As Single) As Single

If X2 = X1 Then X2 = X1 + X1 / 10000# ' Убираем совпадение иксов

linterp = Y2 - ((Y2 - Y1) / (X2 - X1)) * (X2 - X)

End Function

=====

Ну и собственно макрос


' Программа является унифицированной для минимизации изменений.

Public Function ris_71(x As Single, Krit As Single) As Single

Dim kriv() As Single ' объявляем динамический массив

Dim krit_kriv() As Single ' объявляем динамический массив

Dim N_kriv As Integer, i As Integer ' объявляем тип числа уравнений

N_kriv = 10 ' ВВОДИМ число кривых

ReDim kriv(1 To N_kriv) ' Изменяем размер массива в соответствии с числом кривых.

ReDim krit_kriv(1 To N_kriv) ' Изменяем размер массива в соответствии с числом кривых

' требование - рост критериев должен быть по нарастающей. Критерий - это второй аргумент функции.

' ВВОДИМ критерии с первой по последнюю кривую в порядке возрастания

krit_kriv(1) = 0#

krit_kriv(2) = 20#

krit_kriv(3) = 40#

krit_kriv(4) = 60#

krit_kriv(5) = 80#

krit_kriv(6) = 100#

krit_kriv(7) = 120#

krit_kriv(8) = 140#

krit_kriv(9) = 160#

krit_kriv(10) = 180#

' ВВОДИМ уравнения кривых в соответствии с критериями

kriv(1) = 0.7324 * x - 1.576 ' соответствует krit_kriv(1) = 0# и т.д.

kriv(2) = 0.7343 * x - 30.41

kriv(3) = 0.7574 * x - 68.76

kriv(4) = 0.7536 * x - 102.2

kriv(5) = 0.756 * x - 142.9

kriv(6) = 0.7311 * x - 173.1

kriv(7) = 0.7582 * x - 221.6

kriv(8) = 0.7461 * x - 260.2

kriv(9) = 0.7894 * x - 323#

kriv(10) = 0.7798 * x - 357.2

If Krit > krit_kriv(N_kriv) Then

' предварительный расчёт результата если критерий больше максимального имеющегося

ris_71 = linterp(krit_kriv(N_kriv - 1), krit_kriv(N_kriv), _

kriv(N_kriv - 1), kriv(N_kriv), Krit)

Else

' проверка положения критерия относительно имеющихся кривых, и проведение линейной аппроксимации.

For i = 1 To N_kriv - 1

If Krit <= krit_kriv(i + 1) Then

ris_71 = linterp(krit_kriv(i), krit_kriv(i + 1), _

kriv(i), kriv(i + 1), Krit)

Exit For

End If

Next i

End If

End Function


Макрос описывающий наш пример приведён выше. Ввиду того, что приходилось делать большое количество таких апроксимаций, данный макрос оптимизирован для минимизации действий по его созданию.


Т.е. для нового графика потребуется
1. Заменить название. Внимание - менять по всему макросу.

2. Указать количество критериев.

3. Указать значения критериев

4. Указать уравнения описывающие критерии.

Показать полностью 1
[моё] Microsoft Excel Vba Плюшка Длиннопост
9
bonya2704
bonya2704
3 года назад

Как игрушка))⁠⁠

Как игрушка))
Показать полностью 1
Кот Милота Плюшка Доброта
0
31
bighouse.live
bighouse.live
3 года назад
MS, Libreoffice & Google docs

Прореживание маркеров⁠⁠

Избыточное количество данных одного графика диаграммы приводит к трудности использования маркеров для обозначения линии. При этом отказываются от маркеров, применяют пунктирные/штрихпунктирные линии, выполняют выноски/подписи и т.д. Однако есть способ проще - провести "прополку" маркеров. Разница отчётливо видна на скриншоте:

Для этого можно воспользоваться макросом:

' ===========================

Sub Прореживание_маркеров()

' Активируем диаграмму

ActiveSheet.ChartObjects("Прореживание_после").Activate

' Перебор по всем графикам диаграммы

For k = 1 To ActiveChart.FullSeriesCollection.Count

' Удаляем маркеры на линии за исключением указанного шага

For i = 1 To ActiveChart.SeriesCollection(k).Points.Count

If (i Mod 9) <> 0 Then

ActiveChart.FullSeriesCollection(k).Points(i).MarkerStyle = -4142

End If

Next i

Next k

End Sub

' ===========================

где:

"Прореживание_после" - название диаграммы

"i Mod 9" - указание частоты оставленных маркеров. В данном примере остаётся каждый 9-й маркер, начиная с 9-го.

Из минусов можно отметить необходимость выставления всех маркеров перед каждым прореживанием.


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

' ===========================

Sub Прореживание_маркеров_2()

' Активируем диаграмму

ActiveSheet.ChartObjects("Прореживание_после").Activate

' Перебор по всем графикам диаграммы

For k = 1 To ActiveChart.FullSeriesCollection.Count

' Удаляем все маркеры на линии

For i = 1 To ActiveChart.SeriesCollection(k).Points.Count

ActiveChart.FullSeriesCollection(k).Points(i).Select

Selection.MarkerStyle = -4142

Next i

' Выставляем маркеры с требуемым шагом.

For i = 1 To ActiveChart.SeriesCollection(k).Points.Count Step 9 ' Указываем частоту маркеров

ActiveChart.FullSeriesCollection(k).Points(i).Select

With Selection

' Тип маркеров будет разным для каждой линии (если линий до 9-ти)

' Если линий более 9-ти, то можно указывать заливки/границы маркера

.MarkerStyle = k

' Указание размера маркера

.MarkerSize = 7 

End With

Next i

Next k

End Sub

' ===========================

Если маркеры двух графиков "налезают" друг на друга, то можно сдвинуть их отображение, например используя номер графика "(i + k * 3)":

' ===========================

Sub Прореживание_маркеров()

' Активируем диаграмму

ActiveSheet.ChartObjects("Прореживание_после").Activate

' Перебор по всем графикам диаграммы

For k = 1 To ActiveChart.FullSeriesCollection.Count

' Удаляем маркеры на линии за исключением указанного шага

For i = 1 To ActiveChart.SeriesCollection(k).Points.Count

If ((i + k * 3) Mod 9) <> 0 Then

ActiveChart.FullSeriesCollection(k).Points(i).MarkerStyle = -4142

End If

Next i

Next k

End Sub

' ===========================

dixi.

' ===========================

О себе - я не являюсь профессиональным программистом. Поэтому спокойно отношусь к конструктивной и обоснованной критике и предложениям по вопросам программирования. Однако понятность кода для меня на первом месте.

Показать полностью 1
[моё] Microsoft Excel Vba Плюшка Длиннопост
4
DELETED
3 года назад

Спасибо⁠⁠

Спасибо, тут все ясно и понятно, это комментировать нигде не надо уже.

Плюшка Политика Старшее поколение Мат Длиннопост Текст
21
106
bighouse.live
bighouse.live
3 года назад
MS, Libreoffice & Google docs

Заливка маркеров по цвету ячеек⁠⁠

Добрый день, сегодня пример выполнения заливки маркеров графика в соответствии с цветом ячеек. Собственно результат на скриншоте ниже:

Заливка маркеров по цвету ячеек

Для того чтобы добиться такого результата требуется:
1. Иметь исходные данные. В нашем случае они представлены Х(А2:А9) и Y(В2:В9)
2. Иметь закрашенные ячейки в количестве равном количеству маркеров. В нашем случае ячейки Y закрашены с помощью условного форматирования.
3. По исходным данным построить график с наличием маркеров.
4. Перейти в редактор VBA (Alt+F11), создать в текущем документе модуль (если оный отсутствует), вставить макрос в поле , слегка поправить и выполнить макрос:

Public Sub color_graph()
ActiveSheet.ChartObjects("Диаграмма 1").Activate
For Each icell In [B2:B9]
ActiveChart.FullSeriesCollection(1).Points(icell.Row - 1).Select
Selection.Format.Fill.ForeColor.RGB = icell.DisplayFormat.Interior.Color
Next
End Sub

где требуется поправить (всего три места, и только при необходимости):
1. "Диаграмма 1" - название диаграммы (отображается в левом углу Excel при нажатии на график, не путать с тем что пишется на самой диаграмме).
2. "[B2:B9]" - диапазон ячеек откуда будут извлекаться цвета.
3. "icell.Row - 1" - определение сдвига ячеек указания цветов. Т.к. у нас данные начинаются с B2, т.е. они сдвинуты на 1 ячейку вниз, то "- 1". Если бы начинались с B5 , то было бы "icell.Row - 4".

Если имеется несколько графиков на одной диаграмме, то указываем номер обрабатываемой. В рассматриваемом примере обрабатывается первый и единственный график (о чём говорит "1" в FullSeriesCollection(1).) Для второго графика будет FullSeriesCollection(2).

=============
Это мой первый пост на Пикабу. Если аудитории зайдёт - у меня есть что рассказать интересного про использование Excel как в плане оформления, так и в плане расчётов. Не из учебников.

Показать полностью
[моё] Microsoft Excel Vba Оформление Плюшка
8
3
DELETED
3 года назад

Съешь меня!⁠⁠

Съешь меня!
[моё] Показалось Плюшка Парейдолия
2
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии