Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

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 из выбранных фигур:

    Объектная переменная myShapeRange не обязательна, можно обратиться непосредственно к возвращенной коллекции, например, присвоив всем ее элементам синий цвет:

    Примеры работы с фигурами

    Пример 1

    Создание пяти разных фигур из кода VBA Excel методом Shapes.AddShape:

    Результат работы кода:

    Фигуры на листе Excel

    Пример 2

    Работа с одной фигурой:

    Пример 3

    Редактирование одновременно нескольких фигур с помощью коллекции ShapeRange:

    Пример 4

    Редактирование одновременно всех фигур на рабочем листе с помощью коллекции ShapeRange:

    Пример 5

    Добавление надписи (текста) на фигуру:

    Результат работы кода:

    Фигура Облако с надписью

    Изменить цвет текста, например на черный, можно двумя способами:

    С константами из коллекции MsoThemeColorIndex вы можете ознакомиться на сайте разработчиков.

    Пример 6

    Удаление фигур с рабочего листа из кода VBA Excel с помощью метода Delete.

    Удаление одной фигуры:

    Удаление нескольких фигур:

    Удаление всех фигур с рабочего листа с помощью цикла:

    В 7 примере рассмотрено удаление всех фигур без цикла.

    Пример 7

    Выделение всех фигур на рабочем листе:

    Выбор всех фигур и удаление выбранного (всех фигур):


    Продолжение темы в статье VBA Excel. Копирование, перемещение и поворот фигур.


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    98 комментариев для “VBA Excel. Работа с фигурами (Shapes)”

    1. ЕвгенияУ

      Евгений,здравствуйте! Еще раз спасибо большое за Вашу помощь.
      Прошу прощения что вновь задаю вопрос,но в этот же документе теперь появилась другая проблема. Как я понимаю она опять-таки связана с макросом.
      Текст при необходимости переносится на вторую строку,но при выводе на печать во всех полях печатается только то что попадает в первую строку.

      1. Евгений

        Здравствуйте, Евгения!
        Попробуйте закомментировать

        и ниже вставить

        1. ЕвгенияУ

          Евгений, здравствуйте! Все сделала — не помогает.
          Выяснила что до того как удалось починить поле «один» на печать выводилось обе строки в полях.

          1. Евгений

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

            1. ЕвгенияУ

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

    2. Здравствуйте. На листе имеется Shapes(1) — диаграмма и Shapes(2) — картинка. Нужно чтобы заливка диаграммы была в виде рисунка с листа и затем удалить связи диаграммы с данными. Сделал как вставку с буфера, но ошибка в строке с меткой 1, как удалить связи не знаю:
      ActiveSheet.Shapes(2).Copy
      With ActiveSheet.Shapes(1).Fill
      1 .UserPicture .Paste
      .TextureTile = msoFalse
      End With

      1. Евгений

        Здравствуйте, Фарит!
        Для заливки можно использовать только изображения с диска:

    3. Алексей

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

      Sub Primer1()
      With ActiveSheet.Shapes
      Set myShape1 = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 400, 40, Worksheets(1).Range("E3") * 72, Worksheets(1).Range("F3") * 72)
      With myShape1
      .Fill.ForeColor.RGB = vbYellow
      .Fill.Transparency = 0.4
      .DrawingObject.Caption = Worksheets(1).Range("B3")
      With myShape1.TextFrame2
      .TextRange.Characters.Font.Size = 45
      .TextRange.Characters.Font.Fill.ForeColor.ObjectThemeColor = msoThemeColorDark1
      End With
      End With
      End With
      End Sub

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

      Спасибо!

    4. Владислав

      Здравствуйте.
      Кнопка с панели формы в MSExcel (не элементы управления) вроде тоже относится к объекту shape.
      Однако не получается изменить цвет заливки. Код vba
      Dim myShape As Shape
      Set myShape = ThisWorkbook.Worksheets("Sheet1").Shapes("Button 6")
      Debug.Print myShapes.Fill.ForeColor.RGB
      myShapes.Fill.ForeColor.RGB = vbYellow 'RGB(255, 0, 0) '15790320 + 10000
      myShapes.Fill.BackColor.RGB = vbYellow 'RGB(255, 0, 0) '15790320 + 10000

      Может подскажите в чём секрет?

      1. Евгений

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

        1. Владислав

          Понял. Спасибо. Может подскажете где найти описание свойств коллекции Buttons/Button листа?
          Set myButton = ThisWorkbook.Worksheets("Sheet1").Buttons("Button 6")
          Debug.Print myButton.Name

          1. Евгений

            Доступные свойства вы можете просмотреть, кликнув по элементу управления формы правой кнопкой мыши и выбрав в контекстном меню «Формат объекта».

    5. Алексей

      Здравствуйте. Есть фигура бублик — msoShapeDonut, к середине этой фигуры надо прикрепить стрелку -msoConnectorStraight своим началом. Т.е. что бы от центра бублика исходила стрелка (для векторной диаграммы). Не могу понять как сделать, у бублика узнаю координаты, вычисляю таким образом середину, прописывают в стрелку бегинХ и бегинУ эту точку, в итоге стрелка сползает непонять куда. Разбирался, не понял нихрена, пытался пересчитать на пункты что то не выходит совсем. Как сделать это? Можно ли как то самому в классе создать фигуру. у которой будет центральная точка что бы привязать к ней? Вот два основных вопроса.
      А ещё свойство ротатион поворачивает относительно центра фигуры, как сделать относительно начала фигуры бегинХ,У? И тот же бублик крутится относительно центра, а самого центра нет:( . Не могу разобраться, помоги

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

    7. Спасибо Евгений, очень полезная статья. Обязательно пригодится в каких-нибудь моих проектах. Хочу опубликовать вариант, если вы не против, который накопал сам. Возможно еще кому-то будет полезно.

      Public Sub PictureToClipboard(ByVal путь As String)
      Dim y As Shape
      'Как раз в следующей строке создается фигура типа картинка (addPicture) c залитая изображением, заданным ссылкой на файл (ПУТЬ). И последние два параметра равные -1 говорят системе, что нужно использовать разрешение самого файла (ширина=-1, высота=-1), а не фигуры. То есть фигура подстраивается под размер файла.
      Set y = Workbooks(dvName).Sheets("Лист2").Shapes.AddPicture(путь, True, False, 0, 0, -1, -1)
      y.Line.Visible = msoFalse
      y.LockAspectRatio = msoFalse
      y.CopyPicture Format:=xlBitmap
      y.Delete
      Set y = Nothing
      End Sub

    Обсуждение закрыто.