1

让我设置环境。

这是在 Excel 中运行的 VBA 代码。

我有一个包含 msflexgrid 的用户窗体。此 flexgrid 显示客户列表和客户、销售人员、csr、mfg rep 和区域、分配。当您单击列时,假设在“区域”列下,另一个用户窗体打开以显示区域列表。然后单击您选择的区域,用户窗体消失,新区域取代旧区域。

这一切都很好,直到您单击您选择的区域,“区域”用户表单不会消失(它会闪烁)并且新区域不会转移基础用户表单。

我应该提到,当我单步执行代码时,它工作得很好。

我假设它与 flexgrid 有关,因为打开用户窗体的所有其他用户窗体(没有 flexgrids)都可以正常工作。

以下是一些代码示例:

** 来自 flexgrid 的单击事件显示区域用户窗体和区域用户窗体关闭时新区域的分配。

Private Sub FlexGrid_Customers_Click()

With FlexGrid_Customers

    Select Case .Col
        Case 0
        Case 2
        Case 4
        Case 6
            UserForm_Territories.Show
        Case Else
    End Select

    If Len(Trim(Misc1)) > 0 Then
        .TextMatrix(.Row, .Col) = Trim(Misc1)
        .TextMatrix(.Row, .Col + 1) = Trim(Misc2)
    End If

End With

End Sub

** 以下 Subs 用于 Territory 用户表单

Private Sub UserForm_Activate()

Misc1 = ""
Misc2 = ""

ListBox_Territory.Clear
Module_Get.Territories

End Sub

Private Sub UserForm_Terminate()

Set UserForm_Territories = Nothing

End Sub

Private Sub ListBox_Territory_Click()

With ListBox_Territory
    Misc1 = Trim(.List(.ListIndex, 0))
    Misc2 = Trim(.List(.ListIndex, 1))
End With

Hide
UserForm_Terminate

End Sub

我知道这是一个冗长的解释,但我是一个相当不错的 VBA 程序员,这让我很难过。

任何帮助将不胜感激。

4

1 回答 1

3

我不会说你在做什么是错误的(因为它永远不会起作用),但它吓坏了我。这不是我处理表格的方式。

首先,您使用UserForm_Territories(类/表单名称)来引用表单的隐式创建实例。这是我一直避免做的事情。我总是会明确地创建一个表单的实例,而不是:

UserForm_Territories.Show

我会做:

Dim oTerritoriesForm As UserForm_Territories
Set oTerritoriesForm = New UserForm_Territories

oTerritoriesForm.Show vbModal

' get the values from the form here

Unload oTerritoriesForm

接下来,更令人担忧的是,您通过显式调用它来颠覆 UserForm_Terminate 行为。为什么你这样做我无法想象,除非你认为它可以解决你所说的问题。我的建议:不要那样做。

更糟糕的是,您正试图在该 Terminate 方法中分配给表单的隐式创建实例。你也不应该那样做。我很惊讶,甚至编译。

似乎您正试图强制表单的隐式创建实例模仿显式创建的实例。在这种情况下,显式创建它,如上所示。

于 2010-01-07T17:33:43.393 回答