Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Заменитель "OLE/COM Viewer", Ищу инструмент чтобы заглянуть внутрь OLE/COM объекта до самого последнего уровня детализации
 
Коллеги, здравствуйте!

Сравнительно продолжительное время я нахожусь в поиске утилиты, сродни "OLE/COM Viewer". Т.е. искомая утилита должна бы делать все то, что делает "OLE/COM Viewer", т.е. у любого OLE/COM объекта отображает внутреннее устройство: набор интерфейсов, у каждого интерфейса - набор методов и свойств. Штатная утилита "OLE/COM Viewer", к сожалению, отображает информацию не всех объектов и, по закону противности, самые интересующие объекты оказываются ей недоступны. Например, сейчас интересен "File Open Dialog" из библиотеки "ComDlg32.dll". Утилита показывает только первый уровень детализации - набор интерфейсов и их описание. Провалиться глубже, например в интерфейс "IFileOpenDialog" уже не может. Сообщает "IDataObject interface viewer only supports IID_IDataObject".
Описания в документации не всегда достаточно, т.к. я пробую получить доступ к разным объектам OLE/COM из-под VBA. А документация написана, чаще всего для С. Поэтому приходится заполнять разрыв между концепцией С и VBA. Для этого очень полезной может оказаться такая утилита.

Прошу сообщить о достойном инструменте.
Благодарю за Ваш ответ!
Как сделать так, чтобы макрос работал и с хоткейа, и с кнопки на ленте, добавленной в XML?
 
Цитата
The_Prist написал:
а другого варианта нет.
Коллеги, здравствуйте!

Чтобы карантинные праздники проходили с пользой, захотел пройтись по темам, на которые хронически не хватает времени...
Поэтому, если уже не интересно или найдено решение, то извиняюсь за беспокойство...
Ну, например, вот сейчас, в своем риббоне добавил onLoad="RibbonRun"
Код
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="RibbonRun">
а в коллбэке приказал
Код
' (компонент: ribbon, атрибут: onload), 2010+
Private Sub RibbonRun(ribbon As IRibbonUI)
Application.OnKey "^{F9}", "'" & ThisWorkbook.Name & "'!MakeHeader"
    'Объявите глобальную переменную объекта ленты: Public gobjRibbon As IRibbonUI
    'Set gobjRibbon = ribbon
End Sub
Может я еще чего-то недопонимаю, но мне кажется работает так, как хотелось на постановке задачи, т.е.
макрос запускается и через кнопку на риббоне и через хоткей Ctrl+F9 и решение не обременительное....
Вместо "MakeHeader" напишите свой макрос. И все требуемые хоткеи можно в этой процедуре прописать.

Обработка события Workbook_NewSheet, Ошибка при выполнении, хотя при отладке ошибки нет.
 
Цитата
БМВ написал:
нужно это разрешить в настройках безопасности. По умолчанию стоит запрет.
Согласен!
Это я уже сделал.
Обработка события Workbook_NewSheet, Ошибка при выполнении, хотя при отладке ошибки нет.
 
Цитата
БМВ написал:
требуется подшаманить с безопасность, то вариант не самый привлекательный.
Здравствуйте!
Прошу изложить подробности, я не могу понять о каких угрозах безопасности может идти речь...
Обработка события Workbook_NewSheet, Ошибка при выполнении, хотя при отладке ошибки нет.
 
Продолжение этой истории такое (вдруг кому интересно)...
Пролетарии коминтерна натолкнули на идею использовать интересную языковую конструкцию,
которую я, соединив с фрагментом от Владимира (sokol92), довел до такого вида:
Код
Sub Check_NewSheet(ByVal sh As Object)
    Dim sh_CodeName As String, sh_Name As String, i As Integer
On Error Resume Next
    sh_CodeName = ActiveWorkbook.VBProject.VBComponents(sh.CodeName).Properties("_Codename")
If Err.number > 0 Then
i = 0
Do While sh_CodeName = ""
    sh_CodeName = ActiveWorkbook.VBProject.VBComponents(sh.CodeName).Properties("_Codename")
DoEvents
i = i + 1
Loop
End If
sh_Name = sh.Name
    MsgBox "Code Name - " & sh_CodeName & vbCrLf & "Name - " & sh_Name & vbCrLf & _
    "Attempts - " & i, vbOKOnly, "MESSAGE FROM WorkBook.NewSheet"
End Sub
Код вызывается, как и раньше, из события Workbook_NewSheet. Работает устойчиво, и как промежуточное решение очень приемлемо.
Плюс, коминтерновцы предложили еще одно решение, которое прошло разовую проверку на применимость.
Решение интересно тем, что вовлекает в процесс передачи параметра редактор VB, но
делает это очень тактично, не заметно для пользователя.
Может кому-то тоже пригодится.
Код
Sub TestAddIt()
Dim sh As Worksheet
    Set sh = ThisWorkbook.Worksheets.Add
    With Application.VBE.MainWindow
        .WindowState = 1
        .Visible = False
    End With
    MsgBox sh.Name & " -VBE- " & sh.CodeName
End Sub
Я проверил его, назначив горячие клавиши вызова.
Тем не менее, желание найти корень проблемы осталось. Если кому-нибудь подвернется объяснение этому инциденту,
прошу меня проинформировать.
Спасибо всем!
Изменено: Levi.S - 25.04.2020 23:55:37
Обработка события Workbook_NewSheet, Ошибка при выполнении, хотя при отладке ошибки нет.
 
