Excel 是否在整个工作表中检测任何(整个)行选择并取消保护?

Excel 是否在整个工作表中检测任何(整个)行选择并取消保护?,excel,vba,Excel,Vba,正在查找以下代码: 工作表当前已锁定(已为锁定的单元格选择启用) VBA检测是否选择了任何整行(如21、22),并自动取消对图纸的保护 然后: 如果删除了这些精确的行。。板材再次自动保护 如果用户取消选择这些行。。床单再次起到保护作用 (这是用于执行特定行删除的设计) 非常粗略地说: Private Sub Worksheet_SelectionChange(ByVal Target As Range) IF Rows("1:1").Select AND/OR Rows("2:2").S

正在查找以下代码:

工作表当前已锁定(已为锁定的单元格选择启用)

VBA检测是否选择了任何整行(如21、22),并自动取消对图纸的保护

然后:

如果删除了这些精确的行。。板材再次自动保护

如果用户取消选择这些行。。床单再次起到保护作用

(这是用于执行特定行删除的设计)

非常粗略地说:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    IF Rows("1:1").Select AND/OR Rows("2:2").Select AND/OR Rows("3:3").Select then
        ActiveSheet.Unprotect
    End If

    ActiveCell.Row.Delete
    ActiveSheet.Protect

End Sub

记得先设置
Application.enableEvents=True

编辑将代码更改为OP讨论中的新规范

限制:整行(每个单元格必须解锁才能选择整行)

”记住事件的名称是“工作表\u选择更改”`
'非工作表1\u选择更改
专用子工作表\u选择更改(ByVal目标作为范围)
活动表。取消保护
'要选择的行
将行1变暗为范围
将行2变暗为范围
将第3行变暗为范围
暗合并为范围
设置行1=Me.Rows(“1:1”)
设置row2=Me.Rows(“3:3”)
设置row3=Me.Rows(“5:5”)
Dim被发现为布尔值
作为布尔值的Dim匹配
Set mergedRange=Application.Union(第1行,第2行)
Set mergedRange=Application.Union(mergedRange,第3行)
匹配=错误
'检查是否只选择了一行
如果Target.Areas.Count为1,则
保护工作表
出口接头
如果结束
'检查是否正确选择前500行

如果Target.Areas.Item(1).Row>0和Target.Areas.Item(1).Row请记住首先设置
Application.enableEvents=True

编辑将代码更改为OP讨论中的新规范

限制:整行(每个单元格必须解锁才能选择整行)

”记住事件的名称是“工作表\u选择更改”`
'非工作表1\u选择更改
专用子工作表\u选择更改(ByVal目标作为范围)
活动表。取消保护
'要选择的行
将行1变暗为范围
将行2变暗为范围
将第3行变暗为范围
暗合并为范围
设置行1=Me.Rows(“1:1”)
设置row2=Me.Rows(“3:3”)
设置row3=Me.Rows(“5:5”)
Dim被发现为布尔值
作为布尔值的Dim匹配
Set mergedRange=Application.Union(第1行,第2行)
Set mergedRange=Application.Union(mergedRange,第3行)
匹配=错误
'检查是否只选择了一行
如果Target.Areas.Count为1,则
保护工作表
出口接头
如果结束
'检查是否正确选择前500行

如果Target.Areas.Item(1).Row>0和Target.Areas.Item(1).Row类似于以下内容??子团队()如果Selection.Address(0,0)=“1:1”,则ActiveSheet.Unprotect End Submethoding如下??子团队()如果Selection.Address(0,0)=“1:1”,则为ActiveSheet.Unprotect End SubMany谢谢Larry!不幸的是,每当我选择一个单元格时,就会出现“名称不明确”错误。另外,我应该把这行代码放在哪里:Application.enableevents=true?您需要将原始的
工作表\u selection change
Sub替换为我的。(您应该通过稍微更改sub名称来备份原始sub)。您可以在VBE(CTRL+G)的即时窗口中键入它,然后键入ENTERPrivate Sub Worksheet1\u SelectionChange(ByVal Target As Range)Application.EnableEvents=True我已将它放在修改过的子名称之后。(我意识到我有另一个具有相同子名称的宏)但现在什么都没有发生!不要将
Application.EnableEvents=True
放在sub内。您可以将其放入新的
sub
F5
中启用它。此外,为了测试我的功能,您需要使用
CTRL
OK选择第1、3、5行。我已将应用程序启用事件放置在此工作簿中,以便在工作表打开时激活:事件已启用。我已经选择了第1行、第3行、第5行,但仍然没有发生任何事情。谢谢拉里!不幸的是,每当我选择一个单元格时,就会出现“名称不明确”错误。另外,我应该把这行代码放在哪里:Application.enableevents=true?您需要将原始的
工作表\u selection change
Sub替换为我的。(您应该通过稍微更改sub名称来备份原始sub)。您可以在VBE(CTRL+G)的即时窗口中键入它,然后键入ENTERPrivate Sub Worksheet1\u SelectionChange(ByVal Target As Range)Application.EnableEvents=True我已将它放在修改过的子名称之后。(我意识到我有另一个具有相同子名称的宏)但现在什么都没有发生!不要将
Application.EnableEvents=True
放在sub内。您可以将其放入新的
sub
F5
中启用它。此外,为了测试我的功能,您需要使用
CTRL
OK选择第1、3、5行。我已将应用程序启用事件放置在此工作簿中,以便在工作表打开时激活:事件已启用。我已经选择了第1、3、5行,但仍然没有发生任何事情
' remember the event's name is `Worksheet_SelectionChange`
' NOT Worksheet1_SelectionChange
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveSheet.Unprotect
    ' the rows to be selected
    Dim row1 As Range
    Dim row2 As Range
    Dim row3 As Range
    Dim mergedRange As Range
    Set row1 = Me.Rows("1:1")
    Set row2 = Me.Rows("3:3")
    Set row3 = Me.Rows("5:5")
    Dim found As Boolean
    Dim Match As Boolean
    Set mergedRange = Application.Union(row1, row2)
    Set mergedRange = Application.Union(mergedRange, row3)
    Match = False


    ' check if it selects only 1 row
    If Target.Areas.Count <> 1 Then
        ActiveSheet.Protect
        Exit Sub
    End If


    ' check if it's select the first 500 rows
    If Target.Areas.Item(1).Row > 0 And Target.Areas.Item(1).Row <= 500 Then
        'check if it's selecting the WHOLE row
        If Me.Rows(Target.Areas.Item(1).Row & ":" & Target.Areas.Item(1).Row).Areas.Item(1).Count = Target.Areas.Item(1).Count Then
            ' check if the "B" Column of this row's backgound color is blue
            If Me.Cells(Target.Areas.Item(1).Row, 2).Interior.Color = RGB(197, 217, 241) Then
                Match = True
            End If
        End If
    End If


    If Match Then

        'MsgBox "ActiveSheet.Unprotect"
        ActiveSheet.Unprotect
    Else
        Debug.Print "notMatch"
        'ActiveCell.Row.Delete
       ActiveSheet.Protect
    End If


End Sub