【问题标题】:Vba Userform close while _Initialize_Initialize 时 Vba 用户窗体关闭
【发布时间】:2015-07-31 09:27:29
【问题描述】:

当我启动我的用户表单时,我首先会寻找一个值。如果此值不存在,则用户表单应关闭。

Try1:UserForm_Inizialize

Public Sub UserForm_Initialize()
    Call languagePack
    '
    'initialize the userform
    '
End Sub

Try1:选择语言包的功能

Private Sub languagePack()
    Dim LanguageItems(45) As String
    Dim Language_ID As Integer
    Language_ID = Outlook.LanguageSettings.LanguageID(msoLanguageIDUI)
    Call Language_AS.getLanguage(Language_ID, LanguageItems)
    If Not LanguageItems(0) = "" Then
        With Me
            '--write the array items into the userform objects and vaues
        End With
    Else
        MsgBox "It doesn't exist a Language-Pack for your language! Pleas change to english."
        Unload Advanced_Search ' will not work
    End If
End Sub

Try1 是在函数languagePack() 中卸载用户窗体,但没有停止运行,我得到一个错误。所以我尝试了另一件事:

Try2:UserForm_Inizialize

Private close_userform As Boolean
Public Sub UserForm_Initialize()
    Call languagePack
    If close_userform = Flase Then
        '
        'initialize the userform
        '
    else
        Unload Advanced_Search ' will not work
    end if
End Sub

Try2:选择语言包的功能

Private Sub languagePack()
    Dim LanguageItems(45) As String
    Dim Language_ID As Integer
    Language_ID = Outlook.LanguageSettings.LanguageID(msoLanguageIDUI)
    Call Language_AS.getLanguage(Language_ID, LanguageItems)
    If Not LanguageItems(0) = "" Then
        With Me
            '
            '--write the array items into the userform objects and vaues
            '
        End With
        close_userform = False
    Else
        MsgBox "It doesn't exist a Language-Pack for your language! Pleas change to english."
        close_userform = True
    End If
End Sub

Try2 有什么问题?布尔值close_userform 是全局的,因此两个函数都可以读取该值。但如果它达到卸载它不会发生任何事情。到达end sub 后出现错误。

错误是:
运行时错误“91”:
目标变量或未设置块变量

启动用户窗体的宏

Sub start_Advanced_Search()
    Advanced_Search.Show (vbModeless)
End Sub

请帮帮我。感谢每个命令的答案。亲切的问候,尼科

【问题讨论】:

    标签: vba userform


    【解决方案1】:

    为什么不让语言包子成为一个返回布尔值的函数,而不是将结果写入close_userform。接下来使用 Unload Me 代替 Unload Advanced_Search

    【讨论】:

    • 我像你说的那样改变了它,但它不起作用。再次出现运行时错误“91”。我会发布我的代码,但是这两个模块的代码大约是 1200 行,所有命令都是德语(50% 是命令)。
    • 如果子语言包不在表单后面的代码中,我可以理解为什么它不起作用并给你错误 91 错误。代码会将“Me”视为尚未设置的变量。您可以尝试跟踪它并在 With Me 语句处设置断点(如果编译)我认为错误来自该部分代码
    • LanguagePack 在用户表单中。我用MeAdvanced_Search 对其进行了测试(Advanced_Search 是用户窗体的名称)。我跟踪它并且用户表单确实卸载了,无论是Me还是Advanced_Search,但是当程序到达end Sub时,我得到错误91。这很奇怪。是否可以在UserForm_Initialize 之后激活第二个sub?也许 sub 的类型是问题所在。 _Initialize 函数类型需要一个用户表单。
    • 它与初始化事件有关。如果你的初始化事件中唯一的一行是卸载我,这会给你同样的错误。如果您将表单的关闭(卸载我)移动到激活事件,这将起作用。不理想,因为每次表单获得焦点时都会触发激活,但应该没问题。其他选择是通过使用 End 而不是 Unload Me 来完全终止宏(我更喜欢使用 me,因为它代表用户表单的一个实例。Advanced_Search 理论上可以触发表单的一个新实例)
    • 我找到了解决方案。不完全符合您使用_Activate 的想法,但我创建了一个私有全局值来保存LanguagePack() 的输出,并为此值添加了一个getter。所以我在函数start_Advanced_Search 中使用了这个getter,如果用户表单没有语言,则在那里卸载用户表单。将在几分钟内发布新代码。感谢分配汤姆的帮助。
    【解决方案2】:

    这就是我的问题的解决方案。
    感谢汤姆的帮助。

    说明:
    如果我的用户表单没有语言包(我制作语言包),它将关闭用户表单。 函数languagePack() 返回一个布尔值(ture = 存在语言包 | false = 不存在语言包)。 此布尔值保存在 hasLanguage 中。使用getHasLanguage() 函数,我可以获得用户表单之外的值。 该函数用于子start_Advanced_Search。使用 if 函数检查是否有语言包,如果没有,它将卸载用户表单。

    用户表单

    Private hasLanguage As Boolean
    
    Public Sub UserForm_Initialize()
        hasLanguage = languagePack()
        If hasLanguage Then
            '
            'set the defaults...
            '
        End If
    End Sub
    
    Public Function getHasLanguage()
        getHasLanguage = hasLanguage
    End Function
    
    Private Function languagePack() As Boolean
        'array to save the new language
        Dim LanguageItems(49) As String 
        'this value will contain the LanguageID of Outlook
        Dim language_ID As Integer      
        'get LanguageID of Outlook
        language_ID = Outlook.LanguageSettings.LanguageID(msoLanguageIDUI)
        'call a sub to get the language
        Call Language_AS.getLanguage(language_ID, LanguageItems)
        'there is a languagepack if the first element of "LanguageItems" is not ""
        If Not LanguageItems(0) = "" Then
            With Me
                '
                'set the language of the userform
                '
            End With
            languagePack = True
        Else
            'there is no languagepack
            MsgBox "It doesn't exist a Language-Pack for your language! Pleas change to english."
            languagePack = False
        End If
    End Function
    

    模块

    Sub start_Advanced_Search()
        'start the userform
        Advanced_Search.Show (vbModeless)
        'use the get function
        If Not Advanced_Search.getHasLanguage() Then
            'unload if flase
            Unload Advanced_Search
        End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      相关资源
      最近更新 更多