Возможно ли (в Microsoft Access) прикрепить обработчик событий VBA к событию HTML элемента управления WebBrowser?

У меня есть форма доступа с элементом управления веб-браузером (b). Я «пишу» контент b на лету:

    Dim h as String

    h = "<html><body>"
    h = h & "<form id='bf' ...>"
    h = h & "<input type='text' id='test' name='test'>"
    h = h & "<input type='submit' value='Submit'>"
    h = h & "</form>"
    h = h & "</body></html>"
    Call Me.b.Object.Document.Write(h)

Я хочу обработать ответ пользователя (на «Отправить») с помощью функции VBA. В моем коде VBA доступ к HTML-форме bf можно получить через Me.b.Object.Document.getElementById("bf"), то есть через MSHTML.HtmlFormElement и предоставляет метод attachEvent с двумя аргументами:

Function attachEvent(event As String, pdisp As object) As Boolean

Как мне создать объект pdisp, чтобы выполнить следующее?

    Call Me.b.Object.Document.getElementById("f").attachEvent("onsubmit", *???*)

Заранее благодарю за любую информацию по этой или любому альтернативному решению моей проблемы.

Предоставление «указателя функции» с помощью Address Of не работает. Я предполагаю, что требуемый объект должен быть экземпляром какого-то WithEvents класса, реализующего некоторый интерфейс... Но не удалось найти никакой документации по этому вопросу.

Несмотря на .Net, библиотека VBA MSHTML не обеспечивает доступ к ObjectForScripting...

Вы можете использовать простой класс VBA и WithEvents для перехвата событий, происходящих с элементами HTML в элементе управления веб-браузера. См., например: stackoverflow.com/a/43988381/478884

Tim Williams 20.05.2024 17:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пример использования класса с WithEvents:

Модуль класса clsHtmlInput:

Option Explicit

Private WithEvents m_btn As MSHTML.HTMLInputElement
Private m_txt As MSHTML.HTMLInputElement

Public Sub SetInputs(theButton, theTextBox)
    Set m_btn = theButton
    Set m_txt = theTextBox
End Sub

Private Function m_btn_onclick() As Boolean
    MsgBox "Clicked: " & m_txt.Value
End Function

Ваша пользовательская форма:

Dim eventHandler As clsHtmlInput '<< instance of your "withEvents" class

Private Sub UserForm_Activate()

    Dim el As MSHTML.HTMLInputElement, h As String
    With Me.wb1
        .navigate "about:blank"
        WaitFor wb1
        .document.Open "text/html"
        h = "<html><body>"
        h = h & "<input type='text' id='test' name='test'>"
        h = h & "<input type='submit' value='Submit' id='btnSubmit'>"
        h = h & "</body></html>"
        .document.Write h
        .document.Close
        WaitFor wb1

        Set eventHandler = New clsHtmlInput
        eventHandler.SetInputs .document.getElementById("btnSubmit"), _
                                .document.getElementById("test")

    End With

End Sub

'utility sub to ensure page is loaded and ready
Sub WaitFor(IE)
    Do While IE.readyState < 4 Or IE.Busy
        DoEvents
    Loop
End Sub

Если вы знакомы с HTML и JavaScript (или, по крайней мере, с подмножеством «современного» HTML/js, которое все еще поддерживается в старых элементах управления веб-браузером...), это может быть способом создания интерфейсов, выходящих за рамки базовые элементы управления формами VBA.

Хороший. Проголосовал за это...

FaneDuru 21.05.2024 11:53

Спасибо за четкое объяснение точного решения моей проблемы. Действительно, сама цель состоит в том, чтобы преодолеть ограничения форм VBA, особенно когда, в зависимости от данных, необходима динамическая структура элементов управления. Еще раз спасибо!

Aram Gharib 22.05.2024 07:05

Другие вопросы по теме

Запрос доступа: сравните записи в группе, а затем выберите одну на основе критерия в другом поле
VBA Regex в MSAccess – поиск символа двойной кавычки
Переменная объекта VBA не распознается
Невозможно присвоить значение этому объекту (Access VBA) Me. объект
Combobox зависает из-за необходимости проверять запись по 500 000 записей. Можно ли сделать предзагрузку? Нужен Combobox, так как я использую автозаполнение при вводе
Разработайте SQL-запрос MS Access для имитации функции Excel «Удалить дубликат»
Импортируйте данные MS Word из текстового поля (элемент управления ActiveX) в таблицу MS Access с помощью VBA
Для каждого элемента управления отправка электронного письма с несколькими вложениями на основе критериев флажка
Объединение двух таблиц: невозможно объединить объект Memo, OLE или гиперссылку
Как делать запросы на основе дат начала и окончания периода с помощью MS ACCESS в VB.NET