Как нарисовать линию в vba excel

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 на заданный в аргументе угол. Синтаксис:

На следующем шаге мы остановимся на объекте 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 для указанных элементов равными пустой строке «».
Дополнительно для элемента управления Frame установите свойство SpecialEffect к fmSpecialEffectFlat, тогда рамка исчезнет и вы сможете воспользоваться свойством BackColor для установки необходимого цвета этого элемента, который будет теперь являться линией, если соотношение размеров его ширины к высоте значительно (>> 10). Если необходима пунктирная или линия по образцу, то создайте соотвествующую картинку в формате BMP, GIF, JPG, ICO, CUR, WMF, EMF или DIB и установите на нее ссылку через свойство Picture.
Если воспользуетесь свойством Label, то достаточно установить свойство BorderStyle = fmBorderStyleSingle, а свойство Height или Width установить равным 1. Тогда вы получите тонкую линию. Чтобы получить толстую линию или линию по образцу используйте свойства BackColor или Picture, как и описано выше для Frame Control. Кроме того, у элемента Label имеется свойство BackStyle, которое позволяет установить прозрачность (frmBackStyleReansparent) для цвета на вставленной картинке Picture, который совпадает с цветом BackColor элемента Label. Это дает некоторые преимущества при отображении данного элемента.
С помощью данных элементов управления можно отобразить в окне UserForm горизонтальные или вертикальные линии. Для наклонных линий с некоторой натяжкой можно использовать элемент Label, как описано выше, установив путь для его свойства Picture к файлу изображения, содержащему картинку наклонной линии и воспользовавшись свойством BackStyle для установки прозрачности фона на этой картике.
Альтернативным способом является использование WinAPI, но это уже для знатоков программирования. К тому же и для этого способа имеются некоторые проблемы, связанные с восстановлением изображения в окне формы, если оно было частично или полностью перекрыто другим окном, так как нарисованные вами линии с применением WinAPI исчезнут и возникнет необходимость их перерисовки.
Короче, эспериментируйте!



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

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

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

Пример 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. Копирование, перемещение и поворот фигур.


Понравилась статья? Поделить с друзьями:
  • Как нарисовать лепестковую диаграмму в excel
  • Как нарисовать куб в word
  • Как нарисовать круговую диаграмму в excel пошагово для начинающих
  • Как нарисовать круг excel
  • Как нарисовать кроссворд в microsoft word