Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Сетевой график на VBA (Excel)


Автор: Trinitron 31.8.2005, 09:34
Подскажите, можно рассчитать и нарисовать сетевой график в Excel на VBA. Если можно, то как рисовать его? Спасибо заранее.

Автор: Naghual 31.8.2005, 09:39
Рассчитать в зависимости от чего?
Нарисовать что?

Автор: Trinitron 31.8.2005, 09:45
Есть разные виды работ со своими трудозатратами (продолжительность, стоимость). Надо расположить их по нужной последовательности (может быть разветвленная схема) и определить с какой даты будет начинаться каждая работа. Если какая-либо работа затянулась, то скорректировав дату её начало сразу было видно, когда окончится самая последняя работа). А графически это выглядит в виде разветвленной схемы - линий (могут быть прямыми или ломаными), окружностями с надписями внутри, надписи над или под линиями. Примерно так
Добавлено @ 09:50
Забыл, линии по длине должны быть в зависимости от продолжительности работ

Автор: Naghual 31.8.2005, 09:51
А исходные данные в каком виде и где хранятся?

Автор: Akina 31.8.2005, 10:08
Trinitron
А зачем изобретать велосипед? это же штатная функция систем управления проектами.

Например у нас для такой раскладке при строительстве объекта (впрочем это лишь одна из многочисленных функций, причем не основная) используется комплекс http://www.spiderproject.ru/spider_e.php.

Автор: Trinitron 31.8.2005, 10:36
Спайдер - это слишком круто, также может быть применен Проджек, но это слишком всё наворочено и там много всякого ненужного. Данные в виде таблицы, хотя можно изначально их через какую-то форму вносить
Добавлено @ 10:43
Я на VBA в Excel немного писал, меня тормозит формирование простых графических элементов (линии и окружности) на лист Excel, да ещё вывод в окружность и около линий какого-либо текста

Автор: Staruha 31.8.2005, 10:54
Если тебе нужна диаграмма на основе таблицы,на панели есть мастер диаграмм.

Автор: Trinitron 31.8.2005, 11:11
Да нет, нужет именно сетевой график, который изображается в виде окружностей со связями ввиде линий со стрелками, да ещё с надписями
Это не диаграмма

Автор: Staruha 31.8.2005, 16:18
Если это рисунок.Проще нарисовать.Включаешь на панели Рисунок. Еслми круг ровный не получается,щелкни два раза по нему вылетит диалоговое окно задай размеры.Также поставь Нет заливки .Тогда можно текст писать прямо в ячейки Или можно использовать Вставить текст и убрать границы.

Автор: Naghual 31.8.2005, 17:35
Ну давай пытатся решать твою задачку.
Алгоритм представляеш?

Автор: Staruha 31.8.2005, 20:27
Да я так думаю ,что нужно нарисовать автофигуры с прозрачным фоном.К ним привязать ячейки в которых автоматически меняются значения.

Автор: Alles 1.9.2005, 03:07
Я тоже когдато столкнулся с сабжем. Стандартные элементы Ексела использовать не хотел, что то хотелось аригинальное.
Писал программу обработки логов с BTS. использовал Shapes.
Получилась линейная диаграмма и гистограмма. Если нужен исходник для разбора полетов говори куда выслать.

Автор: Trinitron 2.9.2005, 06:51
Может я что-то не понял, мне надо програмно в нужном место нарисовать, например, линию со стрелкой нужной длины (зависит от продолжительности данной работы), а к ней, т.е. к стрелке, приляпать окружность какого-то постоянного размера, а в ней какой-то текст или вывести значение переменной. А к этой окружности снова линия (прямая или ломаная) со стрелкой и т.д. Математический расчет (т.е. координаты вывода этих всех элементов) я уж осилю, а вот как на рабочий лист Экселя это выводить - никогда не делал. Раньше работал только с выводом значений в ячейки и не более того.

Автор: Alles 2.9.2005, 07:07
Нажми на кнопку запись макроса в Екселе !
Далее создавай любую фигуру, окружность, линию. Можешь потом двигать эти объекты , переименовывать. Затем смотри в теле этого макроса что и как , там будет все. Отразятся буквально все твои действия. Исходи з этого бери нужный тебе кусок ( наприсер размер и привязка к координатам) и используй свои данные.
Имхо самый простой путь.

Автор: Trinitron 2.9.2005, 07:32
Вот!!!!!!!!!!!!
Огромное спасибо тебе, Alles!
Самое смешное - как я сам не догадался до этого smile

Автор: Trinitron 2.9.2005, 08:12
А как можно внутрь нарисованной окружности вывести значение переменной?

Автор: Naghual 2.9.2005, 09:09
Код

ActiveSheet.Shapes("Oval_1").Select
Selection.Characters.Text = "TEST"

Автор: Trinitron 2.9.2005, 10:06
Спасибо, Naqhual, попробую

