我正在尝试调整代码found here(第三种方法,因为这似乎是最佳实践),以满足我的需求,但我没有运气 - 我到目前为止的代码,从该页面或多或少地复制了以下内容:
在表单模块中:
Private calling_cell As Range
Property Set range_to_form(ByRef r As Range)
Set calling_cell = r
End Property
Private Sub UserForm_Activate()
Debug.Print calling_cell.Address
End Sub
在worksheet_change-event中:
Dim frm As ufRegLuft
If Not IsUserFormLoaded("ufRegLuft") Then
Set frm = New ufRegLuft
Else
Set frm = VBA.UserForms("ufRegLuft")
End If
Set frm.range_to_form = Target
ufRegLuft.Show
问题:
这不起作用 - 我在debug.print
行上收到错误,说"运行时错误' 91':对象变量或者没有设置块变量&#34 ;。我必须承认我在这一点上很难过,我觉得我已经尝试了所有可能的组合,设置,让,等等。所以,这里的任何人都可以帮我弄清楚是否有可能传递{{ 1}} - 反对用户形式,如果是,请告诉我我做错了什么?
答案 0 :(得分:3)
您的变量calling_cell
初始化为frm
,而不是ufRegLuft
将行ufRegLuft.Show
更改为frm.Show
;)
这是测试它的简单方法。
表单模块
Private calling_cell As Range
Property Set range_to_form(ByRef r As Range)
Set calling_cell = r
End Property
Private Sub UserForm_Activate()
MsgBox calling_cell.Address
End Sub
普通模块
Sub ShowFormProp()
Dim frm As ufRegLuft
Set frm = New ufRegLuft
Set frm.range_to_form = Sheet1.Range("A1")
frm.Show
End Sub
答案 1 :(得分:1)
你必须将变量传递给表单中的子,(我相信用户form_Initialize会触发)
我不确定r在哪里设置但是在设置范围的表单中创建一个公共子,在显示表单之前调用它然后显示如下表单
在表单模块中:
Private calling_cell As Range
public sub range_to_form(ByRef r As Range)
Set calling_cell = r
End Property
Private Sub UserForm_Activate()
Debug.Print calling_cell.Address
End Sub
在worksheet_change-event中:
Dim frm As ufRegLuft
If Not IsUserFormLoaded("ufRegLuft") Then
Set frm = New ufRegLuft
Else
Set frm = VBA.UserForms("ufRegLuft")
End If
frm.range_to_form r
'Could be "range_to_form r" not above
frm.Show