Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2012, 14:49   #1
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию Программный перебор свойств контрола

Можно ли программно перебрать и распечатать в Debug.Print все свойства объёкта ChartObject

Типа For Each свойство In ChartObject.?
Debug.Print свойство.Name, свойство.Value
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 20.06.2012, 16:09   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Насколько мне известно, VBA (в отличие от других языков программирования) такого не позволяет.
EducatedFool вне форума Ответить с цитированием
Старый 20.06.2012, 18:54   #3
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Мне попадалось описание класса. Не помню где только.
Кто-то сделал. Тогда думал не понадобится.
Придётся все около 60 свойств проверять и считывать вручную
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 20.06.2012, 19:47   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

интуиция подсказывает что-то должно быть.
как в базе данных к полю можем обратиться пи имени, а можем по индексу в коллекции имен
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 20.06.2012, 20:48   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вообще-то, есть один способ.

Сохраняем копию книги в формате XLSX, переименовываем в ZIP (необязательно),
разархивируем файл средствами Windows,
среди извлечённых файлов находим папку xl/charts,
в ней - файлы с именами типа chart1.xml

В этом XML описаны все свойства (и их значения) вашей диаграммы.
EducatedFool вне форума Ответить с цитированием
Старый 20.06.2012, 21:33   #6
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от alex77755 Посмотреть сообщение
Типа For Each свойство In ChartObject.?
Debug.Print свойство.Name, свойство.Value
вообще-то, св-во это то, что справа от точки. Вопрос: что слева от нее?

Как-то глупо и несерьезно получается. Куда смотрели разработчики? Мне подобная мысль приходила (это было бы слишком здорово). Явных решений не знаю. Попробуй задать вопрос здесь. Логика подсказывает, что если vbe может их получить, то и мы сможем )
В конце-концов, тип объекта мы же можем получить:
Код:
    MsgBox TypeName(Cells(1))
    MsgBox TypeName(ActiveSheet)
    MsgBox TypeName(ThisWorkbook)
    MsgBox TypeName(Application)
Случайно открыл справочник функций:
Цитата:
Функция CallByName
CallByName(Object,ProcName,CallType ,[Args() ])
Новая функция, которая появилась в версии Visual Basic 6.0
Функция выполняет метод объекта или наборов или возвращает свойства объекта
Может оно?

Нет
Тишина – самый громкий звук

Последний раз редактировалось nerv; 20.06.2012 в 21:45.
nerv вне форума Ответить с цитированием
Старый 20.06.2012, 23:48   #7
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

А вот это не оно? Что-то пока не могу запустить:
Цитата:
Есть такая чудесная библиотека - TLBINF32.DLL, с помощью которой можно получить список всех свойств заданного элемента управления. Например:Код

Код:
Public Function CollectProperties(Target As Object) As Collection
   Dim oTLB As InterfaceInfo
   Dim sMemberName As String
   Dim sInvokeKind As String
   Dim i As Integer
   Dim kFuncReturn As Collection
   Dim o As clsMember
   
   Set kFuncReturn = New Collection
   Set oTLB = TLI.InterfaceInfoFromObject(Target)
   For i = 1 To oTLB.Members.Count
      sInvokeKind = ReturnInvokeKind(oTLB.Members(i).InvokeKind)
      If InStr(1, sInvokeKind, 'INVOKE_PROPERTY') > 0 Then
         sMemberName = oTLB.Members(i)
         If Left$(sMemberName, 1) <> '_' Then
            Set o = New clsMember
            o.MemberName = sMemberName
            o.MemberType = sInvokeKind
            kFuncReturn.Add o
         End If
      End If
   Next i
   Set CollectProperties = kFuncReturn
End Function
И пример вызова:Код

Код:
Dim propList As Collection
Dim propMember As clsMember
Dim ct As Control
 
Set ct = Me.Text1  ' << просто для примера
' получаем список свойств контрола ct в коллекцию propList:
Set propList = CollectProperties(ct)
' заполняем комбобокс cboProps свойствами контрола ct:
For Each propMember In propList
    cboProps.AddItem propMember.MemberName
Next propMember


Примечание: класс clsMember описан так:Код
Код:
	 
Public MemberName As String
Public MemberType As String
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 20.06.2012, 23:50   #8
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Ошибка в строке
Код:
  sInvokeKind = ReturnInvokeKind(oTLB.Members(i).InvokeKind)
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 21.06.2012, 08:20   #9
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Вот так уже работает
Код:
Private Sub ListProps(comServer As Object)
Dim IFaceInfo As TLI.InterfaceInfo
Dim mem As TLI.MemberInfo
Set IFaceInfo = TLI.InterfaceInfoFromObject(comServer)
On Error Resume Next
  For Each mem In IFaceInfo.Members
    If mem.InvokeKind = INVOKE_PROPERTYGET Then
      Debug.Print "Property " & mem.Name & " = " & _
 TLI.InvokeHook(comServer, mem.MemberId, INVOKE_PROPERTYGET)
    End If
  Next
End Sub
вызов:
Код:
Dim SH As ChartObject
Dim s As Legend
Set SH = ActiveSheet.ChartObjects.Add(100, 50, 200, 200)
SH.Activate
Application.Dialogs(xlDialogChartType).Show
ListProps SH
Debug.Print

Set s = ActiveChart.Legend
ActiveChart.Legend.Select
Application.Dialogs(xlDialogFormatLegend).Show 'формат легенды
ListProps s
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа перебора вариантов (изменить перебор цифровой на перебор буквенный) BArt2000 Паскаль, Turbo Pascal, PascalABC.NET 5 02.03.2015 12:56
как узнать ID контрола? BLACK_RAIN Win Api 2 03.05.2012 17:47
регистрация контрола Ципихович Эндрю Microsoft Office Word 0 04.04.2012 05:23
Текст из Edit контрола jungle Win Api 2 27.10.2009 19:22
Добавление контрола на форму ЯИмя Microsoft Office Excel 1 08.07.2009 15:58