Автор: Trinitron 2.9.2005, 10:56
Вот пробный фрагмент:

ActiveSheet.Shapes.AddLine(27.75, 63.75, 113.25, 63.75).Select
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
ActiveSheet.Shapes.AddShape(msoShapeOval, 114#, 42#, 42#, 42#).Select
ActiveWorkbook.Names.Add Name:="Дата1", RefersToR1C1:="=""Овал 3"""
ActiveSheet.Shapes.AddLine(156#, 63.75, 213.75, 63.75).Select
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
ActiveSheet.Shapes.AddShape(msoShapeOval, 214.5, 43.5, 40.5, 40.5).Select
ActiveWorkbook.Names.Add Name:="Дата2", RefersToR1C1:="=""Овал 5"""
ActiveSheet.Shapes.AddLine(135#, 84#, 135#, 127.5).Select
ActiveSheet.Shapes.AddLine(135#, 127.5, 185.25, 127.5).Select
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
Selection.ShapeRange.Line.EndArrowheadLength = msoArrowheadLengthMedium
Selection.ShapeRange.Line.EndArrowheadWidth = msoArrowheadWidthMedium
ActiveSheet.Shapes.AddShape(msoShapeOval, 186#, 106.5, 42#, 42#).Select
ActiveWorkbook.Names.Add Name:="Data3", RefersToR1C1:="=""Овал 8"""

ActiveSheet.Shapes("Дата1").Select
Selection.Characters.Text = "12/09/05"


Ругается на неверный параметр в предпоследней строке

Автор: Naghual 2.9.2005, 11:03
Правильно пишет. Нет у тебя овала с таким именем.

Задавать имя нужно так:
Код

ActiveSheet.Shapes.AddShape(msoShapeOval, 114#, 42#, 42#, 42#).Select
Selection.Name = "Дата1"

Автор: Trinitron 2.9.2005, 11:11
Спасибо, Naqhual, всё получилось.

А размер шрифта при выводе в окружность можно изменить?
И последний, похоже на то, вопрос: а как можно на листе эти объекты разом все удалить?

Автор: Naghual 2.9.2005, 11:20
Через коллекцию Shapes в цикле.

Автор: Trinitron 2.9.2005, 11:21
А вот этого я не понял smile
А размер шрифта при выводе в окружность можно изменить?

Автор: Naghual 2.9.2005, 11:36
Что ты не понял? Объяснить как удалить?

Шрифт:
Воспользуйся методом записи макроса!
И все поймеш!

Автор: Trinitron 2.9.2005, 11:39
Если можно, то подскажи примером как удалить нарисованные овалы и линии
Со шрифтом разобрался

Автор: Naghual 2.9.2005, 11:44
Код

    Dim SHP As Shape
    
    For Each SHP In ActiveSheet.Shapes
        SHP.Delete
    Next

Автор: Trinitron 2.9.2005, 11:47
ОГРОМНОЕ тебе СПАСИБО, Naqhual, всё получилось.

Тему можно закрыть.

Автор: vaulin 24.3.2010, 11:39
Пример простенькой программки, которая рисует линию на форме. Данный код необходимо вставить в тело формы (создать форму и нажать F7)

Код

Option Explicit
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function dwMoveTo Lib "gdi32" Alias "MoveToEx" _
    (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _
    ByVal lpPoint As Long) As Long
Private Declare Function dwLineTo Lib "gdi32" Alias "LineTo" _
    (ByVal hdc As Long, ByVal x As Integer, ByVal y As Integer) As Long
Private Declare Function dwGetDC Lib "user32" Alias "GetDC" _
    (ByVal hWnd As Long) As Long
Private Declare Function dwEllipse Lib "gdi32" Alias "Ellipse" _
    (ByVal HDC As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal _
    X2 As Long, ByVal Y2 As Long) As Long
Private Function Draw()
    Dim hForm As Long, hdc As Long
    hForm = FindWindow("ThunderDFrame", Me.Caption)
    hdc = dwGetDC(hForm)
    Call dwMoveTo(hdc, 10, 40, 0)
    Call dwLineTo(hdc, 150, 100)
    Call dwEllipse(HDC, 50, 50, 150, 150)
End Function
Private Sub UserForm_Click()
    Draw
End Sub




Программка рисует на форме VBA Excel линию с координатами точек (10, 40) и (150, 100) после щелчка мыши по панели формы, а также окружность. 

Автор: GWolf 14.12.2010, 14:20
Уважаемый Trinitron, здравствуйте!

А нельзя ли выложить пример реализации "рисовалки"?

Автор: Pavel73 30.9.2013, 17:37
Помогите нужно создать таблицу в Excel. Столбцы: ФИО, Должность, Дата рождения, Несовер. дети г. р., Дата окончания контракта. Нужно что бы когда остается месяц до завершения контракта строка с человеком у которого заканчивается контракт выделялась красным цветом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)