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

Пикабу Игры +1000 бесплатных онлайн игр

Погрузитесь в логическую головоломку: откручивайте болты из планок на самых сложных уровнях! Вы не только расслабитесь в конце сложного дня, но еще и натренируете свой мозг, решая увлекательные задачки. Справитесь с ролью опытного мастера? Попробуйте свои силы в режиме онлайн бесплатно и без регистрации!

Головоломка. Болты и Гайки

Казуальные, Гиперказуальные, Головоломки

Играть
“Рецепт Счастья” — увлекательная игра в жанре «соедини предметы»! Помогите Эмили раскрыть тайны пропавшего родственника, найти сокровища и восстановить её любимое кафе.

Рецепт Счастья

Казуальные, Головоломки, Новеллы

Играть
Динамичный карточный батлер с PVE и PVP-боями онлайн! Собери коллекцию карточных героев, построй свою боевую колоду и вступай в бой с другими игроками.

Cards out!

Карточные, Ролевые, Стратегии

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

Рыбный дождь

Спорт, Симуляторы, Рыбалка

Играть
Щелкните блоки, чтобы они улетели в 3D. Разблокируйте куб, чтобы овладеть головоломками

Разбери Кубик

Головоломки, 3D, Обучающая

Играть

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

  • Oskanov Oskanov 8 постов
  • alekseyJHL alekseyJHL 6 постов
  • XpyMy XpyMy 1 пост
Посмотреть весь топ

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

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

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

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

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Vba

С этим тегом используют

Microsoft Excel Excel Макрос Программирование Помощь Microsoft Word Без рейтинга Все
164 поста сначала свежее
93
bighouse.live
bighouse.live
3 года назад
MS, Libreoffice & Google docs

Весёлые маркеры графиков⁠⁠

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

Весёлые маркеры графиков Microsoft Excel, Vba, Прост, Длиннопост

Установка рисунков в качестве маркеров позволяет разнообразить внешний вид документации, сделав её нагляднее. Установка смайлов (© http://www.kolobok.us/ ) сделана в качестве примера (помните про Aiwan то? Или забыли...).

Для гармоничного отображения требуется проредить количество маркеров, в противном случае произойдёт наложение рисунков друг на друга. О прореживании писал ранее.

Весёлые маркеры графиков Microsoft Excel, Vba, Прост, Длиннопост

Заменить маркеры на рисунки, в данном случае они представлены смайлами, можно при помощи не сложного макроса


Sub Markers_Smiles()

ActiveSheet.ChartObjects("Диаграмма 1").Activate

For Each icell In [C2:C102]

ActiveChart.FullSeriesCollection(1).Points(icell.Row - 1).Select

' Убираю рамки вокруг маркеров

Selection.MarkerForegroundColorIndex = xlNone

' Установка типа маркера «Рисунок»

Selection.MarkerStyle = -4147

Selection.Format.Fill.UserPicture "D:\4.gif"

If icell.Value = 0 Then Selection.Format.Fill.UserPicture "D:\1.gif"

If icell.Value = 1 Then Selection.Format.Fill.UserPicture "D:\2.gif"

If icell.Value = 2 Then Selection.Format.Fill.UserPicture "D:\3.gif"

Next

End Sub


Где

[C2:C102] - столбец с признаками маркера. Число элементов равно числу данных (Х или Y). Может как заполняться вручную, так и быть расчётным (см.рисунок ниже).

D:\1.gif ... D:\4.gif - пути к рисункам.


Аналогично производится заполнение рисунками нескольких графиков на диаграмме

Весёлые маркеры графиков Microsoft Excel, Vba, Прост, Длиннопост

Прореживаем


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

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

ActiveSheet.ChartObjects("Диаграмма 1").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 4

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

With Selection

.MarkerStyle = 8

.MarkerSize = 15

End With

Next i

Next k

End Sub


Проставляем рисунки


Public Sub color_graph()

ActiveSheet.ChartObjects("Диаграмма 1").Activate

For k = 1 To ActiveChart.FullSeriesCollection.Count ' Перебор по всем графикам

For Each icell In [C2:C102]

ActiveChart.FullSeriesCollection(k).Points(icell.Row - 1).Select

Selection.MarkerStyle = -4147

Selection.Format.Fill.UserPicture "D:\4.gif"

If icell.Value = 0 Then Selection.Format.Fill.UserPicture "D:\1.gif"

If icell.Value = 1 Then Selection.Format.Fill.UserPicture "D:\2.gif"

If icell.Value = 2 Then Selection.Format.Fill.UserPicture "D:\3.gif"

Next

Next k

End Sub


Аналогично разным графикам одной диаграммы можно присвоить уникальные маркеры

Весёлые маркеры графиков Microsoft Excel, Vba, Прост, Длиннопост

Sub Markers()

ActiveSheet.ChartObjects("Диаграмма 1").Activate

For i = 1 To ActiveChart.FullSeriesCollection.Count ' Перебор по всем графикам

ActiveChart.FullSeriesCollection(i).Select

Selection.MarkerForegroundColorIndex = xlNone

Selection.MarkerStyle = -4147

If i = 1 Then Selection.Format.Fill.UserPicture "D:\1.gif"

If i = 2 Then Selection.Format.Fill.UserPicture "D:\2.gif"

If i = 3 Then Selection.Format.Fill.UserPicture "D:\3.gif"

If i = 4 Then Selection.Format.Fill.UserPicture "D:\4.gif"

If i = 5 Then Selection.Format.Fill.UserPicture "D:\5.gif"

Next i

End Sub


Ну или просто разными штатными маркерами разные графики. Но в автоматическом режиме - очень сокращает время подготовки документации. Полезно при подготовке к печати в чёрно-белом варианте.

Весёлые маркеры графиков Microsoft Excel, Vba, Прост, Длиннопост

Sub Установка_разных_маркеров()

ActiveSheet.ChartObjects("Диаграмма 1").Activate

For i = 1 To ActiveChart.FullSeriesCollection.Count ' Перебор по всем графикам

ActiveChart.FullSeriesCollection(i).Select

Selection.Format.Line.ForeColor.RGB = RGB(0, 0, 0) ' Цвета линий и маркера

Selection.Format.Line.Weight = 0.75 ' Установка толщины линии

Selection.MarkerStyle = i ' Установка типа маркера

Selection.MarkerSize = 4 ' Установка размера маркера

Selection.Format.Fill.ForeColor.RGB = RGB(255, 255, 255) ' Установка заливки маркера

Next i

End Sub


Можно ли это сделать без макросов? Несомненно. Долго и нудно кликать кнопочки.

Весёлые маркеры графиков Microsoft Excel, Vba, Прост, Длиннопост

Но как по мне - проще скопировать и немного поправить код простого макроса. А в остальном - ваш выбор.

Показать полностью 5
[моё] Microsoft Excel Vba Прост Длиннопост
4
19
DarkPavlov
3 года назад
MS, Libreoffice & Google docs

Excel. Копирование диапазона в другой файл⁠⁠

Всем привет!

Нужна ваша помощь.


Есть такая задача:

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


Sub ExportRangetoExcel()
'Update 20130916
Dim wb As Workbook
Dim saveFile As String
Dim WorkRng As Range
Dim address As String
Dim defult As Integer
On Error Resume Next
xTitleId = "KutoolsforExcel"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.address, Type:=8)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
defult = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
Set wb = Application.Workbooks.Add
Application.SheetsInNewWorkbook = defult
WorkRng.Copy
wb.Worksheets(1).Paste
address = Replace(WorkRng.address, ":", "-")
address = Replace(address, "$", "")
address = Replace(address, ".", "")
saveFile = Application.GetSaveAsFilename(InitialFileName:=address, fileFilter:="Excel Workbooks (*.xlsx),*.xlsx")
wb.SaveAs Filename:=saveFile
wb.Close
Application.CutCopyMode = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Он делает именно то, что нужно, но не сохраняет форматироание.

