powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Управление объектами на диаграмме
25 сообщений из 28, страница 1 из 2
Управление объектами на диаграмме
    #39066911
Роман_1154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Если кто знает, подскажите пожалуйста.
Задача такая: на форме есть объект диаграмма, в которую выводятся расчетные данные. Необходимо на этой диаграмме подсвечивать определенные области по заданным условиям. Решил использовать для этого фигуры с панели рисования - прямоугольники.
Проблема: не знаю как получить доступ к данным - прямоугольникам из программного кода. Необходимо из создавать, удалять, менять размер, двигать, перекрашивать и менять прозрачность.

Пример в приложении.
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39066968
Роман_1154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вложение.
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39067287
Роман_1154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При этом сами прямоугольники находятся внутри объекта диаграммы, и с формы напрямую не доступны.
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39071055
Роман_1154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Вот еще один пример, но в Excel.
Необходимо через VBA получить доступ к свойствам объекта "Прямоугольник 1", расположенному на диаграмме.
В коллекции ActiveSheet.Shapes данный объект отсутствует. Зато в данной коллекции присутствует сама диаграмма.
Я полагаю, что в объекте Диаграммы должна быть своя коллекция фигур - Shapes, но получить к ней доступ не могу.
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39071118
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Sub Макрос1()
'
' Макрос1 Макрос
' Макрос записан 07.10.2015 (Radio)
'

'
    ActiveSheet.ChartObjects("GR_1").Activate
    ActiveChart.Shapes("Прямоугольник 1").Select
    Selection.Characters.Text = "Прямоугольник 1"
    Selection.AutoScaleFont = False
    With Selection.Characters(Start:=1, Length:=13).Font
        .Name = "Calibri"
        .FontStyle = "обычный"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = 2
    End With
    Selection.AutoScaleFont = False
    With Selection.Characters(Start:=14, Length:=2).Font
        .Name = "Calibri"
        .FontStyle = "обычный"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = 2
    End With
    Selection.ShapeRange.IncrementRotation 21.92
End Sub
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39071490
Роман_1154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо!
Ларчик просто открывался ))
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39094424
Роман_1154
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Осталась та же проблема.

Если диаграмма построена в экселе, то для нее доступна коллекция Shapes, и управление фигурами осуществляется легко и просто.
На форме Access диаграмма строится с помощью компонента MS Graph, который не содержит коллекции Shapes, по крайней в явном виде. Однако в ручном режиме на диаграмме Graph в Access можно рисовать фигуры, которые хранятся в ней как объекты, значит как-то к ним модно получить доступ...?

Пример кода из вложенного файла:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub b_btn_Click()

    Dim obj As Graph.Chart
    Dim esh As Excel.Chart
    
    Set obj = DG.Object
    MsgBox obj.Shapes.Count     ' Ошибка: Коллекция Shapes не найдена
    
    Set esh = DG.Object         ' Ошибка: Несоответствие типов
    MsgBox esh.Shapes.Count
    
    Set esh = Nothing
    Set obj = Nothing

End Sub 



Пытался объект Chart из диаграммы с формы присвоить переменной Excel.Chart, не получилось.
Может Graph.Chart есть какая-то другая коллекция, аналогичная Shapes, в которой хранятся элементы диаграммы, в т.ч. рисунки...

Пример во вложении.
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39094692
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Роман_1154,
жалко, что пример в accdb, у многих , как я понял, здесь еще 2003 акс, если бы было в mdb (в формате 2003-го) , то может кто-то бы и попытался вам помочь
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39094718
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По просьбам трудящихся форума :-)
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39094743
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mds_worldПо просьбам трудящихся форума :-)

Спасибо за конверт базы ))

P.s. Вот учетку востановил, а то "Роман_1154" слишком затянулось ))


P.p.s. Может у кого есть толковая дока на русском по объектке MS Office? Ну должно тут все просто быть....
Класс Excel.Chart и Graph.Chart .... Почти идентичны, но в одном есть коллекция Shapes в другом нет....
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39095560
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sopr,

похоже не умеет этого Access, но можно использовать диаграмму из Excel как OLE объект, и делать всё с фигурами с помощью библиотеки Excel
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39095591
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimportSopr,

