Как применяется VBA для построения диаграмм в Excel

Содержание

Методы объекта Chart

Диаграммы можно размещать на рабочем листе. Для этого используется коллекция chartobjects. Ее элементы - объекты класса chartobject - являются контейнерами, содержащими объект Chart, задающий непосредственно диаграмму.

Рассмотрим основные методы, определяющие новое поведение объекта Chart:

SubChartWizard ([Source], [Gallery], [Format], [PlotBy], [CategoryLabels], [SeriesLabels], [HasLegend], [Title], [CategoryTitle], [ValueTitle], [Extra-Title])

Этот метод позволяет построить или модифицировать существующую диаграмму. В отличие от мастера диаграмм (ChartWizard), который вызывается при построении диаграммы вручную, метод не является интерактивным, более того, он не позволяет задать все возможные свойства. С его помощью можно выполнить основную работу, а детали строятся с использованием других свойств и методов объекта Chart. Все параметры метода являются необязательными:

Sub SetSourceData (source as range, [plotby]). Устанавливает источник данных диаграммы. Второй параметр соответствует терминальному свойству plotby.

SubApplyCustomType (ChartTypeAsXlChartType, [typename]). Метод позволяет модифицировать диаграмму, применив к ней новый тип - стандартный или настраиваемый. Если этот тип стандартный, то тогда первый параметр полностью его определяет. Его возможные значения совпадают со значениями соответствующего терминального свойства charttype. Если же тип настраиваемый, то первый параметр должен иметь одно из следующих значений: xlbuiltin, xluserdefined или xlanygallery. В этом случае второй параметр задает имя типа диаграммы.

Function Export (filename as string, [filtername], [interactive]) as boolean позволяет экспортировать диаграмму, преобразуя ее в графический формат. Первый параметр задает имя файла, в который будет записана диаграмма в графическом формате, второй - задает имя графического фильтра в том виде, как оно записано в системном регистре. Булев параметр interactive должен иметь значение true, если мы хотим вызвать диалоговое окно в процессе фильтрации. Функция export возвращает значение true в случае успешного завершения работы.

Sub GetChartElement (x as long, y as long, elementid as long, argl as long, arg2 as long). Представьте себе, что пользователь щелкнул кнопку мыши где-то над диаграммой. Обработав это событие, можно получить координаты курсора мыши - x и y. Если теперь вызвать метод getchartelement с этими координатами, то он вернет значение параметра elementid - идентификатор элемента диаграммы и значения двух параметров, связанных с этим элементом. Конечно, параметры зависят от типа того элемента, чьи координаты x и y заданы.

Function Location (where as xlchartlocation, [name]) as Chart. Передвигает диаграмму в новое местоположение. Параметр Where имеет следующие значения: xlLocationAsNewSheet, xlLocationAsObject или xlLocationAutomatic.

В первом случае диаграмма помещается на новый лист диаграммы и параметр Name задает имя этого листа. Во втором случае диаграмма помещается как встроенный объект и Name задает имя рабочего листа.

Создание VBA программы

Пример.

По введенным в диалоговое окно «Построение графика» начальным, конечным значениям аргументов и их шагам изменения строится график. Уравнение графика также вводится в программу из диалогового окна. Уравнение должно быть составлено в соответствии с правилами, по которым строятся функции рабочего листа, но в качестве аргументов в нем следует использовать х вместо ссылки на ячейку. Программа сама переведет аргумент в ссылку на ячейку. После табуляции введенной функции программой и построения поверхности на рабочем листе этот график также отображается в объекте управления Image, расположенном в диалоговом окне Построение графика.

Технология выполнения

Обсудим, как приведенная ниже программа решает описанную задачу и что происходит в ней.

Диалоговое окно «Построение графика» в рабочем состоянии

Диалоговое окно «Построение графика» в рабочем состоянии

Результат построения графика на рабочем листе

Результат построения графика на рабочем листе

UserForm_Initialize

Нажатие кнопки Построение запускает на выполнение процедуру CommandButton 1__ C 1 ick

Пример сообщения о несогласованности данных

Пример сообщения о несогласованности данных

Сообщение о некорректном вводе формулы

Сообщение о некорректном вводе формулы

Нажатие кнопки Отмена запускает на выполнение процедуру CommandButton 2_ C 1 ick

Закрывает диалоговое окно.

Рассмотрим листинг данного приложения.

Private Sub CommandButton1_Click()

// Процедура табуляции функции

Dim х_нз As Double

Dim х_пз As Double

Dim х_шаг As Double

Dim УрГрафика As String

Dim nx As Integer

// nx - число протабулированных значений аргумента х

Dim n As Integer

Dim i As Integer

// n, i - вспомогательные целые переменные

// Проверка корректности ввода данных

If IsNumeric(TextBox2.Text)=False Then

MsgBox «Ошибка в начальном значении х», vbInformation, «График»

