在尝试了很多我在网上找到的不同的东西之后,我现在已经很久没能让它工作了。
我试图在名为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行)时,它会提示输入密码,如果我按下取消,则会弹出正确的用户表单。不知道发生了什么。
答案 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
我建议你在这里阅读有关如何调试代码的内容。您的大多数问题都是您可以自行解决的常见错误。
答案 2 :(得分:0)
怎么样:
Set NewRng = Open_Oders.Range(rng1, rng2)