Как рисовать в vba excel
Впрочем, туда Вас и следовало послать.
Ну а если Вас не устраивают приведённые примеры - идите Вы в Google
Последний раз редактировалось EducatedFool; 26.09.2009 в 18:56 .Спасибо!
Буду разбираться.
Но, вообще-то я планировал без формы, а с созданием растра в памяти
Стоит задача: средствами VBA создать растровое изображение |
Если не секрет, кто поставил такую задачу?
Есть ли ограничения по применяемым средствам?
Я, к примеру, использую CorelDRAW для формирования графических файлов (можно работать с CorelDRAW непосредственно - в него встроен VBA, можно из любого другого приложения, подключив библиотеку CorelDRAW)
Вот пример кода VBA для CorelDRAW, который создаёт несколько папок, в каждой из которых формируются растровые изображения отдельных букв:
Будете смеяться, но мне наоборот, в CorelDraw вставить надо.
Растр не рисуется в обычном понимании, а строится на основании определенных данных данных. Вроде карты по x,y,z, где z отображается цветом. Детализация довольно высокая и рисовать непосредственно в CorelDraw не реально – сотни тысяч прямоугольноков разного цвета.
А можно я потом задам вам вопрос про программный вывод текста в CorelDraw?
Макрорекордер его не пишет, а я не профессионал.
Будете смеяться, но мне наоборот, в CorelDraw вставить надо. |
Ну тогда только программы от Corel и надо использовать.
Детализация довольно высокая и рисовать непосредственно в CorelDraw не реально – сотни тысяч прямоугольноков разного цвета. |
А Вы пробовали? Всё реально.
В Вашем случае можно использовать VBA в приложении Corel PHOTO-PAINT - формировать изображение попиксельно (или рисовать его из прямоугольников)
Будут подробности по заданию (откуда брать данные, что надо получить в результате) - попробую помочь.
Фигуры или объекты рисования представлены тремя различными объектами:
Объект | Описание |
---|---|
Коллекция форм | Используйте для создания фигур и итерации через все фигуры на заданной таблице. |
Коллекция ShapeRange | Используйте для изменения нескольких фигур так же, как вы работаете с несколькими фигурами в пользовательском интерфейсе. |
Объект Shape | Используйте для формата или изменения одной фигуры. |
Задание свойств для фигуры
Многие параметры форматирования фигур не устанавливаются с помощью свойств, применяемых непосредственно к объекту Shape или ShapeRange. Вместо этого связанные атрибуты фигур группируются во вспомогательных объектах, таких как объект FillFormat, который содержит все свойства, связанные с заливкой фигуры, или объект LinkFormat, который содержит все свойства, являющиеся уникальными для связанных объектов OLE.
Чтобы задать свойства для фигуры, необходимо сначала вернуть объект, представляющий набор соответствующих атрибутов фигуры, а затем задать свойства этого возвращенного объекта. Например, можно использовать свойство Fill, чтобы вернуть объект FillFormat, а затем задать свойство ForeColor объекта FillFormat, чтобы настроить цвет заливки переднего плана для указанной фигуры, как показано в следующем примере.
Применение свойства или метода к нескольким фигурам одновременно
В пользовательском интерфейсе можно выполнить некоторые операции с несколькими выбранными фигурами. например, можно выбрать несколько фигур и сразу установить все их отдельные заполнения. Вы можете выполнять другие операции, выбрав только одну фигуру; например, изменить текст в форме можно только в том случае, если выбрана одна фигура.
В Visual Basic есть два способа применения свойств и методов к наборам фигур. Эти два способа позволяют выполнять все операции, которые можно осуществить с отдельной фигурой, для диапазона фигур независимо от того, можно ли выполнять эту операцию в пользовательском интерфейсе.
Если операция применяется для нескольких выделенных фигур в пользовательском интерфейсе, вы можете выполнить аналогичную операцию в Visual Basic, создав коллекцию ShapeRange, содержащую нужные фигуры, и применив соответствующие свойства и методы непосредственно к коллекции ShapeRange.
Если операция не применяется для нескольких выделенных фигур в пользовательском интерфейсе, вы по-прежнему можете выполнить операцию в Visual Basic, осуществив циклический просмотр коллекции Shapes или коллекции ShapeRange, содержащей нужные фигуры, и применив соответствующие свойства и методы к отдельным объектам Shape в коллекции.
Многие свойства и методы, применяемые к объекту Shape и коллекции ShapeRange, завершаются ошибкой, если применяются к определенным типам фигур. Например, применение свойства TextFrame к фигуре, которая не может содержать текст, приводит к ошибке.
Если вы не уверены в том, что каждая из фигур в коллекции ShapeRange может иметь определенное свойство или метод, примененные к ней, не применять свойство или метод к коллекции ShapeRange. Если вы хотите применить одно из этих свойств или методов к коллекции фигур, нужно выполнить циклический просмотр коллекции и протестировать каждую отдельную фигуру, чтобы убедиться в соответствии ее типа перед применением к ней свойства или метода.
Создание коллекции ShapeRange, которая содержит все фигуры на листе
Вы можете создать объект ShapeRange, содержащий все объекты Shape на листе, выбрав фигуры, а затем используя свойство ShapeRange, чтобы вернуть объект ShapeRange, содержащий выбранные фигуры.
В Microsoft Excel аргумент Index **** не является необязательным для свойства Range коллекции Shapes, поэтому без аргумента нельзя использовать это свойство для создания объекта ShapeRange, содержащего все фигуры в коллекции Shapes.
Применение свойства или метода к коллекции ShapeRange
Если вы можете выполнить в пользовательском интерфейсе операцию для нескольких выделенных фигур одновременно, можно выполнить аналогичное программное действие, создав коллекцию ShapeRange и затем применив к ней соответствующие свойства или методы. В следующем примере строится диапазон фигур, содержащий фигуры с именами "Большая звезда" и "Маленькая звезда", и применяется к ним myDocument заполнение градиента.
Ниже приведены общие руководства по поведению свойств и методов при их применении к коллекции ShapeRange.
Применение метода к коллекции аналогично применению метода к каждому отдельному объекту Shape в этой коллекции.
Настройка значения свойства коллекции аналогична настройке значения свойства каждой отдельной фигуры в этом диапазоне.
Свойство коллекции, возвращающее константу, возвращает значение свойства для отдельной фигуры в коллекции, если все фигуры в коллекции имеют одинаковое значение для этого свойства. Если у фигур в коллекции разные значения свойства, возвращается "смешанная" константа.
Свойство коллекции, возвращающее простой тип данных (например, Long, Single или String), возвращает значение свойства для отдельной фигуры, если все фигуры в коллекции имеют одинаковое значение для этого свойства.
Значение некоторых свойств можно вернуть или установить только в том случае, если в коллекции содержится только одна фигура. Если коллекция содержит несколько фигур, возникает ошибка времени запуска. Обычно это происходит в случае возвращения или настройки свойств, если аналогичные действия в пользовательском интерфейсе возможны только для одной фигуры (такие действия, как изменение текста в фигуре или изменение точек полилинии).
Предшествующие руководства также применяются при настройке свойств фигур, сгруппированных во вспомогательных объектах коллекции ShapeRange, например в объекте FillFormat. Если вспомогательный объект представляет операции, которые можно выполнять над несколькими выделенными объектами в пользовательском интерфейсе, вы сможете вернуть объект из коллекции ShapeRange и настроить его свойства.
Например, вы можете использовать свойство Fill, чтобы вернуть объект FillFormat, представляющий заливки всех фигур в коллекции ShapeRange. Настройка свойств этого объекта FillFormat задает такие же свойства для всех отдельных фигур в коллекции ShapeRange.
Циклический просмотр коллекций Shapes или ShapeRange
Даже если вы не можете выполнить операцию по нескольким фигурам в пользовательском интерфейсе одновременно, выбрав их и затем используя команду, вы можете выполнить эквивалентное действие программным путем циклинга через коллекцию Shape или ShapeRange, которая содержит фигуры, с которых необходимо работать, применяя соответствующие свойства и методы к отдельным объектам Shape в коллекции.
В следующем примере окрашиваются все фигуры и изменяется цвет переднего плана myDocument для каждой фигуры AutoShape.
В следующем примере создается коллекция ShapeRange, которая содержит все выбранные в настоящее время фигуры в активном окне и задает цвет переднего плана для каждой выбранной формы.
Выравнивание, распространение и группировка фигур в ShapeRange
Используйте методы выравнивания и распределения, чтобы расположить набор фигур относительно друг друга или относительно документа, который их содержит.
Используйте метод Group или метод Regroup, чтобы сформировать единую групповую фигуру из набора фигур.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Имеется древняя проблема с отрисовкой линий окружностей и эллипсов на формах UserForm в VBA. На формах Visual Basic с отрисовкой этих примитивов нет никаких проблем, а на формах VBA они не рисуются. Что можно использовать чтобы начертить простые пояснительно-контрольные схемы расчётов на формах 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
Это то, что тебе надо?
А вот ещё один вариант!
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
Спасибо за програмки! Обязательно попробую их применить.
А не подскажите ли Вы где можно взять билиотеку DLL с функциями для вычислений произведения, обращения, транспонирования матриц и решения систем линеёных уравнений, которую можно подключить к VBA и использовать её функции в программах? Например для MathCAD2001 есть пакет Numeric Recipes в котором есть замечательная функция gaussjSolve(A,b), а в самом MathCAD2001 есть функция lsolve(M,v) но как ими воспользоваться в программе 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
На этом уроке вы узнаете, как создать объекты Graphics (Область рисования), Реn (Перо) и Brush (Кисть), необходимые для рисования.
Создание объектов Graphics , Реn и Brush
Прежде чем использовать графические методы класса System.Drawing.Graphics для рисования примитивных фигур, вы должны в вашем коде создать объекты Graphics (Область рисования), Реn (Перо) и Brush (Кисть).
-
Объект Graphics(Область рисования) позволяет выбрать в качестве области рисования определенный элемент управления и обладает методами рисования графических фигур.Объект Graphics можно создать тремя различными способами.
Первый способ состоит в использовании метода CreateGraphics() формы или элемента управления, на котором надо отобразить графику. Например, создадим объект Graph1 типа Graphics, а затем укажем определенный элемент управления в качестве области рисования. Обычно в качестве области рисования выбирается размещенное на форме графическое поле (например, PictureBox1):
Второй способ используется для создания растрового изображения, которое можно сохранить как графический файл. Сначала необходимо объявить создание растрового изображения Image1 определенного размера, затем объявить создание объекта Graph1 типа Graphics из растрового изображения Image1 и, наконец, присвоить свойству Image формы или элемента управления (например, PictureBox1.Image)значение Image1.
Третий способ использует событие Paint формы или элемента управления, которое происходит при их создании или обновлении. В обработчике этого события одним из аргументов является e типа System.Windows.Forms.PaintEventArgs. В программном коде обработчика события можно объявить создание объекта Graph1 типа Graphics как свойства аргумента e.
Затем, если необходимо, можно установить новые значения цвета и ширины линии, например:
Если необходимо, можно будет поменять цвет закраски (например, на пурпурный):
Объекты Pen, Brush и Graphics потребляют системные ресурсы. Поэтому, после окончания их использования, необходимо всегда вызывать Dispose()
Выбор цвета
Цвет устанавливается как значение свойства Color. Можно установить цвет с использованием нескольких десятков цветовых констант. Ниже приведены примеры установки зеленого цвета для объекта Pen1 (перо) и желтого цвета для объекта Brush1 (кисть).
Для установки цвета в 24-битовой палитре цветов RGB используется метод Color.FromArgb(Red, Green, Blue), аргументами которого являются три числа в диапазонах от 0 до 255 (интенсивность красного, зеленого и синего цветов). Например, так можно установить пурпурный цвет для кисти Brush1.
Цвет пера или кисти можно установить и с использованием элемента управления ColorDialog, для этого данный элемент управления необходимо поместить на форму и вести в программный код следующие строки:
После заполнения первой строки программного кода появится диалоговое окно Цвет. Вторая строка программного кода присваивает перу цвет, который можно выбрать в диалоговом окне Цвет с помощью мыши из палитры 48 основных цветов.
В этом уроке вы узнали, как создать объекты Graphics (Область рисования), Реn (Перо) и Brush (Кисть), необходимые для рисования, как выбрать цвет.
На следующем уроке мы познакомимся с графическими методами для рисования геометрических фигур.
Читайте также: