Получите доступ к забытым общественным ценностям сейчас

Access 2016, VBA; Я пытаюсь объявить публичную переменную (окно входа пользователя в систему), и она продолжает "забывать" переменную между функцией и form_load

Модуль:

Option Compare Database

Public vUser As String

Начальная форма:

Public Function fnUserID() As String
    Set Wshnetwork = CreateObject("wscript.Network")
    fnUserID = Wshnetwork.UserName
End Function

Public Function SetUserID()
    vUser = fnUserID
End Function

Private Sub Form_Load()
    Call SetUserID
    txtBox.Value = vUser
End Sub

Теперь у меня есть этот точный код (те же имена и т. Д.), Работающий во второй базе данных Access. Что мне не хватает, что делает этот не работает правильно?

2 ответа

Решение

Он работает, как в тесте, и работает в другой форме.

Итак, воссоздайте оскорбительную форму. Каким-то образом текущий модуль кода может быть поврежден.

Сфера это сложная вещь, особенно если вы не используете Option Explicit, Вы должны всегда использовать явные объявления и использовать Option Explicit в верхней части всех модулей в VBA.

Вы можете явно обратиться к глобальной области видимости vUser в этом модуле, настраивая свой код для использования ModuleName.vUser:

Public Function fnUserID() As String
    Set Wshnetwork = CreateObject("wscript.Network")
    fnUserID = Wshnetwork.UserName
End Function

Public Function SetUserID()
    Module1.vUser = fnUserID
End Function

Private Sub Form_Load()
    Call SetUserID
    txtBox.Value = Module1.vUser
End Sub

Популярные альтернативы:

  1. Используйте TempVar: TempVars.vUser, Преимущества включают возможность ссылаться на TempVar в запросах, выражениях форм и макросах.
  2. Используйте предварительно объявленный класс. Преимущества включают отделение кода аутентификации от форм и облегчение расширения аутентификации.
Другие вопросы по тегам