TextBox2.SetFocus

Exit Sub

End If

If IsNumeric(TextBox3.Text)=False Then

MsgBox «Ошибка в шаге х», vbInformation, «График»

TextBox3.SetFocus

Exit Sub

End If

If IsNumeric(TextBox4.Text)=False Then

MsgBox «Ошибка в конечном значении у», vbInformation, «График»

TextBox4.SetFocus

Exit Sub

End If

// Считывание с диалогового окна значений переменных

х_нз=CDbl(TextBox2.Text)

х_шаг=CDbl(TextBox3.Text)

х_пз=CDbl(TextBox4.Text)

УрГрафика=Trim(TextBox1.Text)

// Проверка согласованности введенных данных

If х_нз >= х_пз Then

MsgBox «Начальное значение х слишком большое», vbInformation, «График»

TextBox2.SetFocus

Exit Sub

End If

If х_нз + х_шаг >= х_пз Then

MsgBox «Шаг х великоват», vbInformation, «График»

TextBox3.SetFocus

Exit Sub

End If

// Замена в введенной формуле аргумента х на ссылку $A1

i=1

Do

// Замена в введенной формуле аргумента х на ссылку $A1

If Mid(УрГрафика, i, 1)=«x» Or Mid(УрГрафика, i, 1)=«X» Then

n=Len(УрГрафика)

If (1 < i) And (i < n) Then

УрГрафика=Left(УрГрафика, i - 1) & «$A1» & Right(УрГрафика, n - i)

End If

If i=1 Then

УрГрафика=«$A1» & Right(УрГрафика, n - 1)

End If

If i=n Then

УрГрафика=Left(УрГрафика, n - 1) & «$A1»

End If

End If

i=i + 1

Loop While i <= Len(УрГрафика)

ActiveSheet.Cells.Select

Selection.Clear

// Очистка на активном листе ранее введенных данных

ActiveSheet.Range(«A1»).Select

// Заполнение диапазонов значениями аргумента

With ActiveSheet

Range(«A1»).Value=х_нз 'Ввод в ячейку A1 начального значения

// Создание арифметической прогрессии по столбцу с указанным шагом и начальным значением

Range(«A1»).DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=х_шаг, Stop:=х_пз, Trend:=False

End With

// Заполнение диапазона значениями функции

With ActiveSheet

nx=Range(«A1»).CurrentRegion.Rows.Count

// Определение числа строк в диапазоне заполнения

Range(«B1»).FormulaLocal=УрГрафика

// Ввод уравнения поверхности в ячейку B1

If IsError(Evaluate(УрГрафика))=True Then

MsgBox «Ошибка в формуле», vbExclamation, «График»

Exit Sub

End If

// Заполнение диапазона Range(Cells(1, 2), Cells(nx, 2))

// начиная с ячейки B1, что эквивалентно протаскиванию маркера

// заполнения ячейки B 1 на диапазон Range (Cells (1, 2),

Cells(nx, 2))

Range(«B1»).AutoFill Destination:=Range(Cells(1, 2), Cells(nx, 2)), Type:=xlFillDefault

End With

ActiveSheet.ChartObjects.Delete

// Удаление с рабочего листа всех ранее построенных диаграмм

ActiveSheet.Range(Cells(1, 2), Cells(nx, 2)).Select

// Выбор диапазона, по которому строится график

ActiveSheet.ChartObjects.Add(20, 19.5, 192, 192).Select

// Задание и выбор области на рабочем листе, где будет построен график,

// размер графика должен соответствовать размеру объекта Image 1

Application.CutCopyMode=False

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

ActiveChart.ChartWizard Source:=Range(Cells(1, 1), Cells(nx, 2)), Gallery:=xlLine, Format:=2, PlotBy:=xlColumns, CategoryLabels:=1, SeriesLabels:=0, HasLegend:=False, Title:="График",

CategoryTitle:="Аргумент", ValueTitle:="Функция y" & TextBox1.Text

ActiveSheet.ChartObjects(1).Activate

ActiveChart.Axes(xlValue).AxisTitle.Select

With Selection

HorizontalAlignment=xlCenter

VerticalAlignment=xlCenter

Orientation=xlUpward

End With

// Запись диаграммы в файл и загрузка картинки в Image1

ActiveChart.Export Filename:="Graph.jpg",

FilterName:="JPEG"

UserForm1.Image1.Picture=LoadPicture(«graph.jpg»)

ActiveSheet.Range(«A1»).Select

End Sub

Private Sub CommandButton2 Click()

// Процедура закрытия диалогового окна

UserForm1.Hide

End Sub

Private Sub UserForm Initialize()

// Рисунок масштабируется с учетом относительных размеров так, чтобы он помещался в объекте Image1

With Image1

PictureAlignment=fmPictureAlignmentTopLeft

PictureSizeMode=fmPictureSizeModeStretch

End With

End Sub