从特定工作表子调用用户窗体

时间:2017-01-05 14:50:34

标签: excel vba excel-vba

另一个新手问题,但到目前为止我无法找到答案......

我有一张包含多张纸的工作簿,我们称之为S1,S2等。我有一个用户窗体可以从任何一张纸上激活一个操作。

我的问题是我从子

传递给userform的参数
Public c As Integer, lf As Integer, ld As Integer
Sub Tri()
ld = 8
lf = 128    
Application.ScreenUpdating = False
UsForm.Show

End Sub

现在我的工作簿的大小越来越大,从S1到S2之间出现差异等,要求我根据发布的工作表更改参数。 所以我从"模块"中删除了我的代码。并把它放在" Microsoft excel对象"部分。但现在它似乎无法访问我的公共变量,并且只要我请求ld或lf,它就会显示为空(即使它是在之前的用户表单中实现的)。

有人可以告诉我我错过了什么吗?我怎么能这样做(我不想把数据放在表格中)?

2 个答案:

答案 0 :(得分:1)

您需要利用userform是一个类的事实。因此,作为示例,将以下代码添加到"表单"。假设您有一个名为CommandButton1

的按钮
Option Explicit
Dim mVar1 As Long
Dim mVar2 As String


Property Let Var1(nVal As Long)
    mVar1 = nVal
End Property

Property Let Var2(nVal As String)
    mVar2 = nVal
End Property

Private Sub CommandButton1_Click()
    MsgBox mVar1 & " - " & mVar2
    Me.Hide
End Sub

然后你可以添加一个普通的模块

Sub TestForm()
    Dim frm As UserForm1
    Set frm = New UserForm1
    Load frm
    frm.Var1 = 42
    frm.Var2 = "Test"
    frm.Show
    Unload frm
End Sub

通过这种方式,您可以在不使用全局变量的情况下将变量传递给表单。

答案 1 :(得分:1)

以下是关于可变范围的广泛接受的答案。 https://stackoverflow.com/a/3815797/3961708

如果您在此工作簿中对变量进行了decalred,则需要通过完全限定它来访问它。与ThisWorkbook.VariableName

一样

但是对于UserForms,我建议使用Properties for data flow。这是干净而稳健的做法。养成使用属性的习惯,你会发现它对UserForms非常有用。

示例:

ThisWorkbook

中添加此代码
Option Explicit

'/ As this variable is defined in ThisWorkBook, you need to qualify it to access anywher else.
'/ Example ThisWorkbook.x
Public x As Integer
Sub test()

    Dim uf As New UserForm1
    x = 10
    '/ Set the propertyvalue
    uf.TestSquare = 5

    '/Show the form
    uf.Show

    '/ Get the property value
    MsgBox "Square is (by property) : " & uf.TestSquare

    '/Get Variable
    MsgBox "Square is (by variable) : " & x

    Unload uf

End Sub

现在添加一个名为UserForm1的UserForm并添加此代码

Option Explicit

Private m_lTestSquare As Long

Public Property Get TestSquare() As Long
    TestSquare = m_lTestSquare
End Property

Public Property Let TestSquare(ByVal lNewValue As Long)
    m_lTestSquare = lNewValue
End Property

Private Sub UserForm_Click()

    '/ Accessing the Variable Defined inside ThisWorkkbook
    ThisWorkbook.x = ThisWorkbook.x * ThisWorkbook.x

    '/ Changing Property Value
    Me.TestSquare = Me.TestSquare * Me.TestSquare

    Me.Hide

End Sub

现在,当您从Test运行ThisWorkbook子时,您将看到如何在代码中访问变量和属性。