Цитата
sokol92 написал:
В последних версиях Excel есть проблемы с синхронизацией "приложения" VBA
Спасибо!
О чем-то похожем я предполагал...
Есть у Вас надежный источник инфы об этом? Инфа может быть на английском...
Обработка события Workbook_NewSheet, Ошибка при выполнении, хотя при отладке ошибки нет.
 
Цитата
sokol92 написал:
Что выдается в окно Immediate?
Владимир, здравствуйте!

В свою очередь, я благодарю Вас за интересный опыт и наблюдение!
У меня Win 10 Pro, Excel 2016 32 из пакета Office Про Плюс
Я позволил себе дописать текст сообщения " & vbCrLf & " Число Повторений " & i"
В итоге запуск кода из книги дает такой результат:


Сценарий был такой:
1. в событии книги NewSheet заремил свои вызовы и вставил ваш вариант
2. текст сообщения дополнил фразой " & vbCrLf & " Число Повторений " & i"
3. закрыл редактор VBE и мышкой нажал "плюсик - вставить лист"
4. лист появился сразу же, больше ничего не произошло.
5. мышкой нажал "плюсик - " вставил еще один лист
6. лист так же быстро появился и ничего больше приметного...
7. "интресно…" подумал я и решил повторить это же в пошаговом режиме.
8. запустил редактор VBE, разремил "Stop" и на последок решил заглянуть в окно Immediate ….
и не пожалел...
из приложенного скрина видно, что первая попытка (Лист5) оказалась удачной, но потребовала 188 332 условного тика.
Я, как пользователь, ничего не заметил.
Следом за ней попытка (Лист6) так же удачна, но тиков не потребовала вовсе...

Теперь, естественно, хочется отловить на что расходуются эти условные тики....
Код
Private Sub Workbook_NewSheet(ByVal sh As Object)
Stop
'    M2.NewSheet sh

  Dim i As Long
  i = 0
  Debug.Print "Проверка"
  Do While sh.CodeName = ""
    i = i + 1
    Debug.Print "Повторение " & i
    DoEvents
  Loop
  Debug.Print "Codename=" & sh.CodeName & vbCrLf & " Число Повторений " & i

End Sub
[img]file:///C:/Users/Surface/Desktop/_ram/CodeInNewSheetEvent.PNG[/img]
Изменено: Levi.S - 20.04.2020 20:29:11
Обработка события Workbook_NewSheet, Ошибка при выполнении, хотя при отладке ошибки нет.
 
Благодарю Вас, БМВ!

Значит у меня нужно искать косяк глубже, в системных настройках Excel и ближе к ОС.
Обработка события Workbook_NewSheet, Ошибка при выполнении, хотя при отладке ошибки нет.
 
Цитата
Михаил Лебедев написал:
А зачем Вы всё время возвращаетесь на метку ret ?Ведь после этого цикл запускается снова.
Возврат - это одна из многочисленных попыток "дождаться" передачи параметра "sh_CodeName".
Цикл можно удалить. Он нужен только для этого - потянуть время. Была гипотеза, что многопоточность вычислений
не успевает синхронизировать потоки, А проверка на синхронность стоит только на критически важных для стабильности ОС
вычислениях. Excel в их число не входит. Чтобы проверить гипотезу я внес таким образом задержку в вычисления.
Цель макроса (не конечная) - получить в сообщении значение этих двух параметров.
sh_Name передается без замечаний, а вот sh_CodeName чаще не передается,
чем передается.
Изменено: Levi.S - 20.04.2020 07:42:34
Обработка события Workbook_NewSheet, Ошибка при выполнении, хотя при отладке ошибки нет.
 
Здравствуйте, Михаил!
Благодарю Вас за отклик!
Прикладываю...
Обработка события Workbook_NewSheet, Ошибка при выполнении, хотя при отладке ошибки нет.
 
Коллеги, здравствуйте!

Извиняюсь, никак не могу размер фото отрегулировать....
Буду оченьь признателен Вам за помощь!

Обрабатывал событие Workbook_NewSheet и Столкнулся с непонятным явлением:
в режиме трассировки (пошаговое выполнение) макроса ошибки нет.
А в штатном режиме возникает ошибка CcodeName = ""
Скрытый текст

При этом ожидаем закономерного результат CcodeName = "Лист3". В диспетчере проекта так и есть
[img]file:///C:/Users/Surface/Desktop/_ram/vbaProject.PNG[/img]
Код устроен очень просто:
код в событии книги -
Код
Private Sub Workbook_NewSheet(ByVal sh As Object)
'Stop                                                      ' для включения пошагового выполнения.
    M2.NewSheet sh
End Sub

код в модуле - M2.NewSheet
Код
Option Explicit
Sub NewSheet(ByVal sh As Object)
Dim sh_CodeName As String, sh_Name As String, i As Integer
 i = 0
ret:
sh_CodeName = sh.CodeName: sh_Name = sh.Name
Do While sh_CodeName = "" And i < 10
 Application.Wait (Now + TimeValue("0:00:01"))             ' даже задержку на 10 секунд поставил. не помогла
 i = i + 1
GoTo ret
Loop
MsgBox "Code Name - " & sh_CodeName & vbCrLf & "Name - " & sh_Name, vbOKOnly, "СООБЩЕНИЕ ОТ WorkBook.NewSheet"
End Sub
Вопрос простой: как добиться исправной работы? Есть какие-нибудь идеи? Мои все закончились...
Но самое непонятное - иногда срабатывает правильно....
Изменено: Levi.S - 20.04.2020 02:02:02
Страницы: 1
Наверх