另一个新手问题,但到目前为止我无法找到答案......
我有一张包含多张纸的工作簿,我们称之为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,它就会显示为空(即使它是在之前的用户表单中实现的)。
有人可以告诉我我错过了什么吗?我怎么能这样做(我不想把数据放在表格中)?
答案 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
子时,您将看到如何在代码中访问变量和属性。