Как присвоить значение глобальной переменной для глобального использования

#vba #ms-access

#vba #ms-access

Вопрос:

У меня есть строка, Application.hWndAccessApp которая появляется в нескольких строках кода для вызова пользовательского MsgBoxT . Вместо записи Application.hWndAccessApp в каждом экземпляре в модулях и классах, я бы хотел, чтобы оно было присвоено общедоступной переменной, такой как hid as string . Я знаю об объявлении общедоступной переменной и последующем присвоении ей значения в функции или подпрограмме.

Здесь я хотел бы, чтобы это значение присваивалось глобально, чтобы оно становилось доступным во всех модулях / классах каждый раз, когда я хочу использовать MsgBoxT функцию.

РЕДАКТИРОВАТЬ: я последовал совету из комментариев ниже, но это дает Error # 13: Type Mismatch .

 Global Const hid = "Application.hWndAccessApp"
  

Затем я вызываю это, используя функцию ниже:

 MsgBoxT hid, "Record Updated!", "Confirmation", VbInformation, 0 , 1000
  

Моя функция MsgBoxT объявлена общедоступной:

 Public Declare PtrSafe Function MsgBoxT _
Lib "user32" _
Alias "MessageBoxTimeoutA" ( _
   ByVal hwnd As LongPtr, _
   ByVal lpText As String, _
   ByVal lpCaption As String, _
   ByVal wType As VbMsgBoxStyle, _
   ByVal wLange As Long, _
   ByVal dwTimeout As Long) _
As Long
  

Ответ №1:

Исходя из обновленного вопроса, переменной является LongPtr . Поскольку она инициализирована на Runtime , у вас есть один вариант:

  1. Объявляем глобальный LongPtr, который вы назначите в следующий момент:

    Global hid As LongPtr

    hid = Application.hWnd

Благодаря обновленному коду из приведенного ниже вопроса, теперь он работает без сбоев:

 Global hid As LongPtr

Public Declare PtrSafe Function MsgBoxT _
Lib "user32" _
Alias "MessageBoxTimeoutA" ( _
   ByVal hwnd As LongPtr, _
   ByVal lpText As String, _
   ByVal lpCaption As String, _
   ByVal wType As VbMsgBoxStyle, _
   ByVal wLange As Long, _
   ByVal dwTimeout As Long) _
As Long
  

С этими изменениями это работает (протестировано на моем ПК):

 'On This_Workbook
Private Sub Workbook_Open()
    hid = Application.hwnd
End Sub

'Anywhere in the code
Sub test()
    MsgBoxT hid, "Record Updated!", "Confirmation", vbInformation, 0, 1000
End Sub
  

введите описание изображения здесь

Комментарии:

1. Это означает, что это не String . Просто измените String на фактический тип, который она использует. Чтобы узнать, вы можете использовать VBA Debug tools .

2. Я обновил свой вопрос с помощью Code . Не могли бы вы, пожалуйста, взглянуть и сообщить мне, где я здесь допускаю ошибку.

3. Я скопировал и вставил точные ваши слова code , и это выдает мне ту же ошибку. Это становится для меня загадкой.

4. Попробуйте сейчас. Я обнаружил, что это Application.hWnd работает, в то время как Application.hWndAccessApp нет. Дайте мне знать, если это исправит проблему.

5. Конечно, я это сделал. Спасибо за помощь!

Ответ №2:

 Public hid as string

Sub Main()
    hid = Application.hWndAccessApp
End Sub
  

или

 Private Sub Workbook_Open()

   hid = Application.hWndAccessApp

End Sub