похоже не умеет этого Access, но можно использовать диаграмму из Excel как OLE объект, и делать всё с фигурами с помощью библиотеки Excel

Пытался двигаться в этом направлении. Скопировал диаграмму из эксель на форму Акса.
Вставилась нормально. Но сразу возникла проблема с источником данных для диаграммы, т.к. экселевская хочет получать данные с листа эксель, а мне удобно как в Аксе из запроса, при этом при активации диаграммы открывался эксель, а конкретно тот файл эксель, из которого я копировал диаграмму. Как-то мне это сразу жутко не понравилось...

Сейчас склоняюсь к варианту из Акса выкидывать данные в Эксель и с графиками уже в нем работать.
Или в дотнете маленькое приложение написать (если компонент подходящий найду), которое будет график отображать по данным с сервера и на нем рисовать фигуры...
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39096284
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sopr,

можно получать данные и из запроса для свободного объекта OLE, посмотрите пример (акс2003)
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39096689
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,

Большое спасибо, это то, что нужно.
Но у меня сразу возникла проблема:
Вот эта строка:
Код: vbnet
1.
     xlSheet.Range("A1").CopyFromRecordset rst


"не отрабатывает", т.е. срабатывает как-то странно...
Если двойным щелчком зайти в ОЛЕ объект, то там по прежнему диаграмма +3 листа, и на первом листе данных из рекордсета нет.
Однако следующая строка:
Код: vbnet
1.
2.
     dg.SetSourceData xlSheet.Cells(1, 1).CurrentRegion
     dg.Refresh



срабатывает нормально, на диаграмме появляются столько делений, сколько записей в рекордсете. Однако самих столбцов на диаграмме нет.

Такое ощущение, что сразу после отработки процедуры все изменения ОЛЕ объекта, сделанные в коде - отменяются, за исключением SetSourceData для диаграммы.
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39096703
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Access 2007 у меня, может из-за этого...?
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39096846
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sopr,

без примера сказать что-либо затруднительно ... есть ещё такой вариант (см. пример)
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39097002
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,

Да пример, собственно, тот же, что Вы выложили.
Просто добавляем в таблицу несколько записей (я добавил 13) открываем форму и жмем кнопку.
У меня это выглядит так - см. вложение.

Очень странный эффект.... CurrentRegion как-бы понимает, что записей стало больше, но вот самих данных нет.
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39097010
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. получается такая вещь, если менять что-то, касательно непосредственно самой диаграммы, то изменения остаются. Например размер прямоугольника меняется без проблем. А если изменения делать на листе, то при завершении процедуры обработки нажатия кнопки все остается как было.....

Может попробовать сделать объектные переменные:
Код: vbnet
1.
2.
3.
    Dim dg As Excel.Chart
    Dim xlapp As Excel.Application
    Dim xlBook As Excel.Workbook



глобальными в области формы.... сейчас попробую....
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39097015
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может попробовать сделать объектные переменные:
Код: vbnet
1.
2.
3.
    Dim dg As Excel.Chart
    Dim xlapp As Excel.Application
    Dim xlBook As Excel.Workbook



глобальными в области формы.... сейчас попробую....

не прокатило....
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39097027
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sopr,
добавил в таблицу первого примера ещё 12 записей, открыл форму , жмакнул кнопку , получил вполне адекватный результат...
меня смущает вид вашей диаграммы на скрине, там явно строится диаграмма не по значениям в таблице , а по их порядковым номерам, что-то у вас не так пошло, то ли , как любят тут поговаривать, "руки шалят - надо выпрямить"... делайте пример в mdb и прилагайте к форуму, в полтергейсты я не верю :)
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39097045
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sopr,
ещё одно смущает с вашего скрина , у меня для значений в диаграмме используется "Ряд 2" , а у вас - "Ряд 1" , покопайтесь в настройках диаграммы, может всё просто решается :)
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39097236
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimportSopr,
ещё одно смущает с вашего скрина , у меня для значений в диаграмме используется "Ряд 2" , а у вас - "Ряд 1" , покопайтесь в настройках диаграммы, может всё просто решается :)

Хорошо, давайте разбираться по шагам.
1. Скачиваю и открываю Ваш первый пример. Открываю таблицу и форму, кнопку не трогаю. Перед собой вижу картинку 1 из вложения. Диаграмма построена по ряду 2 (см. легенду). При этом столбцы не соответствуют данным таблицы - по порядку.

