2015-06-09 57 views
3

我试图改编代码found here(第三种方法,因为这似乎被认为是最佳实践),以满足我的需求,但我没有任何运气 - 迄今为止的代码,更多或更少的复制pastaed从该网页如下:是否可以将范围传递给用户窗体属性?

在形式模块:

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事件:

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’:对象变量或带块变量未设置”。我必须承认在这一点上我非常难过,我觉得我已经尝试了各种可能的组合,让,得到等等。所以,任何人都可以在这里请帮我弄清楚是否有可能通过一个Range -object一个用户表单,如果有的话,告诉我我做错了什么?

+0

你能不能,只是为了调试,不先试试,看看是否calling_cel范围对象是没有什么做调试之前。打印。可能会出现代码在范围设置之前调用并且在范围设置为有效值之后正常工作的情况。也许你可以通过调用堆栈窗口来查找源代码,以查看未设置范围时要编码的触发器。 – Tom

回答

3

你的变量calling_cell在形式frm初始化,而不是在ufRegLuft

改线ufRegLuft.Showfrm.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 
+0

Darnit>。<你不会相信是什么头痛,“打字错误”给我造成了:) – eirikdaude

+0

这是好的:)与我们大多数人发生;) –

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事件:

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 
+0

从我从文章中了解到,使用属性而不是公共变量/函数的要点是确保封装。虽然这当然会解决我的问题,但它并不回答是否有可能将范围对象传递给用户窗体属性的问题。非常感谢你的输入,:) :) – eirikdaude

相关问题