Нашёл метод Range.PasteSpecial, но как его здесь правильно применить так и не разобрался.


Вопрос к знатокам VBA: что сделать, чтобы макрос вставлял выделенный диапазон с сохранением форматирования?

Показать полностью
Microsoft Excel Vba Таблицы Excel Текст
11
0
elvinnsk
elvinnsk
3 года назад

Хвастаюсь своими макросами для корела⁠⁠

Скачать бесплатно без смс можно тут: https://vk.com/elvin_macro

[моё] Vba Corel Draw Макрос Видео YouTube
0
203
bighouse.live
bighouse.live
3 года назад
MS, Libreoffice & Google docs

Excel триальный⁠⁠

Немного отвлечённый пост о защите своей работы.

Итак, общеизвестны способы закрытия информации в Excel, а именно:

1. Защита листа/книги

Excel триальный Microsoft Excel, Vba, Прост, Длиннопост

Выбираем разрешения/допуски, вводим пароль, сохраняем файл.

Дополнительно для каждой ячейки можно указать защищается ли она или нет. По умолчанию - защищается.

2. Защита кода

Excel триальный Microsoft Excel, Vba, Прост, Длиннопост

Точно так же вводим пароль (с повторением), ок, сохраняем.


Но все эти способы не более чем игрушки, и вскрываются совершенно не сложно при наличии некоторых минимальных навыков и особенно при сохранении в *.xlsm (файл с поддержкой макросов). Сохраняйте в *.xlsb (двоичный код), если хотите хоть немного защитить свою работу.

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


Каким же образом можно ещё затруднить использование вашей работы, кроме как не давать её?

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

Этим можно воспользоваться выполнив передачу результатов расчёта в виде статических таблиц. Да, можно распечатать/сохранить в pdf,  или банальным Ctrl+А /  Ctrl+C / Ctrl+V /только значения/. А можно просто воспользоваться простым макросом:


' Замена всех формул на листе в значения

Sub Form_2_Dan()

Dim a As Integer

' Запрашиваем подтверждение

