Did you know that you can do graphic related things using vba. Yes you can develop codes to create or modify shapes available in Microsoft Excel. So let’s see how we can create a straight line. What you need to do is you need to give x and y coordinates of the start and end of the line. Consider that the upper left corner of the document as (0,0) point. And you need to give the locations in points.
Sub DrawLine_Example1()
ActiveSheet.Shapes.AddLine 0, 0, 250, 250
End Sub
If you run above macro you will get following result.
So the first two values are x and y coordinates of the starting point respectively. and next two values are x and y coordinates of end point. And here is another example
Sub DrawLine_Example2()
ActiveSheet.Shapes.AddLine 20, 100, 100, 45
End Sub
It will create line like this.
Now let’s look at little advanced scenario. Assume you need to create a line between following two points.
So how we do that because we don’t know exact x,y coordinates of those two points. Fortunately we can give start and end points from cell locations as well. So we can create the line using following code.
Sub DrawLine_Example3()
Dim BeginX As Long
Dim BeginY As Long
Dim EndX As Long
Dim EndY As Long
With Range(«B5»)
BeginX = .Left + .Width
BeginY = .Top + .Height / 2
End With
With Range(«G9»)
EndX = .Left
EndY = .Top + .Height / 2
End With
ActiveSheet.Shapes.AddLine BeginX, BeginY, EndX, EndY
End Sub
In the above code starting point is given by following part.
With Range(«B5»)
BeginX = .Left + .Width
BeginY = .Top + .Height / 2
End With
And end point is given by these 4 lines.
With Range(«G9»)
EndX = .Left
EndY = .Top + .Height / 2
End With
Also you can replace
With Range(«B5»)
BeginX = .Left + .Width
BeginY = .Top + .Height / 2
End With
With following code. Then you don’t need width for the calculations.
With Range(«C5»)
BeginX = .Left
BeginY = .Top + .Height / 2
End With
With VBA you can not only create lines but also create any other shapes you need.
На следующем шаге мы остановимся на объекте Shape .
Источник
Метод Shapes.AddLine (Excel)
При использовании к объекту Shapes возвращает объект Shape , представляющий новую строку на листе.
Синтаксис
expression. AddLine (Beginx, Beginy, Endx, Endy)
выражение: переменная, представляющая объект Shapes.
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
BeginX | Обязательный | Single | Позиция (в точках) начальной точки строки относительно левого верхнего угла документа. |
Beginy | Обязательный | Single | Позиция (в точках) начальной точки строки относительно левого верхнего угла документа. |
EndX | Обязательный | Single | Положение (в точках) конечной точки строки относительно левого верхнего угла документа. |
Endy | Обязательный | Single | Положение (в точках) конечной точки строки относительно левого верхнего угла документа. |
Возвращаемое значение
Shape
Пример
В этом примере в myDocument добавляется синяя пунктирная линия.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Объект Shape (Excel)
Представляет объект в слое рисования, например автофигуру, свободную форму, объект OLE или рисунок.
Замечания
Объект Shape является членом коллекции Shapes . Коллекция Shapes содержит все фигуры в книге.
Есть три объекта, которые представляют фигуры: коллекция Shapes , которая представляет все фигуры в книге; коллекция ShapeRange , представляющая указанное подмножество фигур в книге (например, объект ShapeRange может представлять фигуры одной и четырех в книге или может представлять все выбранные фигуры в книге); и объект Shape , представляющий одну фигуру на листе. Если вы хотите работать с несколькими фигурами одновременно или с фигурами в выделенном фрагменте, используйте коллекцию ShapeRange .
Чтобы вернуться. | Использовать. |
---|---|
Объект Shape , представляющий одну из фигур, присоединенных соединителем | Свойство BeginConnectedShape или EndConnectedShape объекта ConnectorFormat . |
Только что созданная свободная форма | Методы BuildFreeform и AddNodes определяют геометрию новой свободной формы и используют метод ConvertToShape для создания свободной формы и возврата объекта Shape , представляющего ее. |
Объект Shape , представляющий одну фигуру в сгруппированной фигуре | GroupItems (index), где индекс — это имя фигуры или номер индекса в группе. |
Вновь сформированная группа фигур | Метод Group или Regroup объекта ShapeRange для группировки диапазона фигур и возврата одного объекта Shape , представляющего только что сформированную группу. После формирования группы вы можете работать с ней так же, как с любой другой фигурой. |
Объект Shape , представляющий существующую фигуру | Фигуры (индекс), где индекс — это имя фигуры или номер индекса. |
Объект Shape , представляющий фигуру в выделенном фрагменте | Выделение. ShapeRange (index), где индекс — это имя фигуры или номер индекса. |
Пример
В следующем примере по горизонтали фигура 1 и фигура с именем Rectangle 1 в myDocument.
Каждой фигуре присваивается имя по умолчанию при ее добавлении в коллекцию Фигуры . Чтобы придать фигуре более понятное имя, используйте свойство Name . В следующем примере в myDocument добавляется прямоугольник, ему присваивается имя Красный квадрат, а затем задается цвет переднего плана и стиль линии.
В следующем примере задается заливка для первой фигуры в выделенном окне в активном окне, при условии, что в выделенном фрагменте есть по крайней мере одна фигура.
Методы
Свойства
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
VBA Excel. Работа с фигурами (Shapes)
Работа с фигурами в VBA Excel: создание фигур методом Shapes.AddShape, типы фигур (MsoAutoShapeType), обращение к фигурам и изменение их свойств. Примеры.
Объекты для работы с фигурами
Фигуры в VBA Excel представлены тремя объектами:
Объект | Описание |
---|---|
Shapes | Коллекция всех фигур на рабочем листе. Используется для создания новых фигур, для обращения к одной фигуре по имени и для перебора фигур циклом. |
ShapeRange | Коллекция нескольких фигур, аргументом которой является массив имен выбранных объектов. Используется для редактирования сразу всех фигур, входящих в эту коллекцию. |
Shape | Объект, представляющий одну фигуру. Используется для редактирования одной этой фигуры. |
Создание фигур в VBA Excel
Фигуры в VBA Excel создаются методом Shapes.AddShape.
Синтаксис метода AddShape
Shapes — выражение, возвращающее коллекцию фигур на рабочем листе, например: ActiveSheet.Shapes.
Параметры метода AddShape
Параметр | Описание |
---|---|
Type | Константа из коллекции MsoAutoShapeType, определяющая тип создаваемой фигуры. |
Left | Расстояние от левой границы фигуры до левой границы табличной части рабочего листа в пунктах.. Тип данных — Single. |
Top | Расстояние от верхней границы фигуры до верхней границы табличной части рабочего листа в пунктах.. Тип данных — Single. |
Width | Ширина фигуры по внешним границам в пунктах. |
Height | Высота фигуры по внешним границам в пунктах. |
Все параметры метода Shapes.AddShape являются обязательными.
Константы MsoAutoShapeType
Константы коллекции MsoAutoShapeType, определяющие основные типы создаваемых фигур:
Константа | Значение | Тип фигуры |
---|---|---|
msoShapeRectangle | 1 | Прямоугольник |
msoShapeParallelogram | 2 | Параллелограмм |
msoShapeTrapezoid | 3 | Трапеция |
msoShapeDiamond | 4 | Ромб |
msoShapeRoundedRectangle | 5 | Прямоугольник: скругленные углы |
msoShapeOctagon | 6 | Восьмиугольник (октаэдр) |
msoShapeIsoscelesTriangle | 7 | Равнобедренный треугольник |
msoShapeRightTriangle | 8 | Прямоугольный треугольник |
msoShapeOval | 9 | Овал |
msoShapeHexagon | 10 | Шестиугольник (гексаэдр) |
msoShapeCross | 11 | Крест |
msoShapeRegularPentagon | 12 | Пятиугольник (пентаэдр) |
msoShapeCan | 13 | Цилиндр |
msoShapeCube | 14 | Куб |
msoShapeDonut | 18 | Круг: прозрачная заливка (кольцо) |
msoShapeLightningBolt | 22 | Молния |
msoShapeSun | 23 | Солнце |
msoShapeMoon | 24 | Месяц (луна) |
msoShape5pointStar | 92 | Звезда: 5 точек (пятиконечная) |
msoShapeCloud | 179 | Облако |
Все доступные константы из коллекции MsoAutoShapeType смотрите на сайте разработчиков.
Создание объекта ShapeRange
Создание коллекции ShapeRange из выбранных фигур:
Источник
Shapes object (Excel)
A collection of all the Shape objects on the specified sheet.
Remarks
Each Shape object represents an object in the drawing layer, such as an AutoShape, freeform, OLE object, or picture.
If you want to work with a subset of the shapes on a document—for example, to do something to only the AutoShapes on the document or to only the selected shapes—you must construct a ShapeRange collection that contains the shapes that you want to work with.
Example
Use the Shapes property of the Worksheet object to return the Shapes collection. The following example selects all the shapes on myDocument.
If you want to do something (like delete or set a property) to all the shapes on a sheet at the same time, select all the shapes, and then use the ShapeRange property on the selection to create a ShapeRange object that contains all the shapes on the sheet, and then apply the appropriate property or method to the ShapeRange object.
Use Shapes (index), where index is the shape’s name or index number, to return a single Shape object. The following example sets the fill to a preset shade for shape one on myDocument.
Use Range (index), where index is the shape’s name or index number or an array of shape names or index numbers, to return a ShapeRange collection that represents a subset of the Shapes collection. The following example sets the fill pattern for shapes one and three on myDocument.
An ActiveX control on a sheet has two names: the name of the shape that contains the control, which you can see in the Name box when you view the sheet, and the code name for the control, which you can see in the cell to the right of (Name) in the Properties window. When you first add a control to a sheet, the shape name and code name match. However, if you change either the shape name or code name, the other isn’t automatically changed to match.
You use the code name of a control in the names of its event procedures. However, when you return a control from the Shapes or OLEObjects collection for a sheet, you must use the shape name, not the code name, to refer to the control by name. For example, assume that you add a check box to a sheet and that both the default shape name and the default code name are CheckBox1. If you then change the control code name by typing chkFinished next to (Name) in the Properties window, you must use chkFinished in event procedures names, but you still have to use CheckBox1 to return the control from the Shapes or OLEObject collection, as shown in the following example.
Methods
Properties
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Источник
Adblock
detector
4 / 4 / 1 Регистрация: 21.05.2012 Сообщений: 12 |
|
18.06.2012, 14:12 |
7 |
Сообщение было отмечено как решение Решение Если вы хотите нарисовать линию на форме, то значит, что вы, уже, применяете редактор VBA. Используйте элемент управления Frame Control, либо LabelControl, вставив в окно формы UserForm. Они наименее громоздкие с точки зрения потребления оперативной памяти. Воспользуйтесь окном свойств для настройки данных элементов. Следует установить соответствующее значение свойства Height (если нужна верстикальная линия) или Width (если горизонтальная), чтобы установить необходимую толщину линии. Также нужно установить свойства Caption для указанных элементов равными пустой строке «».
3 |
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
#1 17 июля 2002г. 05:20:55
- Миша
- Восстановленный участник
- На форуме с 31 декабря 2001г.
- Сообщений: 322
- Спасибо: 0
Тема: Можно ли рисовать линии на формах UserForm в VBA?
Имеется древняя проблема с отрисовкой линий окружностей и эллипсов на формах UserForm в VBA. На формах Visual Basic с отрисовкой этих примитивов нет никаких проблем, а на формах VBA они не рисуются. Что можно использовать чтобы начертить простые пояснительно-контрольные схемы расчётов на формах VBA?
#2 Ответ от Александр 19 июля 2002г. 18:13:56
- Александр
- Восстановленный участник
- На форуме с 7 июля 2002г.
- Сообщений: 13
- Спасибо: 3
Re: Можно ли рисовать линии на формах UserForm в VBA?
Public Type POINTAPI
x As Long
y As Long
End Type
Public Declare Function MoveToEx Lib «gdi32» (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
Public Declare Function LineTo Lib «gdi32» (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
‘———————————
Private Sub Form_Paint()
Dim oldPoint As POINTAPI
MoveToEx Form1.hdc, 0, 50, oldPoint
LineTo Form1.hdc, 200, 50
End Sub
Это то, что тебе надо?
Спасибо сказали: AkimovMB51
#3 Ответ от Александр 19 июля 2002г. 21:22:32
- Александр
- Восстановленный участник
- На форуме с 7 июля 2002г.
- Сообщений: 13
- Спасибо: 3
Re: Можно ли рисовать линии на формах UserForm в VBA?
А вот ещё один вариант!
Public Declare Function GetDC Lib «user32» (ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib «user32» (ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Declare Function FindWindow Lib «user32» Alias «FindWindowA» (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function Ellipse Lib «gdi32» (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
»»»»»»»»»»»»»»»»»»»»»’
Private Sub UserForm_Click()
Dim hwnd As Long, hdc As Long
hwnd = FindWindow(vbNullString, UserForm1.Caption)
hdc = GetDC(hwnd)
Ellipse hdc, 50, 50, 150, 100
ReleaseDC hwnd, hdc
End Sub
Спасибо сказали: AkimovMB51
#4 Ответ от Миша 23 июля 2002г. 07:52:25
- Миша
- Восстановленный участник
- На форуме с 31 декабря 2001г.
- Сообщений: 322
- Спасибо: 0
Re: Можно ли рисовать линии на формах UserForm в VBA?
Спасибо за програмки! Обязательно попробую их применить.
А не подскажите ли Вы где можно взять билиотеку DLL с функциями для вычислений произведения, обращения, транспонирования матриц и решения систем линеёных уравнений, которую можно подключить к VBA и использовать её функции в программах? Например для MathCAD2001 есть пакет Numeric Recipes в котором есть замечательная функция gaussjSolve(A,b), а в самом MathCAD2001 есть функция lsolve(M,v) но как ими воспользоваться в программе VBA не знаю.
Пробовал сам писать функции для решения СЛАУ методом Гаусса (и даже написал функцию для решения СЛАУ с диагональной матрицей) но они или работают медленно или в точности и надёжности их решений у меня нет уверенности.
Помогите найти надёжный, быстрый и проверенный пакет или библиотеку для решения СЛАУ пожалуйста!
#5 Ответ от Александр 23 июля 2002г. 13:10:58
- Александр
- Восстановленный участник
- На форуме с 7 июля 2002г.
- Сообщений: 13
- Спасибо: 3
Re: Можно ли рисовать линии на формах UserForm в VBA?
Вообще-то сам я программирую на С++ и не смогу тебе помочь с алгоритмами в VB :(((
А вот тебе наиболее полный код для рисования в VBA:
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
‘код для модуля:
Public Declare Function GetDC Lib «user32» (ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib «user32» (ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Declare Function FindWindow Lib «user32» Alias «FindWindowA» (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function Ellipse Lib «gdi32» (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function SetBkMode Lib «gdi32» (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Public Declare Function TextOut Lib «gdi32» Alias «TextOutA» (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Public Declare Function SelectObject Lib «gdi32» (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Type LOGBRUSH
lbStyle As Long
lbColor As Long
lbHatch As Long
End Type
Public Declare Function CreateBrushIndirect Lib «gdi32» (lpLogBrush As LOGBRUSH) As Long
Public Declare Function CreatePen Lib «gdi32» (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Public Declare Function DeleteObject Lib «gdi32» (ByVal hObject As Long) As Long
Public Declare Function SetTextColor Lib «gdi32» (ByVal hdc As Long, ByVal crColor As Long) As Long
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
‘код для формы:
Private Sub UserForm_Click()
Dim hwnd As Long, hdc As Long, oldBkMode As Long
Dim lbBrush As LOGBRUSH
Dim hBrush As Long, hOldBrush As Long
Dim hPen As Long, hOldPen As Long
Dim crOldTextColor As Long
hwnd = FindWindow(vbNullString, UserForm1.Caption)
hdc = GetDC(hwnd)
oldBkMode = SetBkMode(hdc, 1) ‘TRANSPARENT = 1, OPAQUE = 2
lbBrush.lbStyle = 0 ‘BS_SOLID = 0
lbBrush.lbColor = RGB(255, 0, 0)
lbBrush.lbHatch = 3 ‘HS_BDIAGONAL = 3
hBrush = CreateBrushIndirect(lbBrush)
hOldBrush = SelectObject(hdc, hBrush)
hPen = CreatePen(0, 1, RGB(0, 0, 255)) ‘PS_SOLID = 0, PS_DASH = 1
hOldPen = SelectObject(hdc, hPen)
crOldTextColor = SetTextColor(hdc, RGB(0, 150, 0))
»»»»»»»»»»»»
‘Здесь рисуй с hdc (draw here with hdc):
Ellipse hdc, 50, 50, 150, 100
Ellipse hdc, 60, 90, 160, 140
TextOut hdc, 50, 25, «Hello!», 6
»»»»»»»»»»»»
SetBkMode hdc, oldBkMode
SelectObject hdc, hOldBrush
DeleteObject hBrush
SelectObject hdc, hOldPen
DeleteObject hPen
SetTextColor hdc, crOldTextColor
ReleaseDC hwnd, hdc
End Sub
Спасибо сказали: AkimovMB51
#6 Ответ от Александр 23 июля 2002г. 15:06:56
- Александр
- Восстановленный участник
- На форуме с 7 июля 2002г.
- Сообщений: 13
- Спасибо: 3
Re: Можно ли рисовать линии на формах UserForm в VBA?
Дело в том что в VBA нет события соответствующего WM_PAINT, поэтому функциями GUI рисовать практически бесполезно, все пропадет после перекрытия окна, когда оно снова станет видимым, все что нарисовано функциями GUI не восстановится.
Александр, но не тот
#7 Ответ от Александр 24 июля 2002г. 13:27:49
- Александр
- Восстановленный участник
- На форуме с 7 июля 2002г.
- Сообщений: 13
- Спасибо: 3
Re: Можно ли рисовать линии на формах UserForm в VBA?
«Не тот» Александр не совсем прав!
В VBA действительно нет обработчика сообщения WM_PAINT , но его можно сделать самому … —
установить hook! Смотрите как это сделать
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»’
‘код для модуля:
Public Declare Function GetDC Lib «user32» (ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib «user32» (ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Declare Function FindWindow Lib «user32» Alias «FindWindowA» (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function Ellipse Lib «gdi32» (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function SetWindowsHookEx Lib «user32» Alias «SetWindowsHookExA» (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib «user32» (ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib «user32» (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function GetWindowThreadProcessId Lib «user32» (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Public hwnd As Long, hHook As Long
Public Function CBTProc(ByVal ncode As Long, ByVal wParam As Long, lParam As Variant) As Long
UserForm_Paint hwnd
CBTProc = CallNextHookEx(hHook, ncode, wParam, lParam)
End Function
Public Sub UserForm_Paint(hw As Long)
Dim hdc As Long
hdc = GetDC(hw)
Ellipse hdc, 50, 50, 150, 100
ReleaseDC hw, hdc
End Sub
Public Sub RunMyProgram()
UserForm1.Show
End Sub
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»’
‘код для формы:
Private Sub UserForm_Initialize()
hwnd = FindWindow(vbNullString, UserForm1.Caption)
hHook = SetWindowsHookEx(5, AddressOf CBTProc, 0, GetWindowThreadProcessId(hwnd, vbNull)) ‘WH_CBT = 5
End Sub
Private Sub UserForm_Terminate()
UnhookWindowsHookEx hHook
End Sub
#8 Ответ от Milz 10 октября 2002г. 15:02:27
- Milz
- Восстановленный участник
- На форуме с 1 октября 2002г.
- Сообщений: 7
- Спасибо: 0
Re: Можно ли рисовать линии на формах UserForm в VBA?
А их обязательно рисовать програмно? Может достаточно управлять видимостью картинок, которые ты нарисуешь в каком-нить граф. редакторе и навставляешь в форму?
#9 Ответ от Vladimir 11 октября 2002г. 17:15:48
- Vladimir
- Восстановленный участник
- На форуме с 3 сентября 2002г.
- Сообщений: 30
- Спасибо: 0
Re: Можно ли рисовать линии на формах UserForm в VBA?
многое я видал… но чтобы в вижуал бейсике хук создавали…..
#10 Ответ от Александр 21 октября 2002г. 14:48:17
- Александр
- Восстановленный участник
- На форуме с 7 июля 2002г.
- Сообщений: 13
- Спасибо: 3
Re: Можно ли рисовать линии на формах UserForm в VBA?
Пути господни неисповедимы
#11 Ответ от AkimovMB5 12 февраля 2023г. 16:08:28
- AkimovMB5
- Участник
- На форуме с 10 декабря 2021г.
- Сообщений: 5
- Спасибо: 0
Re: Можно ли рисовать линии на формах UserForm в VBA?
Александр пишет:
MoveToEx Form1.hdc, 0, 50, oldPoint
Сделал программу для черчения на форме UserForm в VBA Excel. Объясните пожалуйста, почему не работает метод MoveToEx и все линии чертятся из начальной точки 0,0?
И ещё: как вызвать перерисовку формы, чтобы показать черчение линии на форме в «динамике»? То есть пока мы не отпустим кнопку мыши линия на форме должна не фиксироваться, а перемещаться за курсором мышки. Когда мы кнопку отпустим тогда линия должна начертиться и не менять свое положение.
Post’s attachments
Матрицы_GDI.xlsm 31.95 Кб, 1 скачиваний с 2023-02-12
You don’t have the permssions to download the attachments of this post.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Работа с фигурами в VBA Excel: создание фигур методом Shapes.AddShape, типы фигур (MsoAutoShapeType), обращение к фигурам и изменение их свойств. Примеры.
Объекты для работы с фигурами
Фигуры в VBA Excel представлены тремя объектами:
Объект | Описание |
---|---|
Shapes | Коллекция всех фигур на рабочем листе. Используется для создания новых фигур, для обращения к одной фигуре по имени и для перебора фигур циклом. |
ShapeRange | Коллекция нескольких фигур, аргументом которой является массив имен выбранных объектов. Используется для редактирования сразу всех фигур, входящих в эту коллекцию. |
Shape | Объект, представляющий одну фигуру. Используется для редактирования одной этой фигуры. |
Фигуры в VBA Excel создаются методом Shapes.AddShape.
Синтаксис метода AddShape
Shapes.AddShape (Type, Left, Top, Width, Height) |
Shapes — выражение, возвращающее коллекцию фигур на рабочем листе, например: ActiveSheet.Shapes.
Параметры метода AddShape
Параметр | Описание |
---|---|
Type | Константа из коллекции MsoAutoShapeType, определяющая тип создаваемой фигуры. |
Left | Расстояние от левой границы фигуры до левой границы табличной части рабочего листа в пунктах.. Тип данных — Single. |
Top | Расстояние от верхней границы фигуры до верхней границы табличной части рабочего листа в пунктах.. Тип данных — Single. |
Width | Ширина фигуры по внешним границам в пунктах. |
Height | Высота фигуры по внешним границам в пунктах. |
Все параметры метода Shapes.AddShape являются обязательными.
Константы MsoAutoShapeType
Константы коллекции MsoAutoShapeType, определяющие основные типы создаваемых фигур:
Константа | Значение | Тип фигуры |
---|---|---|
msoShapeRectangle | 1 | Прямоугольник |
msoShapeParallelogram | 2 | Параллелограмм |
msoShapeTrapezoid | 3 | Трапеция |
msoShapeDiamond | 4 | Ромб |
msoShapeRoundedRectangle | 5 | Прямоугольник: скругленные углы |
msoShapeOctagon | 6 | Восьмиугольник (октаэдр) |
msoShapeIsoscelesTriangle | 7 | Равнобедренный треугольник |
msoShapeRightTriangle | 8 | Прямоугольный треугольник |
msoShapeOval | 9 | Овал |
msoShapeHexagon | 10 | Шестиугольник (гексаэдр) |
msoShapeCross | 11 | Крест |
msoShapeRegularPentagon | 12 | Пятиугольник (пентаэдр) |
msoShapeCan | 13 | Цилиндр |
msoShapeCube | 14 | Куб |
msoShapeDonut | 18 | Круг: прозрачная заливка (кольцо) |
msoShapeLightningBolt | 22 | Молния |
msoShapeSun | 23 | Солнце |
msoShapeMoon | 24 | Месяц (луна) |
msoShape5pointStar | 92 | Звезда: 5 точек (пятиконечная) |
msoShapeCloud | 179 | Облако |
Все доступные константы из коллекции MsoAutoShapeType смотрите на сайте разработчиков.
Создание объекта ShapeRange
Создание коллекции ShapeRange из выбранных фигур:
Dim myShapeRange As ShapeRange Set myShapeRange = ActiveSheet.Shapes.Range(Array(«Пятиугольник 140», «Солнце 141», «Облако 144»)) |
Объектная переменная myShapeRange не обязательна, можно обратиться непосредственно к возвращенной коллекции, например, присвоив всем ее элементам синий цвет:
ActiveSheet.Shapes.Range(Array(«Пятиугольник 140», «Солнце 141», «Облако 144»)).Fill.ForeColor.RGB = vbBlue |
Примеры работы с фигурами
Пример 1
Создание пяти разных фигур из кода VBA Excel методом Shapes.AddShape:
Sub Primer1() With ActiveSheet.Shapes ‘При создании фигуры без присвоения ее переменной скобки не нужны .AddShape msoShapeCube, 30, 40, 72, 72 .AddShape msoShapeIsoscelesTriangle, 130, 40, 72, 72 .AddShape msoShapeSun, 230, 40, 72, 72 .AddShape msoShapeLightningBolt, 330, 40, 72, 72 ‘Чтобы выбрать фигуру, параметры необходимо заключить в скобки .AddShape(msoShapeCloud, 430, 40, 72, 72).Select End With End Sub |
Результат работы кода:
Пример 2
Работа с одной фигурой:
Sub Primer2() Dim myShape As Shape ‘Создаем фигуру «Месяц» и присваивает ссылку на нее переменной myShape Set myShape = ActiveSheet.Shapes.AddShape(msoShapeMoon, 50, 50, 80, 80) With myShape ‘Меняем высоту и ширину фигуры .Height = 150 .Width = 100 ‘Меняем цвет фигуры .Fill.ForeColor.RGB = vbYellow ‘Поворачиваем фигуру влево на 40 градусов .Rotation = —40 End With End Sub |
Пример 3
Редактирование одновременно нескольких фигур с помощью коллекции ShapeRange:
Sub Primer3() With ActiveSheet.Shapes.Range(Array(«Овал 1», «Овал 2», «Овал 3»)) ‘Меняем цвет всех фигур из коллекции ShapeRange .Fill.ForeColor.RGB = vbBlue ‘Задаем высоту и ширину овалов .Height = 150 .Width = 50 ‘Поворачиваем фигуры вправо на 45 градусов .Rotation = 45 End With End Sub |
Пример 4
Редактирование одновременно всех фигур на рабочем листе с помощью коллекции ShapeRange:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub Primer4() Dim myShapeRange As ShapeRange, i As Integer, _ myShape As Shape, myArray() As String ‘Задаем массиву размерность от 1 до количества фигур на листе ReDim myArray(1 To ActiveSheet.Shapes.Count) ‘Проходим циклом по всем фигурам коллекции и записываем их имена в массив For Each myShape In ActiveSheet.Shapes i = i + 1 myArray(i) = myShape.Name Next ‘Создаем коллекцию ShapeRange и присваиваем ссылку на нее переменной myShapeRange Set myShapeRange = ActiveSheet.Shapes.Range(myArray) With myShapeRange ‘Изменяем цвет всех фигур на рабочем листе .Fill.ForeColor.RGB = RGB(100, 150, 200) ‘Поворачиваем все фигуры вокруг вертикальной оси .Flip msoFlipVertical End With End Sub |
Пример 5
Добавление надписи (текста) на фигуру:
Sub Primer5() Dim myShape As Shape Set myShape = ActiveSheet.Shapes.AddShape(msoShapeCloud, 50, 30, 300, 300) With myShape.TextFrame2 ‘Добавление текста на фигуру .TextRange.Characters.Text = «Объект TextFrame представляет текстовую рамку в объекте Shape. Содержит текст в текстовом кадре, а также свойства и методы, которые контролируют выравнивание и закрепление текстового кадра.» ‘Задаем курсивное начертание .TextRange.Characters.Font.Italic = True ‘Указываем размер шрифта .TextRange.Characters.Font.Size = 13 ‘Отступ левой границы текстового поля от левой внутренней границы фигуры .MarginLeft = 30 ‘Отступ верхней границы текстового поля от верхней внутренней границы фигуры .MarginTop = 20 End With End Sub |
Результат работы кода:
Изменить цвет текста, например на черный, можно двумя способами:
‘С помощью константы MsoThemeColorIndex myShape.TextFrame2.TextRange.Characters.Font.Fill.ForeColor.ObjectThemeColor = msoThemeColorDark1 ‘С помощью цветовой модели RGB myShape.TextFrame2.TextRange.Characters.Font.Fill.ForeColor.RGB = RGB(0, 0, 0) |
С константами из коллекции MsoThemeColorIndex вы можете ознакомиться на сайте разработчиков.
Пример 6
Удаление фигур с рабочего листа из кода VBA Excel с помощью метода Delete.
Удаление одной фигуры:
ActiveSheet.Shapes(«Ромб 5»).Delete |
Удаление нескольких фигур:
ActiveSheet.Shapes.Range(Array(«Овал 1», «Овал 2», «Овал 3»)).Delete |
Удаление всех фигур с рабочего листа с помощью цикла:
Sub Primer6() Dim myShape As Shape For Each myShape In ActiveSheet.Shapes myShape.Delete Next End Sub |
В 7 примере рассмотрено удаление всех фигур без цикла.
Пример 7
Выделение всех фигур на рабочем листе:
ActiveSheet.Shapes.SelectAll |
Выбор всех фигур и удаление выбранного (всех фигур):
Sub Primer7() ActiveSheet.Shapes.SelectAll Selection.Delete End Sub |
Продолжение темы в статье VBA Excel. Копирование, перемещение и поворот фигур.