Vba 从特定图纸子系统调用userform

Vba 从特定图纸子系统调用userform,vba,excel,Vba,Excel,另一个新手问题,但我至今找不到我的答案 我有一个包含多个工作表的工作簿,让我们称它们为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 现在我的工作簿越来越大,从S

另一个新手问题,但我至今找不到我的答案

我有一个包含多个工作表的工作簿,让我们称它们为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,它就会显示为空(即使它是在以前的userform中实现的)


有人能告诉我我错过了什么吗?否则怎么办(我不想把数据放在工作表中)?

您需要利用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

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

下面是一个广泛接受的关于变量范围的答案

如果在此工作簿中贴花了变量,则需要通过完全限定它来访问它。类似于
ThisWorkbook.VariableName

但是对于UserForms,我建议使用属性来进行数据流。这是一种干净而稳健的方法。养成使用属性的习惯,你会发现它对用户表单非常有益

例如:

将此代码添加到此工作簿中

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
的用户表单,并添加此代码

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

现在,当您从
此工作簿
运行
测试
子项时,您将看到如何跨代码访问变量和属性

很抱歉回答得太晚了,我的工作使我远离文件。我一步一步地运行代码,并理解它的功能。但是,访问此工作簿部分中定义的变量时返回错误:“未找到方法或数据成员”非常感谢您对变量范围的回答,我现在对此有了更好的理解。这似乎可以解决问题,我需要在工作簿中尝试。不过,你能不能很快提醒我我不熟悉的let、get、set等属性?谢谢你(我会在我的工作簿上使用它时立即验证),因为userform是一个类。在这里可以找到一个很好的解释,这是关于属性的一章