a = MsgBox("Внимание!" & _

Chr(10) & "Вы точно хотите заменить все формулы на листе на значения?" & _

Chr(10) & "Это необратимо!", _

52, "Замена формул на значения.")

' Если OK, то замену производим

If a = 6 Then

ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value

End If

End Sub


Расположение макроса - модуль.

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

Внимание! Действие макроса необратимо!


Можно сделать "триальным" расчёт разместив в модулях листов вот такого вида макрос.


Private Sub Worksheet_Activate()

Application.ScreenUpdating = False

If Date >= #10/6/2022# Then ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value

Application.ScreenUpdating = True

End Sub


Т.е. после 10.06.2022 все расчёты с листа исчезнут... А цифры останутся.

Можно заменить проверку на заполнение ячейки, например проверить что в определённой ячейке записан автор труда "Вася Пупкин". :) При смене которого всё превратится в набор цифр..

Естественно доступ к макросам должен быть закрыт/запаролен.


Ещё вариант - ввод пароля на саму книгу:


Private Sub Workbook_Open()

Dim i&, n&, P As Variant

Application.ScreenUpdating = False

n = 2

If Date >= #1/2/2022# Then

For i = 1 To Sheets.Count

Sheets(i).Activate

Sheets(i).Protect "1234"

Next

1:

P = InputBox("Время использования книги истекло, для продолжения введите пароль", "ВВОД ПАРОЛЯ")

If P = "°0176" Then

For i = 1 To Sheets.Count

Sheets(i).Activate

Sheets(i).Unprotect "1234"

Next

Else

If n = 0 Then

Application.DisplayAlerts = False

ThisWorkbook.Close

Application.DisplayAlerts = True

Else

MsgBox "Пароль не верный, у вас еще " & n & " попытки"

n = n - 1

End If

GoTo 1

End If

End If

Application.ScreenUpdating = True

End Sub


Расположение макроса - "Эта книга".


#1/2/2022# - дата с которой будет запрашиваться пароль

"°0176" – правильный пароль

Excel триальный Microsoft Excel, Vba, Прост, Длиннопост

И при открытии файл будет встречать весёлым окошком:

Excel триальный Microsoft Excel, Vba, Прост, Длиннопост

Естественно можно открыть файл без выполнения макросов, но если расчёт в экселе построен на использовании макросов, то цель достигнута - расчёт производиться не будет.


И да, это всё игрушки - серьёзные дяденьки с тётеньками при необходимости поломают сие поделия, и узнают как вы определяли дискриминант...  (0_о). Даже если Вы применили обфускацию кода или перенос кода в dll.

Показать полностью 3
[моё] Microsoft Excel Vba Прост Длиннопост
15
elvinnsk
elvinnsk
3 года назад

Чистый код⁠⁠

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

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

Но называть нас, вбашников, быдлокодерами тоже, наверное, неправильно. Ведь не все же. Ну вот хотя бы я :) Чё я, быдлокодер что ли? Нифига. Я за солид пояснить могу. За сингле, нах, респонсибилити принсипе - это без базару. А Варюхе Лисковой ещё в шараге пуп сточил.

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

Ну а далее по масти.

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

Если вбаджун ровно себя проявил - он становится вбамидлом. Вбамидл умеет рисовать формы и запихивать весь код в CommandButton1_Click. А как ты хотел - UI/UX это не хухры-мухры.

Вбамидл ходит под вбасиниором. Вбасиниор слышал за классы и может забубенить евенты. Просто берёт и заливает всё этим дерьмом. Он каждый пук может в класс закубатурить, чтобы список модулей на три экрана был. А какие у него имена переменных! На полэкрана в ширину погремухи, не меньше.

Ну и смотрящий за всеми - вбалид. Чё могу сказать за вбалида. Он один такой на всём белом свете. Старики говорят - зависал как-то у нас на районе. В час нужды, говорят, обязательно придёт. И будет всем полный рефакторинг, сечёте. Всё будет чотко.

Чистый код, ёпта.

Показать полностью
[моё] Vba Пятничное IT юмор Мат Текст
6
127
bighouse.live
bighouse.live
3 года назад
MS, Libreoffice & Google docs

Построение графиков⁠⁠

Сегодня разберём задачку, которая вставала перед каждым пользователем Excel - необходимость построить график функции.

Построение графиков Microsoft Excel, Vba, Плюшка, Длиннопост

Любой, кто решал эту задачку - действовал следующим способом:

1. Создаётся столбец Х;

2. Создаётся столбец Y,  котором происходит расчёт согласно заданной функции;

3. Выделяются два созданных столбца и вставляется график.


Но это просто и скучно. Есть другой способ. Построить график непосредственно из макроса.

Начнём с простого - у нас есть набор точек соответствия X и Y.


Sub Построй_график_по_точкам()

Dim MyChart As Chart

Set MyChart = ActiveSheet.Shapes.AddChart2.Chart

With MyChart

.SeriesCollection.NewSeries