2. Нажимаю кнопку и вижу следующую картинку - картинка 2 из вложения.
Вид диаграммы изменился, при этом теперь диаграмма построена по ряду 1, т.к. в коде мы меняем источник данных для диаграммы (dg.SetSourceData xlSheet.Cells(1, 1).CurrentRegion), и данные диаграммы не соответствуют данным таблицы, т.к. Максимальное значение в таблице 10, а максимальный столбец на диаграмме 12. Т.е. действительно диаграмма построена по порядковым номерам.

3. Добавляю в таблицу 13 записей и нажимаю кнопку. Получаю картинку 3.
Диаграмма построена по порядковым номерам. При этом если двойным кликом зайти в диаграмму то видим, что листы 2 и 3 не удалены, а на листе 1 два столбца данных, которые и были изначально туда внесены - картинка 4.
Получается, что данные из рекордсета на лист небыли вставлены, либо они были вставлены не туда, откуда диаграмма берет данные.
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39097241
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема вот в этом месте:

Код: vbnet
1.
     xlSheet.Range("A1").CopyFromRecordset rst



Данные вставляются на лист, их тут же можно прочитать, но как только процедура обработки заканчивается, листы ОЛЕ объекта возвращаются в исходное состояние!

Может у листов, т.е. у книги в ОЛЕ объекте быть какая-то настройка защиты от изменений? Я в excel совсем не силен ))
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39097243
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я теряюсь в догадках.
Если внутри OLE объекта руками данные в лист вводить, то все сохраняется, диаграмма строится.
Из программы данные не сохраняются ((
...
Рейтинг: 0 / 0
Управление объектами на диаграмме
    #39097270
Sopr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, разобрался.
Ошибка была в строке:
Код: vbnet
1.
2.
    Dim xlBook As Excel.Workbook
    Set xlBook = xlapp.ActiveWorkbook.Add



Получалось, что мы создавали новую пустую книгу и работали с ней, в частности выводили туда рекордсет. Соответственно при завершении процедуры переменная xlBook вместе с объектом новой книги уничтожалась, а книга OLE объекта оставалась не измененной.

Немного переписал код, чтобы обойтись без "книги", получилось так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
Option Compare Database
Private Const conQuery = "Запрос1"
Private Sub Кнопка5_Click()

    Dim odg As Excel.Chart
    Set odg = Me.DG.Object.Charts(1)
    Debug.Print odg.Name
'    odg.Shapes(1).Height = 30
    
    Dim xlapp As Excel.Application
'    Set xlapp = odg.Application
    Set xlapp = Me.DG.Object.Application
    Debug.Print xlapp.Name
        
'    Dim xlBook As Excel.Workbook
''    Set xlBook = xlapp.ActiveWorkbook '.Add  ' Зачем  ?
'    Set xlBook = Me.DG.Object.Workbook
'    Debug.Print xlBook.Name

    Dim xlSheets As Excel.Sheets
    Set xlSheets = Me.DG.Object.Worksheets
    
    xlapp.DisplayAlerts = False
'    For i = xlBook.Worksheets.Count To 2 Step -1
'        xlBook.Worksheets(i).Delete
'    Next i
        
    For i = xlSheets.Count To 2 Step -1
        xlSheets.Item(i).Delete
    Next i
        
    xlapp.DisplayAlerts = True
    
    Dim xlSheet As Excel.Worksheet
'    Set xlSheet = xlBook.ActiveSheet
    Set xlSheet = xlSheets.Item(i)
    
    xlSheet.Cells.Clear
        
    Set rst = New ADODB.Recordset
    rst.Open Source:=conQuery, ActiveConnection:=CurrentProject.Connection
    
     xlSheet.Range("A1").CopyFromRecordset rst
     
     odg.SetSourceData xlSheet.Cells(1, 1).CurrentRegion
     odg.Refresh
     
End Sub



Извиняюсь за грязь, по позже почищу и выложу рабочий пример, может кому пригодится.


2 guest_rusimport, огромное Вам спасибо за идею и реализацию!
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Управление объектами на диаграмме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]