让我建立环境。
这是在Excel中运行的VBA代码。
我有一个包含msflexgrid的userform。此flexgrid显示客户和客户,销售人员,csr,制造商代表和地区,分配的列表。当您单击某列时,让我们说在“区域”列下,将打开另一个用户窗体以显示“区域”列表。然后,您单击您选择的区域,用户窗体将消失,新的区域将取代旧区域。
这一切都很有效,直到您点击您所选择的区域,“Territory”用户形式不会消失(它闪烁)并且新区域不会传输基础用户形式。
我应该提一下,当我逐步完成代码时,效果很好。
我假设它与flexgrid有关,因为打开userform的所有其他userform(没有flexgreids)工作得很好。
以下是一些代码示例:
**来自flexgrid的Click事件,显示区域userform并在关闭domain userform时分配新区域。
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 userform
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程序员,这让我很难过。
非常感谢任何帮助。
答案 0 :(得分: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方法中分配隐式创建的表单实例。你也不应该这样做。我很惊讶甚至编译。
您似乎正在尝试强制隐式创建的表单实例来模仿显式创建的实例。在这种情况下,请明确创建它,如上所示。