.SeriesCollection(1).Name = "xlXYScatterSmoothNoMarkers"

.SeriesCollection(1).XValues = Array(0#, 0.5, 1#, 1.5, 2#, 2.5, 3#, 3.5, 4#, 4.5, 5#)

.SeriesCollection(1).Values = Array(0#, 0.4794, 0.8415, 0.9975, 0.9093, 0.5985, 0.1411, -0.3508, -0.7568, -0.9775, -0.9589)

.ChartType = xlXYScatterLines ' Соединение точек прямыми

.SetElement msoElementLegendNone

End With

End Sub


Другие варианты отображения линии графика:

.ChartType = xlXYScatterLinesNoMarkers ' Соединение точек прямыми без маркеров

.ChartType = xlXYScatterSmoothNoMarkers ' Сглаженная линия

Более подробно о типах - тут

Сборка  Array(...) может быть выполнена с использованием программы, которую я выкладывал в 7-й части темы про оцифровку, ну или заполнить руками.


Как не трудно догадаться - вовсе не обязательно иметь готовый набор данных.

Рассмотрим ситуацию, когда требуется построить два графика на одной диаграмме.

Для упрощения восприятия использую две простые функции линий y1 = x - 20, y2 = x + 20.


Sub Создать_диаграмму()

Dim MyChart As Chart

Dim i As Integer, Xmin As Single, dX As Single, Xmax As Single, _

Ymin As Single, Ymax As Single, dY As Single

Dim X() As Single

Dim Y() As Single

Dim Yp() As Single

Xmin = 0: Xmax = 300: dX = 20 ' Сие больше нужно для осей и оформления

Ymin = 0: Ymax = 160: dY = 20

ReDim X(0 To Xmax - Xmin): ReDim Y(0 To Xmax - Xmin, 1 To 2)

ReDim Yp(0 To Xmax - Xmin)

For i = 0 To Xmax - Xmin Step 1

X(i) = Xmin + i

' Заполнение данных первого графика

Y(i, 1) = X(i) - 20

' Заполнение данных второго графика

Y(i, 2) = X(i) + 20

Next i

' создадим новую диаграмму и зададим ей габаириты

Set MyChart = ActiveSheet.Shapes.AddChart2(, , , , 300, 200).Chart

For i = 1 To 2

For j = 0 To Xmax - Xmin Step 1

Yp(j) = Y(j, i)

Next j

With MyChart

.SeriesCollection.NewSeries

.SeriesCollection(i).XValues = X

.SeriesCollection(i).Values = Yp

.ChartType = xlXYScatterSmoothNoMarkers

End With

Next i

End Sub


При задании новой диаграммы можно задать в том числе и положение диаграммы на листе

AddChart2(Стиль,XlChartType,слева,сверху,ширина,высота,NewLayout)

В итоге получим вот такую диаграмму:

Построение графиков Microsoft Excel, Vba, Плюшка, Длиннопост

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


Sub Создать_диаграмму()

Dim MyChart As Chart

Dim i As Integer, Xmin As Single, dX As Single, Xmax As Single, _

Ymin As Single, Ymax As Single, dY As Single

Dim X() As Single

Dim Y() As Single

Dim Yp() As Single

Xmin = 0: Xmax = 300: dX = 20 ' Сие больше нужно для осей и оформления

Ymin = 0: Ymax = 340: dY = 20

ReDim X(0 To Xmax - Xmin): ReDim Y(0 To Xmax - Xmin, 1 To 2)

ReDim Yp(0 To Xmax - Xmin)

For i = 0 To Xmax - Xmin Step 1

X(i) = Xmin + i

Y(i, 1) = X(i) - 20

Y(i, 2) = X(i) + 20

Next i

Set MyChart = ActiveSheet.Shapes.AddChart2(, , 0, 0, 400, 230).Chart

For i = 1 To 2

For j = 0 To Xmax - Xmin Step 1

Yp(j) = Y(j, i)

Next j

With MyChart

.SeriesCollection.NewSeries

.SeriesCollection(i).XValues = X

.SeriesCollection(i).Values = Yp

.ChartType = xlXYScatterSmoothNoMarkers

End With

Next i

With MyChart

.SetElement (msoElementPrimaryCategoryGridLinesMajor)

' Включаю отображение названия осей

.Axes(xlCategory, xlPrimary).HasTitle = True

.Axes(xlValue, xlPrimary).HasTitle = True

.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Расход Go т/ч"

.Axes(xlValue, xlPrimary).AxisTitle.Text = "Давление кгс/кв.см."

' Выключаю отображение легенды

.SetElement (msoElementLegendNone)

' Выключаю отображения заголовка диаграммы

.SetElement (msoElementChartTitleNone)

' Выставляем параметры осей

.Axes(xlCategory).MinimumScale = Xmin

.Axes(xlCategory).MaximumScale = Xmax

.Axes(xlCategory).MajorUnit = dX

.Axes(xlValue).MinimumScale = Ymin

.Axes(xlValue).MaximumScale = Ymax

.Axes(xlValue).MajorUnit = dY

End With

' Оформление гризонтальной оси

MyChart.Axes(xlCategory).Select

With Selection.Format.Line

.Visible = msoTrue

.ForeColor.RGB = RGB(0, 0, 0)

.ForeColor.TintAndShade = 0

.ForeColor.Brightness = 0

.Transparency = 0

.Visible = msoTrue

.Weight = 1.25

End With

' Оформление вертикальной оси

MyChart.ChartArea.Select

MyChart.Axes(xlValue).Select

With Selection.Format.Line

.Visible = msoTrue

.ForeColor.RGB = RGB(0, 0, 0)

.ForeColor.TintAndShade = 0

.ForeColor.Brightness = 0

.Transparency = 0

.Visible = msoTrue

.Weight = 1.25

End With

' Оформление горизонтальной сетки

MyChart.Axes(xlValue).MajorGridlines.Select

With Selection.Format.Line

.Visible = msoTrue

.DashStyle = msoLineDash

.Visible = msoTrue

.ForeColor.RGB = RGB(0, 176, 240)

.Transparency = 0

End With

' Оформление вертикальной сетки

MyChart.Axes(xlCategory).MajorGridlines.Select

With Selection.Format.Line

.Visible = msoTrue

.DashStyle = msoLineDash

.Visible = msoTrue

.ForeColor.RGB = RGB(0, 176, 240)

.Transparency = 0

End With

End Sub


По итогу диаграмма будет выглядеть так:

Построение графиков Microsoft Excel, Vba, Плюшка, Длиннопост

Как не трудно понять, данных, по которым построена диаграмма, на листе нет. И после удаления макроса останется только итоговый результат.

Кому то это покажется слишком сложным, однако открою маленький секрет - очень редкие люди пишут макрос с нуля. В 90% достаточно иметь готовый макрос (см листинг выше), заменить в нём пару строк (сменить функции, изменить диапазоны...) и всё. По итогу построение занимает меньше времени чем построение классическим способом.

Такое построение позволит извлечь данные промежуточного расчёта, построить массово однотипные диаграммы и... и дальнейшее применение зависит только от фантазии.

Ну и всегда есть вариант удивить преподавателя (0_о).

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

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения⁠⁠

Итак, мы с вами имели рисунок на бумажке, перевели его в цифру (сняли точки), написали макрос, позволяющий определить значение Y по известным аргументам. В некоторых случаях этого достаточно, однако не всегда. Например для отчёта требуется указать поиск решения в графическом виде, поскольку заказчика "я фсио оцифровал! Вы не пониаити, у меня макрос!" не устраивает. Особенно когда речь идёт о больших деньгах, и проводятся гарантийные испытания с определением поправочных коэффициентов (например.). Или преподаватель в институте будет приятно удивлён красивому графику в курсовом проекте/дипломе.

Итак, по сути потребуется решить два вопроса:

1. Построить ход поиска с помощью стрелки/стрелок.

2. Совместить построенный график с изначальным рисунком.

Т.е. получить что то похожее на вот это:

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

На самом деле нет принципиальной разницы в начале построить поиск решения или в начале совместить рисунок с диаграммой. Но начну с построения, т.к. при этом меньше мусора на рисунках.

Часть 1. Построение поиска решения.

Итак, у нас есть заданные аргументы (G2, t1в) и результат расчёта Р2. На графике сие будет выглядеть как одна точка с координатами X = G2 = 200 (в нашем примере) и Y = Р2 = 0,065

Существуют минимум три метода построения стрелки поиска:

Вариант 1. Для вертикальной и горизонтальной части строим независимые линии.

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

После построения настраиваем цвета, указываем наличие стрелки, и т.д.

Для вертикальной линии второй точкой указывается точка с равным значением по Х и минимумом по бумажному графику Y.

Для горизонтальной линии второй точкой указывается точка с равным значением по Y и минимумом по бумажному графику X.

Минимумы и максимумы диаграммы выставляются равными минимумам и максимумам бумажного рисунка.

Хоть данный вариант и кажется наиболее раздутым, но на практике, когда линий поиска десяток, он наиболее удобен и понятен.


Вариант 2. Единая линия поиска.

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

Выставление значений дополнительных точек, и значений осей аналогично Варианту 1.


Вариант 3. Использование погрешностей для указания поиска решения.

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

Если точка одна, то для отображения линий погрешности необходимо перейти в настройки предела погрешности по Х и по Y поочерёдно и...

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

Отметить

- минус

- без точки

- величина погрешности "пользовательская".

В качестве отрицательной величины погрешности указываем соответственно значение X и Y

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

Если есть желание получить стрелку направленную к оси Y, а ось Х начинается не с 0 (в нашем случае с 2-ти), то потребуется сделать ячейку рассчитывающую смещение относительно 0.

В нашем примере сделаем такое и для X и Y:

ось Х сдвинута на 20. Соответственно имеем ячейку Хзаданное  -  Хсмещения = 200 - 20

ось Y сдвинута на 0,02 Соответственно имеем ячейку Yзаданное - Yсмещения

Это значения не статичны, т.е. они пересчитаются при изменении исходных данных.

При указании отображения погрешностей ссылаемся на данные ячейки.

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

Аналогично первым вариантам указываются свойства линий.

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

Из минусов третьего варианта можно отметить невозможность указания выноски точек около осей, как это делается для первых двух вариантов, т.к. этих точек то и нет фактически на диаграмме.

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

Однако можно сделать выноску для той самой, единственной точки.

Результаты всех трёх способов не сильно отличаются:

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

Часть 2. Совмещение построенного графика с изначальным рисунком.

И опять есть минимум три варианта.

Вариант 1. Использование рисунка в качестве подложки под областью построения (то, что расположено внутри границ осей). Для этого рисунок сначала подготавливается (обрезается по размерам построения, при этом подписи осей оказываются обрезанными), а затем вставляется по пути: Формат области построения – Заливка – Рисунки и текстура – Файл / из буфера обмена;


Вариант 2. Использование рисунка в качестве подложки области диаграммы (вкладка Формат области диаграммы – Заливка – Рисунки и текстура - Файл) вставляется рисунок графика (предварительно подготовленный и очищенный. Необходимо также учитывать, что потребуется некоторая ширина полей для выставления подписей). Совмещаются границы графика Excel с границами графика рисунка перетягиванием за маркеры границы графика (перемещение указал стрелками).

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

выставляются границы осей графика Excel в соответствии с границами графика (если не выставили ранее). При необходимости производится отключение отображения подписей осей, сетка и название диаграммы.

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

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

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

при необходимости можно построить дополнительную линию. В качестве примера построена дополнительная кривая при 40°С при помощи созданной пользовательской функции при заданной температуре 40°С и переменной влажности. Аналогично построена дополнительная линия на первом рисунке

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

Вариант 3. При третьем варианте рисунок вставляется на лист Excel, построенный график/ подготовленная диаграмма размещается над рисунком, при этом заливка поля построения и самой диаграммы "отсутствует" или "прозрачная". После совмещения изображение и диаграмма фиксируются между собой как это было указано в посте "Нестандартные заголовки диаграмм".

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

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

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

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

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

Способ 2 - применение первого варианта, наложение графика на область построения (описано выше). Т.е. строим два независимых графика для левой и правой части, накладываем области построения и размещаем взаимно друг другу до совпадения минимума и максимума.

Способ 3. - пригоден только для расположенных рядом двух диаграмм. Данный способ позволяет избавится от стыка, неизбежно возникающего при первых двух способах. Основано как правило на применении второго варианта описанного выше, а именно использовании рисунка как подложки под диаграммой.

Рассмотрим один из вариантов построения стрелки на диаграмме, состоящей из двух диаграмм, при этом ширина клеток и величина шага для правого и левого графика разная.

Excel. Долгая дорога оцифровки. Часть 9.  Оформление графиков, или отображение поиска решения Microsoft Excel, Vba, Плюшка, Длиннопост

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

Шаг 1. Построение левого графика (синий график, синяя ось, синие данные).

1. Построить точечный график по исходным данным, причём заложить небольшой перехлёст по Х (установлено 80 вместо 70-ти по рисунку);

2. Сделать подложку под диаграмму (используется весь рисунок, без обрезок или разделения на две части);

3. Растянуть область построения на рисунок;

4. Задать значения оси (диапазон) Y в соответствии с оцифровкой;

5. Задать значения оси (диапазон) Х таким образом, чтобы Хмин было равно минимальному значению на рисунке (30), а Хмакс подобрать таким образом, чтобы совпали значения рисок (40=40, 50=50, 60=60, 70=70).

Шаг 2. Построение правого графика (красный график, красный ось, красный данные).

1. Построить точечный график по исходным данным, причём минимум Х заложить равным минимуму по второй оси (0);

2. Указать построение по вспомогательным осям;

3. Задать значения вспомогательной оси (диапазон) Y в соответствии с оцифровкой;

4. Задать значения оси (диапазон) Х таким образом, чтобы Хмакс было равно максимальному значению по второй оси рисунка, а Хмин подбрать таким образом, чтобы начало второго графика легло на минимум второй оси Х рисунка.

Шаг 3. Убрать отображение подписей осей, сетки и т.д. Настроить цвета линий.


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

Для кого то это покажется элементарным, но я на своей практике не один раз ломал голову как выполнить графическое оформление поиска решения. Базовыми знаниями поделился. Всё дальнейшее зависит от вас. Будут вопросы - помогу по мере сил.


Пожалуй на этом закончим и серию Excel. Долгая дорога оцифровки. Всё обещанное показал, а именно:

1. Теория

2. Снятие данных с рисунка

3. Апроксимация простых графиков

4. Макрос по созданию макросов простых функций

5. Создание макроса функции двух аргументов

6. Кусочная интерполяция

7. Макрос по созданию макросов на основе кусочной интерполяции

8. Обратная функция или поиск корней

9. Отображение поиска решения (данный пост).

Показать полностью 14
[моё] Microsoft Excel Vba Плюшка Длиннопост
0
11
bighouse.live
bighouse.live
3 года назад
Серия Оцифровка

Excel. Долгая дорога оцифровки. Часть 8. Обратная функция⁠⁠

Иногда требуется произвести определение значения аргумента (X) в зависимости от известного значения функции (Y).

Excel. Долгая дорога оцифровки. Часть 8. Обратная функция Microsoft Excel, Vba, Плюшка, Длиннопост

Ввиду особенностей оцифровки есть два основных варианта решения данного вопроса

Вариант 1. Если сохранены данные "снятия точек", и зависимость монотонна как на рисунке выше, то самым простым решением является  поменять снятые точки Х и Y и создать новый макрос.


Вариант 2. Решение задачи Y(x) - Yзад = 0, что так же может выполняться разными способами.

Существует множество численных решение данной задачи: метод половинного деления, метод Ньютона, метод... в общем методов достаточно много, и все несложно реализуются, например вот макрос поиска решения Y_ot_X(x) - Yзад = eps. методом половинного деления Где Y_ot_X(x) - известный макрос расчёта простой функции, а eps - точность поиска решения.


Public Function X_po_Y_polovin(Y As Single) As Single

Dim Xmin As Single: Xmin = 0 ' Минимальная граница поиска

Dim Xmax As Single: Xmax = 350 ' Максимальная граница поиска

Dim Xisk As Single ' Переменное значение искомого Х

Dim dX As Single: dX = 0.00001 ' Точность поиска по X

Dim dY As Single: dY = 0.00001 ' Точность поиска по Y

Do While (Xmax - Xmin) > dX

Xisk = (Xmax + Xmin) / 2

If Abs(Y_ot_X(Xisk) - Y) < dY Then Exit Do

If (Y_ot_X(Xmin) - Y) * (Y_ot_X(Xisk) - Y) < 0 Then

Xmax = Xisk

Else

Xmin = Xisk

End If

Loop

X_po_Y_polovin = Xisk

End Function


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

Вот так выглядит макрос выполняющий поиск решения при помощи метода половинного деления для функции 2-х аргументов.

' НТД ТЭЦ12 ПТ9 Диаграмма режимов 2ст.режим нижний график

' Определение Nф по N и Qт

Public Function НТД_ТЭЦ12_ПТ9_ПТ2_QпМАКС(Nф As Single, Qт As Single) As Single

Dim Xmin As Single: Xmin = 0# ' Минимальная граница поиска

Dim Xmax As Single: Xmax = 200# ' Максимальная граница поиска

Dim Xisk As Single ' Переменное значение искомого Х

Dim dX As Single: dX = 0.001 ' Точность поиска по X

Dim dY As Single: dY = 0.001 ' Точность поиска по Y

' Обязательно проверка выхода за границы.

If Qт > НТД_ТЭЦ12_ПТ9_ПТ2_GтпоNфQпмакс(Nф, 0) Then

НТД_ТЭЦ12_ПТ9_ПТ2_QпМАКС = 0

Else

Do While (Xmax - Xmin) > dX

Xisk = (Xmax + Xmin) / 2

If Abs(НТД_ТЭЦ12_ПТ9_ПТ2_GтпоNфQпмакс(Nф, Xisk) - Qт) < dY Then Exit Do

If (НТД_ТЭЦ12_ПТ9_ПТ2_GтпоNфQпмакс(Nф, Xmin) - Qт) * (НТД_ТЭЦ12_ПТ9_ПТ2_GтпоNфQпмакс(Nф, Xisk) - Qт) < 0 Then

Xmax = Xisk

Else

Xmin = Xisk

End If

НТД_ТЭЦ12_ПТ9_ПТ2_QпМАКС = Xisk

Loop

End If

End Function

Рассмотрим диаграмму зависимости от двух аргументов Qт = f(Nт, Qтmax). И наша задача определить значение Qтmax при известных Qт и Nт. Макрос поиска с помощью половинного деления приведён выше.

Excel. Долгая дорога оцифровки. Часть 8. Обратная функция Microsoft Excel, Vba, Плюшка, Длиннопост

И вот тут начинается особенность оцифровки - мы можем с уверенностью сказать и проверить значение функции только в области представленного графика. Т.е. проще говоря - данных о значениях при Qпmax = 120 и Nт < 39 у нас нет. В этой зоне имеет место экстраполяция данных, и как поведёт функция при экстраполяции зависит от того как мы провели оцифровку. В данном случае (данной номограммы) особого влияния может и не будет, но есть варианты, что экстраполированная с помощью  полинома функция искривиться и значение при Qпmax = 120 и Nт = 20 будет больше чем при Qпmax = 0 и Nт = 20. Т.е. и метод половинного деления отработает не верно.

Поэтому два простых правила:

1. При проведении оцифровки внимательно относитесь к экстраполяции. В идеале - кусочная интерполяция с использованием линейной интерполяции для начала и окончания графика.

2. Если расчётов мало - используйте метод перебора.


Public Function X_po_Y_perebor(Y As Single) As Single

Dim Xmin As Single: Xmin = 0 ' Минимальная граница поиска

Dim Xmax As Single: Xmax = 350 ' Максимальная граница поиска

Dim dX As Single: dX = 0.001 ' Шаг поиска

Dim dY As Single: dY = 0.00001 ' Точность поиска

Dim Xisk As Single ' Переменное значение искомого Х

For Xisk = Xmin To Xmax Step dX

If Abs(Y_ot_X(Xisk) - Y) < dY Then

X_po_Y_perebor = Xisk

Exit For

Else

X_po_Y_perebor = 0

End If

Next Xisk

End Function


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


Пример перебора для функции двух аргументов

fun_TEC25_PT60_Prez_G0poGsd(N, i) - известная ф-я поиска Gо по N и Gsd

G0 - известно

N - известно

Gsd - требуется найти

For i = 0 To 300 Step 0.01 - ищу от 0 до 300 с шагом 0,01

< 0.1 - достаточная (для примера) точность поиска.


Public Function fun_TEC25_PT60_Prez_Gsd_poG0N(G0 As Single, N As Single) As Single

Dim i As Single

fun_TEC25_PT60_Prez_Gsd_poG0N = 0 'Если решение не будет найдено - будет выведен 0

For i = 0 To 300 Step 0.01

If Abs(fun_TEC25_PT60_Prez_G0poGsd(N, i) - G0) < 0.1 Then

fun_TEC25_PT60_Prez_Gsd_poG0N = i

Exit For

End If

Next i

End Function

Поиск всех корней уравнения, заданного таблично

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

Excel. Долгая дорога оцифровки. Часть 8. Обратная функция Microsoft Excel, Vba, Плюшка, Длиннопост

Option Base 1 ' Иначе смотреть корень с второго элемента

Function РешенУравн(МассивX, МассивY)

' Возвращает корень(корни) уравнения Y(X) = 0

' МассивX - монотонно или возрастает, или убывает

Dim Xs() As Double, Ys() As Double, XEs() As Double, Num, N As Long, M As Long, K As Long

МассивX = МассивX

МассивY = МассивY

ReDim Xs(2 ^ 10), Ys(2 ^ 10), XEs(2 ^ 8)

For Each Num In МассивX

K = K + 1: Xs(K) = Num

Next

N = K: K = 0

For Each Num In МассивY

K = K + 1: Ys(K) = Num

Next

If K <> N Then Exit Function' если длина МассивY <> длине МассивX

For K = 1 To N - 1

If Ys(K) = 0 Then

M = M + 1: XEs(M) = Xs(K)

Else

If Ys(K) * Ys(K + 1) < 0 Then

M = M + 1

XEs(M) = (Ys(K) * Xs(K + 1) - Xs(K) * Ys(K + 1)) / _

(Ys(K) - Ys(K + 1))

End If

End If

Next

If K = N Then

If Ys(N) = 0 Then

M = M + 1: XEs(M) = Xs(N)

End If

End If

If M = 1 Then

РешенУравн = XEs(1)

ElseIf M > 1 Then

ReDim Preserve XEs(M) ' если корней несколько - массив

РешенУравн = WorksheetFunction.Transpose(XEs)

Else ' корней в диапазоне МассивX нет

РешенУравн = CVErr(xlErrNA)

End If

Exit Function

End Function 'РешенУравн'


Макрос не мой. Взят из открытых источников на просторах интернета, но первоисточник у меня не сохранился (к моему огорчению - стараюсь всегда указывать авторов).


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

dixi

За сим тему оцифровки считаю на 80% закрытой. Всегда есть то, что относится к конкретной работе, и не всегда подлежит огласке. Если будут вопросы - постараюсь ответить. В меру знаний естественно.


Для тех кто считает что "не надо изобретать велосипед" - прошу привести примеры подобного в свободном бесплатном доступе. Я знаю (встречался) с платными надстройками, о бесплатных не в курсе. Буду рад расширить кругозор.


Тех кто считает что "надо пользоваться пайтоном/матлабом/маткадом/... Ибо там всё есть и проще" хочу огорчить - придя на работу у Вас не всегда есть эти мат.пакеты. Вы не всегда имеете возможность их установки (хоть лицензия, хоть пиратка, хоть триал). Просто запрет компании. И при этом задача должна быть решена. И решена ни один или два раза. Вы можете распечатать и ползать с карандашом и линейкой по диаграммам. А можете перевести в цифру. Как показала практика - оцифровка вполне реализуется, и на 100% работа может быть выполнена в Excel. Без дополнительных надстроек. И даже если Вы решили задачу на своём, личном компе - остаётся вопрос передачи расчёта заказчику, или в вышестоящую инстанцию.



Ну а в следующий раз будем строить стрелочки на рисунках :)

Показать полностью 2
[моё] Microsoft Excel Vba Плюшка Длиннопост
8
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии