Работа с фигурами в 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. Копирование, перемещение и поворот фигур.
The Excel VBA Shape object represents an object in the
drawing layer, such as an AutoShape, freeform, OLE object, or picture. It is a
member of the Shapes collection, which contains all the shapes in a workbook,
but represents a single shape in a worksheet.
How to refer to the Shape
object
We refer to the Shapes collection in a given worksheet as indicated below:
ActiveSheet.Shapes
Then, we can use properties and methods of the Shapes collection as per the Excel object model structure. Some useful methods of the Shapes collection are: AddShape,
AddTextBox, AddFormControl, AddPicture, Item, SelectAll. See below an example
of the structure (for AddShape see next section).
ActiveSheet.Shapes.SelectAll ‘selects all the shapes in
the active sheet
ActiveSheet.Shapes.Item(1).Select ‘selects the first shape in the
active sheet
The latest can simply be referred to as either of the below two
options: the first one using the index, and the second using the shape name. Thus, we refer to a single Shape object.
ActiveSheet.Shapes(1)
ActiveSheet.Shapes(«Rectangle 1»)
Add new shapes
We use the method AddShape of the Excel VBA Shapes
collection to create or add a new shape in a given worksheet. Excel
automatically gives a default name depending on the type of shape (for example,
Rectangle 1, TextBox 2, etc), but we can easily change the name of the shape
and many other properties (see later). See below the standard statement to add
a new AutoShape in the active worksheet.
ActiveSheet.Shapes.AddShape MsoAutoShapeType, pLeft, pTop, pWidth, pHeight
Where MsoAutoShapeType specifies the type of
an AutoShape object (MsoAutoShapeType enumeration for Microsoft Office), and pLeft, pTop, pWidth, and pHeight determine the position and
size of the shape in points. Note that the pLeft and pTop refer to the upper
left corner of the shape in reference to the upper left edge of the worksheet.
In the following example, we add a rectangle
to the active worksheet.
ActiveSheet.Shapes.AddShape
msoShapeRectangle, 20, 20, 200, 100
In order to add the shape to a specific cell
or range in the worksheet, we need to specify the position and size of the
shape as follows:
Dim rng As Range
Set rng = ActiveSheet.Range(«D4:H8»)
rngLeft = rng.Left
rngTop = rng.Top
rngHeight = rng.Height
rngWidth = rng.Width
ActiveSheet.Shapes.AddShape msoShapeRectangle,
rngLeft, rngTop, rngWidth, rngHeight
It is more practical to add the shape to an
object variable in order to easily apply formatting properties or methods later.
In the following example, we define an object variable called “MyShape” to add
a rectangle to the active worksheet, then we change the name of the shape and
apply any other properties (for this see next section).
Dim MyShape As Shape
Set MyShape =
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 50, 50, 140, 80)
With MyShape
.Name =
«MyFirstShape»
‘other
properties
End With
We can add other types of shapes such as text
boxes, form controls, smart art shapes, pictures, etc, with the corresponding
method of the Shapes collection. Here are some useful examples.
The code below adds a textbox into the active
worksheet with given dimensions (100×60) and some inner text. Note that we use
the TextFrame.Characters method to work with text inside the box.
Dim
txtbox As Shape
Set
txtbox = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 50, 50,
100, 60)
With
txtbox.TextFrame.Characters
.Text = «This is my first textbox»
.Font.Color = vbRed
End
With
We can add form controls such as buttons,
check boxes, combo boxes, etc, with the AddFormControl method of the Shapes
collection. For example, to add a command button we can use a similar structure
than the one we have seen earlier:
ActiveSheet.Shapes.AddFormControl
xlButtonControl, 20, 20, 100, 40
In this particular case we
can also use the Buttons.Add method directly. The following subroutine adds a command button to the active worksheet,
and assigns another procedure (ButtonAction) to be run when clicked.
Sub
AddButtonToWorksheet()
Dim
btn As Object
Set
btn = ActiveSheet.Buttons.Add(20, 20, 100, 40)
btn.OnAction = «ButtonAction»
End Sub
Sub
ButtonAction()
MsgBox «You have pressed the button»
End Sub
Select, copy, and delete shapes
We can select, copy, or delete a shape using
the corresponding methods of the Shape object, and specifying that particular
shape with either the number or name (as we have seen earlier).
ActiveSheet.Shapes(«Rectangle 1»).Select ‘selects Rectangle 1
ActiveSheet.Shapes(2).Select ‘selects
the second shape
ActiveSheet.Shapes.SelectAll ‘selects all shapes in the
active sheet
ActiveSheet.Shapes(«Rectangle 1»).Copy
ActiveSheet.Paste
ActiveSheet.Shapes(«Rectangle
1»).Delete
In order to copy or delete all shapes in the
worksheet we need to loop through all shapes using a For Each loop. If you are
not familiar with loops, please check the lesson 6 (Conditions and Loops) in
the training for beginners. The following example deletes all shapes in the
active worksheet:
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
shp.Delete
Next shp
If we want to select and work with a subset of shapes (more
than just one), we have to construct a ShapeRange
collection that contains the shapes we want to work with. In the example below,
we select a rectangular shape (Rectangle 1) and a textbox (TextBox 2) through
an array of shapes. We can now work with those shapes and apply for example
formatting properties to both at the same time.
Dim ShpSubsetArray() As Variant
Dim ShpSubset As Object
ShpSubsetArray = Array(«Rectangle 1»,
«TextBox 2»)
Set ShpSubset =
ActiveSheet.Shapes.Range(ShpSubsetArray)
ShpSubset.Select
Format shapes
There are a bunch of properties to format
shapes in Excel VBA. We can specify the position in the worksheet with the Top
and Left properties as we have seen earlier. Similarly, we can set the width
and height of the shape with the respective properties of the Shape
object.
With ActiveSheet.Shapes(«Rectangle 1»)
.Top = 100
.Left = 100
.Width = 200
.Height = 120
End With
We can also change the aspect of the interior
and border of the shape. The following example changes the interior color of the
rectangle to blue and sets a thick red border around using the Fill and Line
properties.
With ActiveSheet.Shapes(«Rectangle 1»)
.Fill.ForeColor.RGB = RGB(0, 0, 255)
.Line.ForeColor.RGB = RGB(255, 0, 0)
.Line.Weight = xlThick
End With
In order to add text to the shape we need to
use the TextFrame property. This may be particularly useful when dealing with
textboxes. We use the TextFrame.Characters method to add text, change font
properties, etc. The example below adds some text red and bold inside the
textbox.
With ActiveSheet.Shapes(«TextBox 2»)
With .TextFrame.Characters
.Text = «This is my textbox»
.Font.Color = vbRed
.Font.Bold = True
End With
End With
Other VBA Objects
Application
Workbook
Worksheet
WorksheetFunction
Range
Chart
На чтение 18 мин. Просмотров 166 Опубликовано 07.02.2021
Класс Shape представляет объект в слое рисования, такой как AutoShape, произвольная форма, объект OLE или изображение.
Основными процедурами класса Shape являются копирование, удаление, выбор , ShapeRange.Delete, ShapeRange.Select, Shapes.Add3DModel, Shapes.AddCallout, Shapes.AddChart2, Shapes.AddConnector, Shapes.AddCurve, Shapes.AddFormControl, Shapes.AddLabel, Shapes.AddLicture, Shapesbject.AddOLE .AddPicture2, Shapes.AddPolyline, Shapes.AddShape, Shapes.AddSmartArt, Shapes.AddTextbox и Shapes.AddTextEffect
Содержание
- Set
- For Each
- Темы
- Методы
- Свойства
Set
Чтобы использовать переменную класса Shape, сначала необходимо для создания экземпляра, например
Dim strFilename As String: strFilename = Dim chr As Chart: Установите chr = Dim shpAdd3DModel As ShapeSet shpAdd3DModel = chr.Shapes.Add3DModel (Filename: = strFilename)
Для установки переменных типа Shape можно использовать следующие процедуры: GroupItems, ShapeRange.GroupItems, Comment.Shape, ConnectorFormat.BeginConnectedShape, ConnectorFo rmat.EndConnectedShape, FreeformBuilder.ConvertToShape, GroupShapes.Item, Hyperlink.Shape, PivotCache.CreatePivotChart, PivotTable.PivotChart, Duplicate, ParentGroup, ShapeRange.Item, ShapeRange.Group, ShapeRange.Item, ShapesRange.Group, ShapeRange.Group. Add3DModel, Shapes.AddCallout, Shapes.AddChart2, Shapes.AddConnector, Shapes.AddCurve, Shapes.AddFormControl, Shapes.AddLabel, Shapes.AddLine, Shapes.AddOLEObject, Shapes.AddPicture, Shapes.Add.Picture, Shapes.Add.Picture, Shapes.Add.Picture Shapes.AddSmartArt, Shapes.AddTextbox, Shapes.AddTextEffect, Slicer.Shape, Window.RangeFromPoint, ChartObject.ShapeRange, ChartObjects.ShapeRange, GroupShapes.Range, OLEObject.ShapeRange, ShapeRange.Range, ULEObject.ShapeRange, OLEObjects.Range.Under Shapes.Range, Chart.Shapes и Worksheet.Shapes
For Each
Вот пример обработки элементов Shape в коллекции.
Dim shp As Shape: установите shp = Dim shpGroupItem как ShapeFor каждого shpGroupItem в shp.GroupItems Следующий shpGroupItem
Темы
Некоторые процедуры в этом классе сгруппированы в темы и описаны на отдельных страницах тем
Ячейка с ее процедурами BottomRightCell и TopLeftCell
Копировать с ее процедурами Скопируйте и CopyPicture
3D с его процедурами Model3D и ShapeRange.Model3D
Sort/Order с его процедурами ZOrder, ZOrderPosition, ShapeRange.ZOrder и ShapeRange.ZOrderPosition
Добавьте с его процедурами Shapes. Add3DModel, Shapes.AddCallout, Shapes.AddChart2, Shapes.AddConnector, Shapes.AddCurve, Shapes.AddFormControl, Shapes.AddLabel, Shapes.AddLine, Shapes.AddOLEObject, Shapes.AddPicture, Shapes.Add.Picture, Shapes.Add.Picture, Shapes.Add.Picture, Shapes.Add.Picture Shapes.AddSmartArt, Shapes.AddTextbox и Shapes.AddTextEffect
Методы
Это основные методы класса Shape
Удалить – удаляет объект.
Select – выделяет объект.
ShapeRange.Delete – удаляет объект.
ShapeRange.Select – выбирает объект.
Другие методы
ShapeRange.Align – выравнивает фигуры в указанном диапазоне фигур.
Set myDocument = Worksheets (1) myDocument.Shapes.SelectAll Selection.ShapeRange.Align msoAlignLefts, False
ShapeRange.Distribute – горизонтальное или вертикальное распределение фигур в указанном диапазоне фигур.
Установить myDocument = Worksheets (1) с помощью myDocument.Shapes numShapes = .Count Если numShapes> 1 Тогда numAutoShapes = 0 ReDim autoShpArray (1 в numShapes) Для i = 1 в numShapes If .Item (i) .Type = msoAutoShape Then numAutoShapes = numAutoShapes + 1 autoShpArray (numAutoShapes If) = .Item (numAutoShapes) If =. numAutoShapes> 1 Затем ReDim Preserve autoShpArray (1 To numAutoShapes) Установить asRange = .Range (autoShpArray) asRange.Distribute msoDistributeHorizontally, False End If End If End With
Shapes.BuildFreeform – строит объект произвольной формы. Возвращает объект FreeformBuilder, представляющий произвольную форму по мере ее создания.
Set myDocument = Worksheets (1) With myDocument.Shapes.BuildFreeform (msoEditingCorner, 360, 200) .AddNodes msoSegmentCurve, msoEditingCorner, _ 380, 230, 400, 250, 450, 300 .AddNodes msoSegmentCurve, msoEditingAuto, 480, 200 .AddNodes msoSegmentLine, msoEditingAuto, 480, 400 .AddNodes msoSegmentLine, msoEdCode, >
Свойства
GroupShapes.Count возвращает значение типа Long, представляющее количество объектов в коллекции.
GroupShapes.Parent возвращает родительский объект для указанного объекта. Только для чтения.
GroupShapes.Range возвращает объект ShapeRange, представляющий подмножество фигур в коллекции Shapes.
Установить myDocument = Worksheets (1) myDocument.Shapes.Range (Array (1, 3)) _ .Fill.Patterned msoPatternHorizontalBrick
Adjustments возвращает объект Adjustments, который содержит значения корректировки для всех корректировок в указанной форме. Применяется к любому объекту Shape, который представляет AutoShape, WordArt или Connector.
Установить myDocument = Worksheets (1) myDocument.Shapes (1) .Adjustments (1) = 0.25
AlternativeText возвращает или задает описательную (альтернативную) текстовую строку для объекта Shape при сохранении объекта на веб-странице.
Worksheets (1) .Shapes (1) .AlternativeText = "Концентрические круги"
AutoShapeType возвращает или устанавливает тип формы для указанного объекта Shape или ShapeRange, который должен представлять автофигуру, отличную от линии, рисунка произвольной формы или соединителя.
Set myDocument = Worksheets (1) For Каждый s В myDocument.Shapes Если s.AutoShapeType = msoShape16pointStar То s. AutoShapeType = msoShape32pointStar End If Next
BackgroundStyle возвращает или устанавливает стиль фона.
BlackWhiteMode возвращает или задает значение, которое указывает, как указанная форма отображается при просмотре презентации в черно-белом режиме.
Sub UseBlackWhiteMode () Dim wksOne Как набор рабочих листов wksOne = Application.Worksheets (1) wksOne.Shapes (1) .BlackWhiteMode = msoBlackWhiteGrayOutline End Sub
Callout возвращает объект CalloutFormat который содержит свойства форматирования выноски для указанной формы. Применяется к объекту Shape, который представляет выносные линии.
Установить myDocument = Worksheets (1) с помощью myDocument.Shapes .AddShape msoShapeOval, 180, 200, 280, 130 с .AddCallout ( msoCalloutTwo, 420, 170, 170, 40) .TextFrame.Characters.Text = "Мой овал" с .Callout .Accent = True .Border = False End With End With End With
Chart возвращает объект Chart, который представляет диаграмму, содержащуюся в фигуре.
Child возвращает msoTrue, если указанная фигура дочерняя фигура или все фигуры в диапазоне фигур являются дочерними фигурами одного и того же родителя. Возвращает msoFalse, если выбранная фигура не является дочерней фигурой. Возвращает msoTriStateMixed, если только некоторые из выбранных фигур являются дочерними.
ConnectionSiteCount возвращает количество сайтов подключения в указанной фигуре.
Установить myDocument = Worksheets (1) Установить s = myDocument.Shapes Установить firstRect = s.AddShape (msoShapeRectangle, _ 100, 50, 200, 100) Установить secondRect = s.AddShape (msoShapeRectangle, _ 300, 300, 200, 100) lastsite = secondRect.ConnectionSiteCount с s.AddConnector (msoConnectorCurve, _ 0, 0, 100, 100) .ConnectorFormat .BeginConnect ConnectedShape: = firstRect, _ ConnectionSite: = 1 .EndConnect ConnectedShape: = secondRect : = 1 Заканчивается на s.AddConnector (msoConnectorCurve, _ 0, 0, 100, 100) .ConnectorFormat .BeginConnect ConnectedShape: = firstRect, _ ConnectionSite: = 1 .EndConnect ConnectedShape: = secondRect, _ ConnectionSite: = lastsite End With
Connector true, если указанная фигура является соединителем.
Установить myDocument = Worksheets ( 1) С myDocument.Sh обезьяны For i = .Count To 1 Step -1 With .Item (i) If .Connector Then .Delete End With Next End With
ConnectorFormat возвращает объект ConnectorFormat, содержащий свойства форматирования соединителя. Применяется к объекту Shape, который представляет соединители.
Set myDocument = Worksheets (1) Set s = myDocument.Shapes Set firstRect = s.AddShape (msoShapeRectangle, 100, 50, 200 , 100) Установите secondRect = s.AddShape (msoShapeRectangle, 300, 300, 200, 100) Установите c = s.AddConnector (msoConnectorCurve, 0, 0, 0, 0) с помощью c.ConnectorFormat .BeginConnect firstRect, 1 .EndConnect secondRect, 1 c.RerouteConnections .BeginDisconnect. EndDisconnect End With
ControlFormat возвращает объект ControlFormat, содержащий свойства элемента управления Microsoft Excel.
Set lbcf = Worksheets (1) .Shapes (2) .ControlFormat lbcf.RemoveItem lbcf.ListIndex
Contemporary устанавливает или возвращает декоративный флаг для указанного объекта.
Fill возвращает объект FillFormat для указанной формы или объект ChartFillFormat для указанной диаграммы, который содержит свойства форматирования заливки для фигуры или диаграммы .
Установить myDocument = Worksheets (1) с помощью myDocument.Shapes.AddShape (msoShapeRectangle, _ 90, 90, 90, 50) .Fill .ForeColor.RGB = RGB (128 , 0, 0) .BackColor.RGB = RGB (170, 170, 170) .TwoColorGradient msoGradientHorizontal, 1 End With
FormControlType возвращает Тип элемента управления Microsoft Excel.
For Each s In Worksheets (1) .Shapes If s.Type = msoFormControl Then If s.FormControlType = xlCheckBox Then _ sC ontrolFormat.Value = False End If Next
Glow возвращает объект GlowFormat для указанной фигуры, который содержит свойства форматирования свечения для фигуры.
GraphicStyle возвращает или задает константу MsoGraphicStyleIndex, которая представляет стиль графики SVG.
Dim myShape As Shape Set myShape = ActiveDocument.Shapes (1) myShape.GraphicStyle = msoGraphicStylePreset22
GroupItems возвращает объект GroupShapes, представляющий отдельные фигуры в указанной группе . Используйте метод Item объекта GroupShapes, чтобы вернуть одну фигуру из группы. Применяется к объектам Shape, которые представляют сгруппированные фигуры.
Установить myDocument = Worksheets (1) с myDocument.Shapes .AddShape (msoShapeIsoscelesTriangle, _ 10, 10, 100, 100) .Name = "shpOne" .AddShape (msoShapeIsoscelesTriangle, _ 150, 10, 100, 100) .Name = "shpTwo" .AddShape (msoShapeIsoscelesTriangle, _ 300, 10, 100, 100) .Name = "shpThree" With .Range (Array ( "shpOne", "shpTwo", "shpThree")). Group .Fill.PresetTextured msoTextureBlueTissuePaper .GroupItems (2) .Fill.PresetTextured msoTextureGreenMarble, заканчивающийся на
HasChart возвращает, содержит ли фигура диаграмму.
HasSmartArt возвращает, присутствует ли диаграмма SmartArt в указанной фигуре.
Высота возвращает или задает значение Single, представляющее высоту объекта в точках.
HorizontalFlip true, если указанная фигура перевернута вокруг горизонтальной оси.
Установить myDocument = Worksheets (1) For Each s In m yDocument.Shapes Если s.HorizontalFlip Then s.Flip msoFlipHorizontal If s.VerticalFlip Then s.Flip msoFlipVertical Next
Hyperlink возвращает объект Hyperlink, который представляет гиперссылку для фигуры.
Рабочие листы (1) .Фигуры (1) .Гиперссылка. Follow NewWindow: = True
ID возвращает значение типа Long, представляющее тип для указанного объекта.
Left возвращает или задает значение Single, представляющее расстояние в пунктах от левого края объекта до левого края столбца A (на листе) или левого края диаграммы. область (на диаграмме).
Line возвращает объект LineFormat, который содержит свойства форматирования линии для указанной фигуры. (Для линии объект LineFormat представляет саму линию; для фигуры с рамкой объект LineFormat представляет границу).
Установите myDocument = Worksheets (1) с myDocument.Shapes.AddLine (10, 10, 250, 250) .Line .DashStyle = msoLineDashDotDot .ForeColor.RGB = RGB (50, 0, 128) Заканчивается на
LinkFormat возвращает объект LinkFormat, содержащий свойства связанного объекта OLE.
For Each s In Worksheets (1) .Shapes If s.Type = msoLinkedOLEObject Then s.LinkFormat.Update Next
LockAspectRatio true, если указанная форма сохраняет свои исходные пропорции при изменении ее размера. Значение false, если вы можете изменять высоту и ширину фигуры независимо друг от друга при изменении ее размера.
Установите myDocument = Worksheets (1) myDocument.Shapes.AddShape (msoShapeCube, _ 50, 50, 100, 200) .LockAspectRatio = msoTrue
Locked возвращает или задает логическое значение, указывающее, заблокирован ли объект.
Name возвращает или задает строковое значение, представляющее имя объекта.
Узлы возвращает коллекцию ShapeNodes, представляющую геометрическое описание указанной формы.
Set myDocument = Worksheets (1) With myDocument.Shapes (3) .Nodes .Insert 4, msoSegmentCurve , msoEditingSmooth, 210, 100 Заканчивается на
OLEFormat возвращает объект OLEFormat, содержащий свойства объекта OLE.
Worksheets(1).Shapes(1).OLEFormat.Activate
OnAction возвращает или задает имя макроса, который запускать, когда указанный объект – cho sen.
Рабочие листы (1) .Shapes (1) .OnAction = "ShapeClick"
Родитель возвращает родительский объект для указанного объекта. Только для чтения.
ParentGroup возвращает объект Shape, представляющий общую родительскую форму дочерней фигуры или диапазона дочерних фигур.
Sub ParentGroup () Dim pgShape As Shape With ActiveSheet.Shapes .AddShape Type: = 1, Left: = 10, Top: = 10, _ Width: = 100, Height: = 100 .AddShape Type : = 2, Left: = 110, Top: = 120, _ Width: = 100, Height: = 100 .Range (Array (1, 2)). Group End With 'Используя дочернюю фигуру в группе, получите родительскую фигуру . Установите pgShape = ActiveSheet.Shapes (1) .GroupItems (1) .ParentGroup MsgBox «Две формы теперь будут удалены». 'Удалить родительскую фигуру. pgShape. Удалить конечную подпрограмму
PictureFormat возвращает объект PictureFormat, который содержит свойства форматирования изображения для указанной фигуры. Применяется к объекту Shape, который представляет изображения или объекты OLE.
Установите myDocument = Worksheets (1) с помощью myDocument.Shapes (1) .PictureFormat .Brightness = 0.3 .Contrast =. 75 End With
Placement возвращает или устанавливает значение XlPlacement, которое представляет способ прикрепления объекта к ячейкам под ним.
Reflection возвращает объект ReflectionFormat для указанной формы, который содержит свойства форматирования отражения для этой фигуры.
Rotation возвращает или задает поворот фигуры в градусах.
Shadow возвращает объект ShadowFormat только для чтения, который содержит свойства форматирования тени для указанной фигуры или фигур .
ShapeStyle возвращает или задает значение MsoShapeStyleIndex, которое представляет стиль формы диапазона фигур.
SmartArt возвращает объект, представляющий SmartArt, связанный с фигурой.
SoftEdge возвращает S oftEdgeFormat для указанной фигуры, который содержит свойства форматирования мягких краев для фигуры.
TextEffect возвращает объект TextEffectFormat, который содержит свойства форматирования текстового эффекта для указанной фигуры .
Установить myDocument = Worksheets (1) с помощью myDocument.Shapes (3) Если .Type = msoTextEffect, то .TextEffect.FontBold = True End If End With
TextFrame возвращает объект TextFrame, который содержит свойства выравнивания и привязки для указанной формы.
Рабочие листы ( 1) .Shapes (1) .TextFrame _ .HorizontalAlignment = xlHAlignJustify
TextFrame2 возвращает объект TextFrame2, содержащий форматирование текста для указанной фигуры.
ThreeD возвращает объект ThreeDFormat, содержащий свойства форматирования 3D-эффекта для указанной фигуры.
Установить myDocument = Worksheets (1) С myDocument.Shapes (1) .ThreeD .Visible = True .Depth = 50 .Extrus ionColor.RGB = RGB (255, 100, 255) 'Значение RGB для пурпурного .SetExtrusionDirection msoExtrusionTop .PresetLightingDirection = msoLightingLeft End With
Title возвращает или задает заголовок альтернативного текста, связанного с указанной формой.
Top возвращает или задает значение Single, которое представляет расстояние в пунктах от верха край самой верхней фигуры в диапазоне фигур до верхнего края листа.
Type возвращает или задает значение MsoShapeType, представляющее тип фигуры.
VerticalFlip true, если указанная фигура перевернута вокруг вертикальной оси.
Установить myDocument = Worksheets (1) Для каждого s в myDocument.Shapes Если s.HorizontalFlip Then s.Flip msoFlipHorizontal If s.VerticalFlip Then s. Flip msoFlipVertical Next
Vertices возвращает координаты вершин указанного рисунка произвольной формы (и контрольных точек для кривых Безье) в виде серии пар координат. Вы можете использовать массив, возвращаемый этим свойством, в качестве аргумента метода AddCurve или AddPolyLine.
Установите myDocument = Worksheets (1) с помощью myDocument.Shapes (1) vertArray = .Vertices x1 = vertArray (1, 1) y1 = vertArray (1, 2) MsgBox "Координаты первой вершины:" & x1 & "," & y1 End With
Visible возвращает или задает значение MsoTriState, которое определяет, является ли объект видимым.
Width возвращает или задает значение Single, представляющее ширина объекта в точках.
ShapeRange.Adjustments возвращает объект Adjustments, который содержит значения корректировки для всех корректировок в указанной форме. Применяется к любому объекту ShapeRange, представляющему AutoShape, WordArt или Connector.
ShapeRange.AlternativeText возвращает или задает описательную (альтернативную) текстовую строку для объекта ShapeRange когда объект сохраняется на веб-страницу.
ShapeRange.AutoShapeType возвращает или задает тип формы для указанного объекта Shape или ShapeRange, который должен представлять другую автофигуру чем линия, рисунок произвольной формы или соединитель.
Установить myDocument = Worksheets (1) для каждого s в myDocument.Shapes Если s.AutoShapeType = msoShape16pointStar Тогда s.AutoShapeType = msoShape32pointStar End If Next
ShapeRange.BackgroundStyle возвращает или устанавливает стиль фона.
ShapeRange .BlackWhiteMode возвращает или задает значение, которое указывает, как указанная форма отображается при просмотре презентации в черно-белом режиме.
Sub UseBlackWhiteMode () Dim wksOne как набор рабочих листов wksOne = Application .Worksheets (1) wksOne.Shapes (1) .BlackWhiteMode = msoBlackWhiteGrayOutline End Sub
ShapeRange.Callout возвращает объект CalloutFormat, содержащий форматирование выноски свойства для указанной формы. Применяется к объектам ShapeRange, которые представляют обозначения линий.
Set myDocument = Worksheets (1) With myDocument.Shapes .AddShape msoShapeOval, 180, 200, 280, 130 With .AddCallout (msoCalloutTwo , 420, 170, 170, 40) .TextFrame.Characters.Text = "Мой овал" с .Callout .Accent = True .Border = False End With End With End With
ShapeRange.Chart возвращает объект Chart, представляющий диаграмму, содержащуюся в диапазоне фигур.
ShapeRange.Child возвращает msoTrue, если указанная фигура является дочерней фигурой или если все фигуры в диапазоне фигур являются дочерними фигурами одного и того же родителя. Возвращает msoFalse, если выбранная фигура не является дочерней фигурой. Возвращает msoTriStateMixed, если только некоторые из выбранных фигур являются дочерними..
Sub FillChildShape () 'Выберите первую фигуру на холсте для рисования. ActiveSheet.Shapes (1) .CanvasItems (1) .Select 'Заполнить выбранную фигуру, если это дочерняя фигура. Если Selection.ShapeRange.Child = msoTrue Then Selection.ShapeRange.Fill.ForeColor.RGB = RGB (100, 0, 200) Else MsgBox «Эта фигура не является дочерней фигурой». End If End Sub
ShapeRange.ConnectionSiteCount возвращает количество сайтов подключения в указанной фигуре.
Установить myDocument = Worksheets (1) Установить s = myDocument.Shapes Установить firstRect = s.AddShape (msoShapeRectangle, _ 100, 50, 200, 100) Установить secondRect = s.AddShape (msoShapeRectangle, _ 300, 300, 200 , 100) lastsite = secondRect.ConnectionSiteCount с s.AddConnector (msoConnectorCurve, _ 0, 0, 100, 100) .ConnectorFormat .BeginConnect ConnectedShape: = firstRect, _ ConnectionSite: = 1 .EndConnect ConnectedShape: = secondRect, _ Завершить с помощью s.AddConnector (msoConnectorCurve, _ 0, 0, 100, 100) .ConnectorFormat .BeginConnect ConnectedShape: = firstRect, _ ConnectionSite: = 1 .EndConnect ConnectedShape: = secondRect, _ ConnectionSite: = lastsite End With
ShapeRange.Connector true, если указанная фигура является соединителем.
Установить myDocument = Worksheets (1 ) С myDocument.Shapes For i = .Count To 1 Step -1 With .Item (i) Если .Connector Then .Delete End With Next End With
ShapeRange.ConnectorFormat возвращает объект ConnectorFormat, содержащий форматирование соединителя свойства. Применяется к объектам ShapeRange, которые представляют соединители.
Set myDocument = Worksheets (1) Set s = myDocument.Shapes Set firstRect = s.AddShape (msoShapeRectangle, 100, 50, 200, 100) Установите secondRect = s.AddShape (msoShapeRectangle, 300, 300, 200, 100) Установите c = s.AddConnector (msoConnectorCurve, 0, 0, 0, 0) с помощью c.ConnectorFormat .BeginConnect firstRect, 1 .EndConnect secondRect, 1 c.RerouteConnections .BeginDisconnect .EndDisconnect End With
ShapeRange.Count возвращает значение типа Long, представляющее количество объектов в коллекции.
ShapeRange.Decorative устанавливает или возвращает декоративный флаг для указанного объекта.
ShapeRange.Fill возвращает объект FillFormat для указанной фигуры или объект ChartFillFormat для указанной диаграммы, который содержит свойства форматирования заливки для фигуры или диаграммы.
Установить myDocument = Worksheets (1) с myDocument.Shapes.AddShape (msoShapeRectangle, _ 90, 90, 90 , 50) .Fill .ForeColor.RGB = RGB (128, 0, 0) .BackColor.RGB = RGB (170, 170, 170) .TwoColorGradient msoGradientHorizontal, 1 заканчивается на
ShapeRange.Glow возвращает объект GlowFormat для указанного диапазона фигур, который содержит свойства форматирования свечения для диапазона фигур.
ShapeRange. GraphicStyle возвращает или задает константу MsoGraphicStyleIndex, которая представляет стиль диапазона фигур, содержащего одну или несколько графиков SVG.
ShapeRange.GroupItems возвращает GroupShapes объект, представляющий отдельные фигуры в указанной группе. Используйте метод Item объекта GroupShapes, чтобы вернуть одну фигуру из группы. Применяется к объектам ShapeRange, представляющим сгруппированные фигуры.
Set myDocument = Worksheets (1) With myDocument.Shapes .AddShape (msoShapeIsoscelesTriangle, _ 10, 10, 100, 100) .Name = "shpOne" .AddShape (msoShapeIsoscelesTriangle, _ 150, 10, 100, 100) .Name = "shpTwo" .AddShape (msoShapeIsoscelesTriangle, _ 300, 10, 100, 100) .Name = "shpThree" With .Range (Array ( "shpOne", "shpTwo", "shpThree")). Group .Fill.PresetTextured msoTextureBlueTissuePaper .GroupItems (2) .Fill.PresetTextured msoTextureGreenMarble, заканчивающийся на
ShapeRange.HasChart возвращает, содержит ли диапазон фигур диаграмму.
ShapeRange.Height возвращает или задает значение Single, представляющее высоту, в пунктах объекта.
ShapeRange.HorizontalFlip true, если указанная фигура перевернута вокруг горизонтальной оси.
Установить myDocument = Worksheets (1) для каждого s в myDocument.Shapes Если s.HorizontalFlip То s.Flip msoFlipHorizonta l Если s.VerticalFlip Then s.Flip msoFlipVertical Next
ShapeRange.ID возвращает значение Long, представляющее тип для указанного объекта.
ShapeRange.Left возвращает или задает значение Single, которое представляет расстояние в пунктах от левого края объекта до левого края столбца A (на лист) или левый край области диаграммы (на диаграмме).
ShapeRange.Line возвращает объект LineFormat, который содержит свойства форматирования линии для указанного форма. (Для линии объект LineFormat представляет саму линию; для фигуры с рамкой объект LineFormat представляет границу).
Установите myDocument = Worksheets (1) с myDocument.Shapes.AddLine (10, 10, 250, 250) .Line .DashStyle = msoLineDashDotDot .ForeColor.RGB = RGB (50, 0, 128) Заканчивается на
ShapeRange.LockAspectRatio true, если указанная форма сохраняет свои исходные пропорции при изменении ее размера. Значение false, если вы можете изменять высоту и ширину фигуры независимо друг от друга при изменении ее размера.
Установите myDocument = Worksheets (1) myDocument.Shapes.AddShape (msoShapeCube, _ 50, 50, 100, 200) .LockAspectRatio = msoTrue
ShapeRange.Name возвращает или задает значение String, представляющее имя объекта .
ShapeRange.Nodes возвращает коллекцию ShapeNodes, которая представляет геометрическое описание указанной формы.
Установите myDocument = Worksheets (1) с помощью myDocument.Shapes (3) .Nodes. Insert 4, msoSegmentCurve, msoEditingSmooth, 210, 100 End With
ShapeRange.Parent возвращает родительский объект для указанного объекта. Только для чтения.
ShapeRange.ParentGroup возвращает объект Shape, представляющий общую родительскую форму дочерней фигуры или диапазона дочерних фигур.
Sub ParentGroup () Dim pgShape As Shape With ActiveSheet.Shapes. AddShape Тип: = 1, Слева: = 10, Сверху: = 10, _ Ширина: = 100, Высота: = 100. AddShape Type: = 2, Left: = 110, Top: = 120, _ Width: = 100, Height: = 100 .Range (Array (1, 2)). Group End With 'Используя дочернюю фигуру в группе, получите Родительская форма. Установите pgShape = ActiveSheet.Shapes (1) .GroupItems (1) .ParentGroup MsgBox «Две формы теперь будут удалены». 'Удалить родительскую фигуру. pgShape.Delete End Sub
ShapeRange.PictureFormat возвращает объект PictureFormat, который содержит свойства форматирования изображения для указанной фигуры. Применяется к объекту ShapeRange, который представляет изображения или объекты OLE.
Установить myDocument = Worksheets (1) с помощью myDocument.Shapes (1) .PictureFormat .Brightness = 0.3 .Contrast =. 75 Завершить на
ShapeRange.Reflection возвращает объект ReflectionFormat для указанного диапазона фигур, который содержит свойства форматирования отражения для диапазона фигур.
ShapeRange.Rotation возвращает или задает поворот фигуры в градусах.
ShapeRange.Shadow возвращает доступный только для чтения объект ShadowFormat, который содержит свойства форматирования тени для указанной фигуры или фигур.
ShapeRange.ShapeStyle возвращает или задает значение MsoShapeStyleIndex, представляющее стиль формы диапазона фигур.
ShapeRange.SoftEdge возвращает объект SoftEdgeFormat для указанного диапазона фигур, который содержит свойства форматирования мягких краев для диапазона фигур.
ShapeRange.TextEffect возвращает Te xtEffectFormat, который содержит свойства форматирования текстового эффекта для указанной фигуры.
Установить myDocument = Worksheets (1) With myDocument.Shapes (3) If .Type = msoTextEffect Then .TextEffect .FontBold = True End If End If End With
ShapeRange.TextFrame возвращает объект TextFrame, который содержит свойства выравнивания и привязки для указанной формы.
Worksheets(1).Shapes(1).TextFrame _ .HorizontalAlignment = xlHAlignJustify
ShapeRange.TextFrame2 возвращает объект TextFrame2, содержащий форматирование текста для указанного диапазона фигур.
ShapeRange.ThreeD возвращает объект ThreeDFormat, содержащий свойства форматирования 3D-эффекта для указанной формы.
Установить myDocument = Worksheets (1) с помощью myDocument.Shapes (1) .ThreeD .Visible = True .Depth = 50 .ExtrusionColor.RGB = RGB ( 255, 100, 255) 'Значение RGB для пурпурного .SetExtrusionDirection msoExtrusionTop. PresetLightingDirection = msoLightingLeft End With
ShapeRange.Title возвращает или задает заголовок альтернативного текста, связанный с указанным диапазоном фигур.
ShapeRange.Top возвращает или задает значение Single, представляющее расстояние в точках от верхнего края самой верхней фигуры в диапазоне фигур до верхнего края листа. .
ShapeRange.Type возвращает значение MsoShapeType, представляющее тип фигуры.
ShapeRange.VerticalFlip true, если указанная фигура перевернута вокруг вертикальной оси.
Установить myDocument = Worksheets (1) For Each s In myDocument.Shapes If s.HorizontalFlip Then s. Flip msoFlipHorizontal If s.VerticalFlip Then s.Flip msoFlipVertical Next
ShapeRange.Vertices возвращает координаты вершин указанного рисунка произвольной формы (и контрольных точек для кривых Безье) в виде серии координатных пар. Вы можете использовать массив, возвращаемый этим свойством, в качестве аргумента метода AddCurve или AddPolyLine.
Установите myDocument = Worksheets (1) с помощью myDocument.Shapes (1) vertArray = .Vertices x1 = vertArray (1, 1) y1 = vertArray (1, 2) MsgBox "Координаты первой вершины:" & x1 & "," & y1 End With
ShapeRange.Visible возвращает или задает значение MsoTriState, определяющее, является ли объект видимым.
ShapeRange.Width возвращает или устанавливает значение Single значение, представляющее ширину объекта в пунктах.
Shapes.Count возвращает значение типа Long, представляющее количество объектов в коллекции.
Shapes.Parent возвращает родительский объект для указанного объекта. Только для чтения.
Shapes.Range возвращает объект ShapeRange, представляющий подмножество фигур в коллекции Shapes.
Dim arShapes () As Variant Dim objRange As Object arShapes = Array ("Oval 4", "Rectangle 5") Set objRange = ActiveSheet.Shapes.Range (arShapes)
VBA Coding With Shape Objects
In this comprehensive guide, you will be learning all the ways you can create and manipulate shapes with VBA macros.
Shapes are objects you can insert into your spreadsheet through the Insert Tab via the Shapes gallery button. These objects can add visualizations to your dashboards, store text, or even serve as buttons to launch macro code.
Here is an outline of the topics covered in this guide:
Creating A New Shape With AddShape()
To create a shape object in Excel using VBA, you must call the AddShape function.
The AddShape function has 4 required inputs in order to generate a new shape:
-
Type — Name of the type of shape you wish to generate
-
Left — Where on the spreadsheet the left side of the shape should be located
-
Top — Where on the spreadsheet the top of the shape should be located
-
Width — How wide your shape should be
-
Height — How tall your shape should be
Here is a snippet of VBA code showing how to create 2 shapes and store the newly created shape to a variable for easy reference later on in your code.
Sub CreateShape()
Dim shp1 As Shape
Dim shp2 As Shape
‘Create & Store New Shape to Variable
Set shp1 = ActiveSheet.Shapes.AddShape(msoShape16pointStar, _
ActiveCell.Left, ActiveCell.Top, 80, 27)
‘Create & Store New Shape to Variable (use Enum Code)
Set shp2 = ActiveSheet.Shapes.AddShape(94, _
ActiveCell.Left, ActiveCell.Top, 80, 27)
End Sub
Continue reading through the next few sections to learn how to determine the type, size, and position values you should be using to create your desired shape.
Choosing A Shape Type
There are a TON of shape types available to you through VBA. There are so many in fact, that I have painstakenly gone through and visually cataloged them for your ease in the below slide show.
Once you have determined which shape you would like to create, grab either the shape textual name or the enumeration number. You will use this MSOAutoShapeType reference to code the exact shape you want.
If you have a shape already created on your spreadsheet, you can use the following code to figure out its enumeration code that you can reference in your VBA code.
Sub DetermineShapeType()
‘PURPOSE: Display The Shape Type of Selected Shape
‘SOURCE: www.TheSpreadsheetGuru.com
Dim ActiveShape As Shape
Dim UserSelection As Variant
‘Pull-in what is selected on screen
Set UserSelection = ActiveWindow.Selection
‘Determine if selection is a shape
On Error GoTo NoShapeSelected
Set ActiveShape = ActiveSheet.Shapes(UserSelection.Name)
On Error Resume Next
‘Tell User the Shape Type Enumeration Number
MsgBox «The Select Shape Type = » & ActiveShape.AutoShapeType
Exit Sub
‘Error Handler
NoShapeSelected:
MsgBox «You do not have a shape selected!»
End Sub
Determining Shape Position
There are two properties you can modify to change the location of a shape on the spreadsheet with VBA. These two properties are the Left and Top values of the shape.
If you are unsure what the size of your shape should be, there are two popular ways you can size your shape:
Method 1: You can base it on the left and top positions of a cell on your spreadsheet.
The following VBA code shows you how to use the Left value of Cell B1 and the Top value of Cell B10 to reposition the rectangle shape that is created.
Sub ShapePositionFromCell()
Dim shp As Shape
‘Create Shape
Set shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, _
Range(«B1»).Left, Range(«B10»).Top, 100, 50)
End Sub
Method 2: You can position the shape to your liking manually on the spreadsheet and read the left and top positions using VBA.
The following VBA code will output a message box that displays the Left and Top positions of a currently selected shape (ActiveShape).
Sub DetermineShapePosition()
‘PURPOSE: Display Selected Shape’s Position
‘SOURCE: www.TheSpreadsheetGuru.com
Dim ActiveShape As Shape
Dim UserSelection As Variant
‘Pull-in what is selected on screen
Set UserSelection = ActiveWindow.Selection
‘Determine if selection is a shape
On Error GoTo NoShapeSelected
Set ActiveShape = ActiveSheet.Shapes(UserSelection.Name)
On Error Resume Next
‘Tell User the Shape Position Values
MsgBox «Left Position = » & ActiveShape.Left & vbNewLine & _
«Top Position = » & ActiveShape.Top
Exit Sub
‘Error Handler
NoShapeSelected:
MsgBox «You do not have a shape selected!»
End Sub
Determining Shape Size
There are two properties you can modify to change the size of a shape with VBA. These two properties are the Width and Height values of the shape.
If you are unsure what the size of your shape should be, there are two popular ways you can size your shape:
Method 1: You can base it on the size of a range of cells
Sub ShapeSizeFromRange()
Dim shp As Shape
Dim rng As Range
‘Provide Range for Shape Size
Set rng = Range(«A1:C4»)
‘Create Shape
Set shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, _
ActiveCell.Left, ActiveCell.Top, rng.Width, rng.Height)
End Sub
Method 2: You can create the shape to your liking manually and read the width and height using VBA
Sub DetermineShapeSize()
‘PURPOSE: Display Selected Shape’s Size
‘SOURCE: www.TheSpreadsheetGuru.com
Dim ActiveShape As Shape
Dim UserSelection As Variant
‘Pull-in what is selected on screen
Set UserSelection = ActiveWindow.Selection
‘Determine if selection is a shape
On Error GoTo NoShapeSelected
Set ActiveShape = ActiveSheet.Shapes(UserSelection.Name)
On Error Resume Next
‘Tell User the Shape Position Values
MsgBox «Width = » & ActiveShape.Width & vbNewLine & _
«Height = » & ActiveShape.Height
Exit Sub
‘Error Handler
NoShapeSelected:
MsgBox «You do not have a shape selected!»
End Sub
Text Formatting
Sub CreateShapeWithText()
Dim shp As Shape
‘Create & Store New Shape to Variable
Set shp = ActiveSheet.Shapes.AddShape(msoShape16pointStar, _
ActiveCell.Left, ActiveCell.Top, 80, 27)
‘Add Text To Shape
shp.TextFrame2.TextRange.Text = «My Awesome Shape!»
‘Bold/Italicize/Underline Text
shp.TextFrame2.TextRange.Font.Bold = True
shp.TextFrame2.TextRange.Font.Italic = True
shp.TextFrame2.TextRange.Font.UnderlineStyle = msoUnderlineDottedLine
‘Change Text Color
shp.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(225, 140, 71)
‘Change Text Size
shp.TextFrame2.TextRange.Font.Size = 14
‘Center Align Text
shp.TextFrame.HorizontalAlignment = xlHAlignCenter
shp.TextFrame.VerticalAlignment = xlVAlignCenter
End Sub
Fill Color & Borders
Sub CreateShapeWithBorder()
Dim shp As Shape
‘Create & Store New Shape to Variable
Set shp = ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, _
ActiveCell.Left, ActiveCell.Top, 80, 27)
‘Light Orange Fill
shp.Fill.ForeColor.RGB = RGB(253, 234, 218)
‘Add Dotted Border
shp.Line.DashStyle = msoLineDashDotDot
‘Dark Orange Border
shp.Line.ForeColor.RGB = RGB(252, 213, 181)
‘Adjust Border Thickness
shp.Line.Weight = 2
‘Remove Border
shp.Line.Visible = False
End Sub
Change Shape Type
If you are looking to change the shape type of an existing type, you can do so by setting the AutoShapeType to a different shape type value.
Sub ChangeShapeType()
Dim shp As Shape
‘Store specific shape on spreadsheet to a variable
Set shp = ActiveSheet.Shapes(«Shape1»)
‘Change shape type to oval
shp.AutoShapeType = msoShapeOval
End Sub
Create Your Own Macro Button With VBA Code
I personally cannot stand the native Excel form control button. It looks so outdated and really makes your spreadsheets look unprofessional. That is why I prefer to use VBA code to create a shape that looks like a button.
I thought this would be a great example to show you a real-world coding example where I need to create and format a shape to have a specific appearance. The following VBA macro code puts everything we have covered in this guide together and provides you with some sample code that comprises of a true shape-building solution.
Sub Create_Button()
‘PURPOSE: Creates a SpreadsheetGuru macro button shape
‘SOURCE: www.TheSpreadsheetGuru.com
Dim bttn As Shape
‘Create & Position Macro Button
Set bttn = ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, _
ActiveCell.Left, ActiveCell.Top, 80, 27)
‘Modify Text Formatting
With bttn.TextFrame2.TextRange
.Text = «Macro»
.Font.Bold = msoTrue
.Font.Fill.ForeColor.RGB = RGB(0, 0, 0)
.Font.Size = 14
End With
‘Center Alignment
bttn.TextFrame.HorizontalAlignment = xlHAlignCenter
bttn.TextFrame.VerticalAlignment = xlVAlignCenter
‘Light Gray Fill
bttn.Fill.ForeColor.RGB = RGB(217, 217, 217)
‘No Border
bttn.Line.Visible = msoFalse
End Sub
Loop Through All Shapes Of Specific Type
If you need to target a specific shape type on your spreadsheet, you can create a loop that tests the AutoShapeType value to filter your results.
The following VBA code example loops through all shape objects in the currently selected spreadsheet and only changes the fill color of the rectangle shapes.
Sub ChangeRectangleShapes()
Dim shp As Shape
‘Loop through each shape on ActiveSheet
For Each shp In ActiveSheet.Shapes
‘Only modify rectangle shapes
If shp.AutoShapeType = msoShapeRectangle Then
shp.Fill.ForeColor.RGB = RGB(253, 234, 218)
End If
Next shp
End Sub
I Hope This Microsoft Excel Article Helped!
Hopefully, I was able to explain how you use VBA code to create and format shapes on your Excel spreadsheets. If you have any questions about these techniques or suggestions on how to improve them, please let me know in the comments section below.
About The Author
Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.
Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and I hope to see you back here soon!
— Chris
2006 г.
Chart, ChartObject, Shape, Picture
- Как добавить Chart в отдельный лист книги? Как внедрить Chart в лист книги?
- Как указать источник данных объекту Chart?
- Как получить доступ к ряду (Series) Chart?
- Как добавить новый ряд (Series) в Chart?
- Как изменить цвет серии в Chart?
- Как изменять заголовки Chart и его осей?
- Как назначить подписи значениям оси Х (ось категорий) из области ячеек?
- Как убрать легенду из Chart?
- Как добавить в лист объект Shape и записать в него текст?
- Как изменить цвет линии и фона Shape?
- Как сгруппировать несколько объектов Shape на листе?
- Как вставить в лист картинку?
- Как изменить размер картинки и вписать ее в размер определенной области ячеек?
- Как изменить яркость или контрастность картинки?
- Как добавить картинке гиперссылку?
- Полезные ссылки
Пожалуй, самым популярным использованием Excel является применение его для построения диаграмм (Chart). Это заметно по большому количеству примеров, статей и различных FAQ в Интернете по этой теме.
Chart Object
ChartObject Object Model
Shapes Collection Object Model
Chart Class
Как добавить Chart в отдельный лист книги? Как внедрить Chart в лист книги?
Chart может существовать как отдельный лист книги, так и как внедренный в лист объект ChartObject. Принципиальная разница только в том, ChartObject — это уже объект Shape, содержащий в себе Chart.
Чтобы добавить Chart как отдельный лист книги, нужно воспользоваться методом Add коллекции Sheets.
var
oChart: _Chart;
oSheet: _Worksheet;
...
oChart := XL.Sheets.Add(EmptyParam, oSheet, 1, xlChart, lcid) as _Chart;
Внимание! Не пытайтесь добавить Chart, используя коллекцию Charts — вы получите OLE исключение, т.к. Charts — это коллекция-подмножество Sheets, содержащее ссылки на листы Chart.
Чтоб добавить Chart, как внедренный в лист объект, можно воспользоваться методом Add коллекции листа ChartObjects (здесь существует возможность сразу задать координаты и размеры внедряемого Chart, как будто это объект Shape).
oChart := (oSheet.ChartObjects(EmptyParam, lcid) as ChartObjects).Add( oSheet.Range['B9', EmptyParam].Left, oSheet.Range['B9', EmptyParam].Top + 8, oSheet.Range['I9', EmptyParam].Left - oSheet.Range['B9', EmptyParam].Left, oSheet.Range['B30', EmptyParam].Top - oSheet.Range['B9', EmptyParam].Top).Chart as _Chart;
Внимание! При преобразовании Chart в ChartObject (или наоборот) лист Chart (или объект ChartObject) исчезнет (будет утерян), поэтому необходимо всегда получать ссылку на новый объект Chart, возвращаемый функцией Locate.
Charts
Location Method
How to: Add Chart Controls to Worksheets
Как указать источник данных объекту Chart?
Для указания источника данных, можно воспользоваться методом SetSourceData объекта Chart или (мне кажется, что это даже удобнее) методом ChartWizard.
var oRng: ExcelRange; ... oRng := oSheet.Range['E2:H6', EmptyParam]; // Указываем источник данных методом SetSourceData with oChart do begin SetSourceData(oRng, xlColumns); // источник данных и PlotBy ChartType := xl3dColumn; // тип диаграммы end; // Указываем источник методом ChartWizard, в котором можно сразу // задать многие параметры диаграммы oChart.ChartWizard( oRng, // Source: OleVariant; xl3dColumn, // Gallery: OleVariant; EmptyParam, // Format: OleVariant; // данные серий - в колонках xlColumns, // PlotBy: OleVariant; EmptyParam, // CategoryLabels: OleVariant; EmptyParam, // SeriesLabels: OleVariant; True, // HasLegend: OleVariant; 'Sales', // Title: OleVariant; EmptyParam, // CategoryTitle: OleVariant; 'у.е.', // ValueTitle: OleVariant; EmptyParam, // ExtraTitle: OleVariant; lcid);
SetSourceData Method
ChartWizard Method
Как получить доступ к ряду (series) Chart?
Например, в цикле присвоим всем сериям новое имя.
for i := 1 to (oChart.SeriesCollection(EmptyParam, lcid) as SeriesCollection).Count do (oChart.SeriesCollection(i, lcid) as Series).Name := Format('="Q%d"', [i]);
Обратиться к серии (ряду) можно не только по индексу, но и по имени, например
(oChart.SeriesCollection('Q1', lcid) as Series).Interior.Color := RGB(0, 0, 255);
SeriesCollection Collection Object
Series Object
Как добавить новый ряд (Series) в Chart?
with (oChart.SeriesCollection(EmptyParam, lcid) as SeriesCollection).NewSeries do begin Values := oSheet.Range['H2', 'H6']; Name := '="Q4"'; end;
Также можно воспользоваться методом Extend, который «расширяет» область данных диаграммы.
NewSeries Method
Extend Method
Как изменить цвет серии в Chart?
with (oChart.SeriesCollection(1, lcid) as Series).Interior do begin Color := RGB(0, 0, 255); Pattern := xlSolid; end;
Interior Property
Border Property
Fill Property
Как изменять заголовки Chart и его осей?
Например, так:
// Заголовок диаграммы HasTitle[lcid] := True; ChartTitle[lcid].Characters[EmptyParam, EmptyParam].Text := 'Sales'; // Ось Х - заголовка нет (Axes(xlCategory, xlPrimary, lcid) as Axis).HasTitle := False; // Оси Y - заголовок "у.е." (Axes(xlValue, xlPrimary, lcid) as Axis).HasTitle := True; (Axes(xlValue, xlPrimary, lcid) as Axis).AxisTitle. Characters[EmptyParam, EmptyParam].Text := 'у.е.'; (Axes(xlValue, xlPrimary, lcid) as Axis).AxisTitle.Orientation := xlUpward;
Axes Method
Как назначить подписи значениям оси Х (ось категорий) из области ячеек?
Для отображения подписей оси X предназначено свойство XValues объекта Series.
// значения по категориям (oChart.SeriesCollection(1, lcid) as Series).XValues := oSheet.Range['C2:C6', EmptyParam];
XValues Property
Как убрать легенду из Chart?
Легенду можно просто «спрятать», указав, что ее «нет». Также вы можете изменять любые атрибуты легенды (Font, Interior и другие), получив доступ к свойству Legend объекта Chart.
oChart.HasLegend[lcid] := False;
Legend Object
HasLegend
Как добавить в лист объект Shape и записать в него текст?
Объект Shape — это контейнер для многих других объектов, таких как TextBox, PolyLine, ChartObject и др. Также и свойство Comment объекта Range, по возможностям и набору свойств, можно отнести к Shape. Все объекты-наследники Shape содержатся в коллекции Shapes листа.
Внимание! Не забудьте явно указать namespace при присвоении типа объекта Shape, т.к. возможен конфликт с объектом Shape namespace Office:
var
AShape: ExcelXP.Shape;
// или
AShape: Excel2000.Shape;
Примеры:
// Rectangle AShape := ASheet.Shapes.AddShape( msoShapeRectangle, ASheet.Range['A1', EmptyParam].Width / 2, ASheet.Range['A1', EmptyParam].Height, ASheet.Range['D1', EmptyParam].Left - ASheet.Range['A1', EmptyParam].Width / 2, ASheet.Range['D9', EmptyParam].Top - ASheet.Range['A1', EmptyParam].Height ); AShape.TextFrame.Characters(EmptyParam, EmptyParam).Text := 'Rectangle'; // Oval AShape := ASheet.Shapes.AddShape( msoShapeOval, ASheet.Range['E1', EmptyParam].Left, ASheet.Range['F2', EmptyParam].Top, ASheet.Range['I1', EmptyParam].Left - ASheet.Range['E1', EmptyParam].Left, ASheet.Range['F12', EmptyParam].Top - ASheet.Range['F2', EmptyParam].Top ); AShape.TextFrame.Characters(EmptyParam, EmptyParam).Text := 'Oval'; AShape.TextFrame.HorizontalAlignment := xlCenter; AShape.TextFrame.VerticalAlignment := xlCenter; // TextBox AShape := ASheet.Shapes.AddShape( msoTextOrientationVerticalFarEast, ASheet.Range['B1', EmptyParam].Left, ASheet.Range['B11', EmptyParam].Top, ASheet.Range['E1', EmptyParam].Left - ASheet.Range['B1', EmptyParam].Left, ASheet.Range['B18', EmptyParam].Top - ASheet.Range['B10', EmptyParam].Top ); AShape.TextFrame.Characters(EmptyParam, EmptyParam).Text := 'Rhombus'; AShape.TextFrame.HorizontalAlignment := xlCenter; AShape.TextFrame.VerticalAlignment := xlCenter; // Hedgehog AShape := ASheet.Shapes.AddShape( msoShape32pointStar, ASheet.Range['D1', EmptyParam].Left, ASheet.Range['E19', EmptyParam].Top, ASheet.Range['G1', EmptyParam].Left - ASheet.Range['D1', EmptyParam].Left, ASheet.Range['E30', EmptyParam].Top - ASheet.Range['E19', EmptyParam].Top ); AShape.TextFrame.Characters(EmptyParam, EmptyParam).Text := 'Hedgehog'; AShape.TextFrame.HorizontalAlignment := xlCenter; AShape.TextFrame.VerticalAlignment := xlCenter; AShape.TextFrame.Orientation := msoTextOrientationUpward; // 2
Shapes Collection
Shapes
Shape Object
TextFrame Property
ShapeRange Collection
Как изменить цвет линии и фона Shape?
Delphi:
(AShape.Fill as FillFormat).ForeColor.SchemeColor := 41; (AShape.Line as LineFormat).ForeColor.SchemeColor := 62;
C#:
AShape.Fill.ForeColor.SchemeColor = 43; AShape.Line.ForeColor.SchemeColor = 53;
Fill Property
Line Property
Как сгруппировать несколько объектов Shape на листе?
// Сгруппируем все объекты Shapes на листе AShape := (ASheet.DrawingObjects(EmptyParam, lcid) as DrawingObjects).ShapeRange.Group; AShape.Name := 'MyGroup1'; // группировка через вариантный массив V := VarArrayCreate([1, 2], varVariant); // !!! // сгруппируем 2-й и 4-й Shape V[1] := 2; V[2] := 4; AShape := ASheet.Shapes.Range[V].Group; AShape.Name := 'MyGroup2'; // Если заранее известно, какие Shape будут сгруппированы, // то можно и так AShape := ASheet.Shapes.Range[VarArrayOf([2, 4])].Group; AShape.Name := 'MyGroup3'; // Теперь, на закуску, через Selection // Выберем 2-й, 3-й и 4-й Shape ASheet.Shapes.Item(2).Select(True); ASheet.Shapes.Item(3).Select(False); ASheet.Shapes.Item(4).Select(False); // сгруппируем выделенные Shape AShape := (XL.Selection[lcid] as DrawingObjects).ShapeRange.Group; AShape.Name := 'MyGroup4'; // Разгруппировать AShape.Ungroup;
Заметьте, что после того, как объекты Shape были сгруппированы, их количество на листе (Shapes.Count) уменьшится. После «группировки» можно обратиться к отдельному Shape, включенному в группу, используя коллекцию GroupItems объекта Shape, полученного в результате группировки.
Group Method
Regroup Method
Ungroup Method
GroupItems Property
Как вставить в лист картинку?
var AShape: Excel_TLB.Shape; APic: Picture; // Excel_TLB Img: TImage; // ExtCtrls MyFormat: Word; // для копирования картинки в БО AData: THandle; // для копирования картинки в БО APalette: HPALETTE; // для копирования картинки в БО ... // Первый метод // Вставляем картинку из файла с "нулевым" размером в // позицию ячейки B2. "Нулевой" размер потому, что // мы не знаем заранее размера картинки with ASheet.Range['B2', EmptyParam] do AShape := ASheet.Shapes.AddPicture(ExpandFileName('common.gif'), msoFalse, msoTrue, Left, Top, 0, 0); // После вставки получаем ссылку на объект Shape, содержащий // нашу картинку. "Реанимируем" оригинальный размер картинки AShape.ScaleHeight(1, msoTrue, EmptyParam); AShape.ScaleWidth(1, msoTrue, EmptyParam); AShape.Name := 'Picture1'; // Второй метод - вставляем в выделенную ячейку ASheet.Range['C7', EmptyParam].Select; APic := (ASheet.Pictures(EmptyParam, lcid) as Pictures).Insert(ExpandFileName('common.gif'), EmptyParam); APic.Name := 'Picture2'; // Третий метод - вставка через буфер обмена // Загрузим картинку с диска в TImage Img.Picture.LoadFromFile(ExpandFileName('common.bmp')); MyFormat := CF_PICTURE; AData := Img.Picture.Bitmap.Handle; APalette := Img.Picture.Bitmap.Palette; // и помещаем в буфер обмена Img.Picture.SaveToClipboardFormat(MyFormat, AData, APalette); Clipboard.SetAsHandle(MyFormat, AData); // из буфера обмена вставим в ячейку D12 ASheet.Paste(ASheet.Range['D12', EmptyParam], EmptyParam, lcid);
Все добавленные картинки будут включены в коллекцию Shapes листа.
AddPicture Method
Worksheet.Pictures Method
Paste Method
Как изменить размер картинки и вписать ее в размер определенной области ячеек?
Если пытаться изменять размер картинки, то она, по умолчанию, будет менять размер пропорционально. Такую особенность задает свойство LockAspectRatio объекта Shape. Если установить LockAspectRatio равным msoFalse, то картинка будет менять размеры непропорционально.
// Картинка будет вписана в область D12:J18 с сохранением пропорций AShape.Width := ASheet.Range['K12', EmptyParam].Left - ASheet.Range['D12', EmptyParam].Left; AShape.Height := ASheet.Range['D19', EmptyParam].Top - ASheet.Range['D12', EmptyParam].Top; // Картинка будет вписана во всю область D12:J18 без сохранения пропорций AShape.LockAspectRatio := msoFalse; AShape.Width := ASheet.Range['K12', EmptyParam].Left - ASheet.Range['D12', EmptyParam].Left; AShape.Height := ASheet.Range['D19', EmptyParam].Top - ASheet.Range['D12', EmptyParam].Top;
LockAspectRatio Property
Как изменить яркость или контрастность картинки?
(AShape.PictureFormat as PictureFormat).Brightness := 0.25; // 25% яркости (AShape.PictureFormat as PictureFormat).Contrast := 0.75; // 75% контрастность
PictureFormat Property
Как добавить картинке гиперссылку?
Смотрите » Как добавить URL? Как сделать гиперссылку для рисунка?»
Hyperlink Property
Полезные ссылки
Creating Charts in Excel 2003 Using Visual Basic for Applications Code
How To Create Excel Chart w/OLE Automation from Visual Basic
Microsoft Excel Charting FAQs
Excel Charts and Graphs Help from Mr Excel
Excel Chart Tips
How to automate Microsoft Excel from Microsoft Visual C# .NET
How To Automate Excel from an HTML Web Page Using JScript
VBA Samples for Working with Excel 2003 Worksheets
XL97: How to Create a GIF File from a Microsoft Excel Chart
COM Tips & Tricks