在Excel中,如何从一个子程序将变量传递到用户窗体?VBA可以帮助您实现这个目标。

12

我已经阅读并应用了在类似主题上找到的解决方案,但在我的情况下似乎没有任何作用。

因此,我想从Module1的一个子过程中传递一个变量到用户窗体。它是一个名为“provinceSugg”的字符串。

这是我代码的相关部分:

Public provinceSugg As String

Sub probaCity()
[...]
If province = "" And city <> "" Then
provinceSugg = sCurrent.Cells(p, db_column).Offset(0, 1).Value
UserForm2.Label1 = "Do you mean " & city & " in " & provinceSugg & " ?"
UserForm2.Label1.TextAlign = fmTextAlignCenter
UserForm2.Show
Else
End If

End Sub

接着,在我的用户窗体代码中:

Private Sub userformBtn1_Click()

MsgBox provinceSugg
sMain.Range("J6").Value = provinceSugg

End Sub

当我运行我的程序时:

1/ 我在从我的子程序调用的MsgBox中看到了provinceSugg的内容(因此有provinceSugg,它不是一个空变量)。
2/ 从用户窗体调用的MsgBox为空(因此传递值失败),当运行“ sMain.Range(“ J6”).Value = provinceSugg”时,我的程序崩溃,出现类似“错误424 对象所需”的错误(因此变量未能传递到用户窗体)。

我尝试了论坛和这里找到的所有方法(不同的方法来指示provinceSugg是公共变量,但仍然崩溃...)。

非常感谢您的帮助!


1
对我来说运行得很好。是否有其他代码正在运行 - 例如UserForm初始化 - 干扰了“provinceSugg”?您能发布您的工作簿(如有必要,请进行清理)吗? - brettdj
4
如果您尝试使用“Sheets(x).Range("J6").Value = provinceSugg”,其中“x”是“sMain”的位置,这个方法是否有效 - 我认为这可能是您的问题。 - brettdj
1
哦,天啊,我太专注于provinceSugg了,完全忘记照顾其他对象了!非常感谢brettdj,确实是这个问题! - Phalanx
2
在你的情况下,provinceSugg不是错误的原因。问题出在范围没有设置。请参阅此处以获取更多详细信息:http://msdn.microsoft.com/en-us/library/office/gg251554.aspx - user2140173
UserForm有一个“tag”属性,可以用来存储变量(而不是将其绑定到控件),这在某些情况下非常有用。 - brettdj
显示剩余2条评论
3个回答

13

您可以在用户表单中创建公共变量,这些变量可以由模块设置。

这些变量仅在加载用户表单时才能访问。

在用户表单中为两个对象声明公共变量。

Public sMain As Worksheet
Public provinceSugg as string

Private Sub userformBtn1_Click()

MsgBox provinceSugg
sMain.Range("J6").Value = provinceSugg

End Sub

在这个模块中,您可以评估这两个变量。

Sub probaCity()
[...]
If province = "" And city <> "" Then

    provinceSugg = sCurrent.Cells(p, db_column).Offset(0, 1).Value

    With UserForm2
        .provinceSugg = provinceSugg 
        Set .sMain = sMain 
        .Label1 = "Do you mean " & city & " in " & provinceSugg & " ?"
        .Label1.TextAlign = fmTextAlignCenter
        .Show
    End With

End If

End Sub

3
在表单关闭时,这些公共变量会被清除吗?还是必须重置或清除这些公共变量以防止内存泄漏? - michaelf

3
如果您的工作簿中有一个隐藏的工作表,只需在工作表的某个地方编写要传递给用户窗体的参数,然后在用户窗体中从那里读取即可。

糟糕,我刚开始回答这个问题,才意识到它是2013年6月的! :p - Darren Bartrup-Cook
我会打开一个窗体实例并从普通模块引用它:Sub probaCity():Dim provinceSugg As String:provinceSugg =“ABC”:Dim myFrm As UserForm1:Set myFrm = New UserForm1:With myFrm:With .Label1:.Caption =“您是否指的是”和省份建议 & provinceSugg: End With:.Show:End With:End Sub - Darren Bartrup-Cook
非常简单的答案/建议,但直截了当,我喜欢 (y) - smirnoff103

2
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim selectColumn
selectColumn= Split(Target.Address(1, 0), "$")(0)

Call UserFormStart(selectColumn)
End Sub

主模块内部

Public columnSelection As String
...
Public Sub UserFormStart(ByVal columnRef As String)
    'MsgBox "Debug columnRef=" & columnRef
    columnSelection = columnRef
    UserForm1.Show
End Sub

用户窗体内部

Private Sub UserForm_Initialize()

'MsgBox "Debug UserForm_Initialize =" & columnSelection
...

End Sub

Worksheet_SelectionChange调用模块上的子程序,其中columnSelection被声明为公共变量并且可以从UserForm访问。我使用了三个不同的变量来表示列引用,以显示UserForm可以访问模块。以上所有内容都可以正常工作,并且需要花费很长时间才能找到并解决问题,因此提交。祝大家好运。


这是一个更好的解决方案,当需要从不同的项目中传递变量时。(否则,其他项目需要包含对具有用户窗体的项目的引用,才能访问公共变量。) - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接