单击受保护的单元格时,VBA 会发出提示

Posted

技术标签:

【中文标题】单击受保护的单元格时,VBA 会发出提示【英文标题】:VBA to throw a prompt when clicked on protected cell 【发布时间】:2016-10-05 12:59:40 【问题描述】:

我有工作簿,工作表/工作簿都受到保护。 我有一个代码可以在下拉值“否”时锁定/禁用某些范围的单元格,当下拉值为“是”时解锁/启用 而我想禁用的下拉值和单元格位于不同的工作表上。

“主工作表”上的下拉菜单 “子工作表”上的单元格范围

当用户单击受保护范围并且值设置为“否”时,我还需要向用户发出提示。

我在“主工作表”上使用以下代码

Private Sub Worksheet_Change(ByVal Target As Range)
Dim worksh As Integer
Dim worksheetexists As Boolean
Dim str1 As String

If UCase$(Range("E30").Value) = "YES" Then
               Sheets("SubSheet").Select
               Sheets("SubSheet").Range("E20:I3019").Locked = False
               Sheets("SubSheet").Range("E20:I3019").Activate
           Else
                Sheets("SubSheet").Range("E20:I3019").Locked = True
End If
End Sub

子表上的以下代码

Private Sub WorkBook_SheetChange(ByVal sh as Object, ByVal Target as Range)
If Intersect (Target, sh.Range("$E$19:$I$3000")) Is Nothing Then Exit Sub
MsgBox "Please select the appropriate dropdown on MAIN Sheet " & Target.Address
With Application
    .EnableEvents = False
    .UnDo
    .EnableEvents = True
End With
End Sub

不确定,当用户单击受保护的单元格时,它没有抛出提示,我哪里出错了。

【问题讨论】:

【参考方案1】:

首先。您应该删除Sheets("SubSheet").Select。如果您运行代码并且您不在工作表内,则可能会发生错误。尝试做:

with ThisWorkbook.Sheets("SubSheet")
  If UCase$(Range("E30").Value) = "YES" Then
    .Range("E20:I3019").Locked = False
    .Range("E20:I3019").Activate
  Else
    .Range("E20:I3019").Locked = True
  End If
end with

第二。您不返回目标范围。我的意思是您的Private Sub WorkBook_SheetChange 等待ByVal Target 作为参数,而您的Private Sub Worksheet_Change 返回任何值。它应该是返回您为我选择的范围或单元格的函数。

编辑:

with ThisWorkbook.Sheets("SubSheet")
  If UCase$(Range("E30").Value) = "YES" Then
    .Range("E20:I3019").Locked = False
  Else
    .Range("E20:I3019").Locked = True
     WorkBook_SheetChange Range("E20:I3019")
  End If
end with

还有

Private Sub WorkBook_SheetChange(ByVal Target as Range)
    If Intersect (Target, Range("$E$19:$I$3000")) Is Nothing Then Exit Sub
    MsgBox "Please select the appropriate dropdown on MAIN Sheet " &    Target.Address
    With Application
       .EnableEvents = False
       .UnDo
       .EnableEvents = True
    End With
 End Sub

【讨论】:

感谢您的回复。在您的第一个功能上,我在“激活”行“范围类的激活方法失败”上收到错误。在第二个函数上,如果有错误,请纠正我我刚刚将函数更改为 Private Sub Worksheet_Changes(ByVal sh As Object, ByVal Target As Range),但它仍然给我一般消息“您尝试更改的单元格或图表受到保护...” 如果您不使用Select,请删除Activate 是的,我已经评论了激活和第一个功能工作正常。 删除Private Sub WorkBook_SheetChange 中的ByVal sh as Object。然后,将sh.Range("$E$19:$I$3000") 替换为Range("$E$19:$I$3000")。最后,在.Range("E20:I3019").Locked = False之后写上Private Sub WorkBook_SheetChange(Range("E20:I3019")) 我希望那些私人潜艇在同一个模块中......否则尝试将私人改为公共。如果有什么可以帮到你,请把它有用吗?

以上是关于单击受保护的单元格时,VBA 会发出提示的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL单击单元格事件

VBA - 使用二维数组的值填充单元格时出错

VBA Excel 2003 保护单元格点击

单击表格单元格时将 UIViewController 滚动到顶部

以单击另一个单元格为条件突出显示单元格

excel vba 数组中第1位字符为0,赋给单元格时如何将0保留?