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

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

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

Вот еще один пример, но в Excel.
Необходимо через VBA получить доступ к свойствам объекта "Прямоугольник 1", расположенному на диаграмме.
В коллекции ActiveSheet.Shapes данный объект отсутствует. Зато в данной коллекции присутствует сама диаграмма.
Я полагаю, что в объекте Диаграммы должна быть своя коллекция фигур - Shapes, но получить к ней доступ не могу.
...
Рейтинг: 0 / 0
07.10.2015, 18:20
    #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
08.10.2015, 09:17
    #39071490
Роман_1154
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
Большое спасибо!
Ларчик просто открывался ))
...
Рейтинг: 0 / 0
04.11.2015, 14:59
    #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
04.11.2015, 22:00
    #39094692
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
Роман_1154,
жалко, что пример в accdb, у многих , как я понял, здесь еще 2003 акс, если бы было в mdb (в формате 2003-го) , то может кто-то бы и попытался вам помочь
...
Рейтинг: 0 / 0
04.11.2015, 22:36
    #39094718
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
По просьбам трудящихся форума :-)
...
Рейтинг: 0 / 0
04.11.2015, 23:46
    #39094743
Sopr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
mds_worldПо просьбам трудящихся форума :-)

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

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


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

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

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

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

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

можно получать данные и из запроса для свободного объекта OLE, посмотрите пример (акс2003)
...
Рейтинг: 0 / 0
06.11.2015, 14:55
    #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
06.11.2015, 15:05
    #39096703
Sopr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
Access 2007 у меня, может из-за этого...?
...
Рейтинг: 0 / 0
06.11.2015, 17:10
    #39096846
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
Sopr,

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

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

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

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



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



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

не прокатило....
...
Рейтинг: 0 / 0
06.11.2015, 21:02
    #39097027
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
Sopr,
добавил в таблицу первого примера ещё 12 записей, открыл форму , жмакнул кнопку , получил вполне адекватный результат...
меня смущает вид вашей диаграммы на скрине, там явно строится диаграмма не по значениям в таблице , а по их порядковым номерам, что-то у вас не так пошло, то ли , как любят тут поговаривать, "руки шалят - надо выпрямить"... делайте пример в mdb и прилагайте к форуму, в полтергейсты я не верю :)
...
Рейтинг: 0 / 0
06.11.2015, 21:39
    #39097045
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
Sopr,
ещё одно смущает с вашего скрина , у меня для значений в диаграмме используется "Ряд 2" , а у вас - "Ряд 1" , покопайтесь в настройках диаграммы, может всё просто решается :)
...
Рейтинг: 0 / 0
07.11.2015, 14:35
    #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
07.11.2015, 14:56
    #39097241
Sopr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
Проблема вот в этом месте:

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



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

Может у листов, т.е. у книги в ОЛЕ объекте быть какая-то настройка защиты от изменений? Я в excel совсем не силен ))
...
Рейтинг: 0 / 0
07.11.2015, 15:08
    #39097243
Sopr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Управление объектами на диаграмме
Я теряюсь в догадках.
Если внутри OLE объекта руками данные в лист вводить, то все сохраняется, диаграмма строится.
Из программы данные не сохраняются ((
...
Рейтинг: 0 / 0
07.11.2015, 16:04
    #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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Управление объектами на диаграмме / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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