如何在双击单元格时激活UserForm?

时间:2014-06-20 13:33:48

标签: vba excel-vba excel

在尝试了很多我在网上找到的不同的东西之后,我现在已经很久没能让它工作了。

我试图在名为Open_Orders的工作表上双击一个单元格(在BK的列中,以及从2开始到最后一行数据的行),打开并激活一个名为“UserComment”的UserForm。

这是我粘贴到Open_Orders工作表区域(不是模块)的代码。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim Lastrow As Integer
Lastrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

Set rng1 = Open_Orders.Cells(2, 2)
Set rng2 = Open_Orders.Cells(11 & Lastrow)
Set NewRng = .Range(rng1, rng2)

    If Not Application.Intersect(Target, Range("NewRng")) Is Nothing Then
        Cancel = True
        UserComment.Show
    End If
End Sub

当我点击一个单元格时,我收到错误“编译错误:无效参考的无效”,并在蓝色中突出显示我设置NewRng的“.Range”部分。

我可以采取哪些措施来解决这个问题?

此外,这是一张带有密码“维护”的受保护工作表......不知道为什么没有问题。

编辑:我添加了以下代码作为第一行代码,我仍然得到同样的错误:

Open_Orders.Protect Password:="maintenance", UserInterFaceOnly:=True

再次编辑:Gary的学生在下面的评论中通过将Range(“NewRng”)更改为NewRng来帮助....但是它仍然不起作用,因为它说它受保护即使我有上面那个代码应该允许它工作。

*** *** UPDATE 出于某种原因,当我单击第一行数据(第2行)时,它会提示输入密码,如果我按下取消,则会弹出正确的用户表单。不知道发生了什么。

3 个答案:

答案 0 :(得分:3)

您需要使用工作表参考来限定.Range(rng1,rng2)。如果您希望范围是当前活动的工作表,请删除。 (点).Range(rng1,rng2)。

答案 1 :(得分:1)

我同意上面的sous2817:取消保护整个表单,然后在表单卸载时重新保护它会更容易。由于您以模态方式显示表单,因此用户无法进行与工作表的交互,因此可以保留足够的"保护" - 当模板显示表单时,用户无法对其进行编辑。因此,只需取消保护工作表,然后显示表单,然后在userform的Terminate事件处理程序中重新保护工作表。

以下是一些其他观察结果:

这是一个问题,因为您正在进行字符串连接:

Set rng2 = Open_Orders.Cells(11 & Lastrow)

11 & LastRow的结果不符合您的预期。如果Lastrow是" 33"例如,此表达式的结果将为1133,这是无效的范围分配。根本就没有Range(11)Range(1133)等等(像这样的任何数值都会失败并出现相同的错误)。试试这个:

Set rng2 = Open_Orders.Cells(11, Lastrow)

同样,这不是有效范围:

Range("NewRng")

您有一个名为NewRng变量,其中 是一个范围对象。当你执行"NewRng"时,你传递了一个文字字符串。除非您实际上在工作表上定义了Name这样的(极不可能),否则这将始终引发错误,因为它不存在范围。试试这个:

If Not Application.Intersect(Target, NewRng) Is Nothing Then

我建议你在这里阅读有关如何调试代码的内容。您的大多数问题都是您可以自行解决的常见错误。

http://www.cpearson.com/excel/DebuggingVBA.aspx

答案 2 :(得分:0)

怎么样:

Set NewRng = Open_Oders.Range(rng1, rng2)