需要多个目标列的私有子

时间:2017-03-10 06:22:49

标签: excel excel-vba vba

因为我必须锁定某些列,所以Priate sub不起作用,我需要选择某些单元格以使Provate子工作,例如:我需要从第1列到第9行以及第11到第26行和第29行到第76行

If Target.Column > 1 And Target.Column <= 76 Then

2 个答案:

答案 0 :(得分:0)

将以下函数插入到&#34; Private Sub&#34;的相同代码模块中。是,但在&#34; End Sub&#34;该程序。

Private Function IsLocked(Clm As Long) As Boolean

    Dim Clms As Variant
    Dim Rng() As String
    Dim i As Integer

    Clms = Array("1-9", "11-26", "29-75")
    For i = 0 To UBound(Clms)
        If Clm >= Val(Clms(i)) Then
            Rng = Split(Clms(i), "-")
            If UBound(Rng) = 0 Then
                ReDim Preserve Rng(1)
                Rng(1) = Rng(0)
            End If
            If Clm <= Val(Rng(1)) Then
                IsLocked = True
                Exit For
            End If
        End If
    Next i
End Function

使用此行替换上面发布的现有代码行。

  

如果是Islocked(Target.Column)那么

在IsLocked函数中修改该行 数组(&#34; 1-9&#34;,&#34; 11-26&#34;,&#34; 29-75&#34;) 列出您希望代码采取操作的列(以前的列1 - 75)。您还可以指定单个列,例如&#34; 9&#34;在下一个例子中。

(&#34; 1-6&#34;,&#34; 9&#34;,&#34; 11-26&#34;,&#34; 29-75&#34;),尽可能多的团体。

答案 1 :(得分:0)

这是经过测试的解决方案。对于表单保护,您应该允许&#34;格式化单元格&#34;。如果您这样做,以前的解决方案将起作用。无论如何,请把它扔掉并使用此代码。写得更清楚。

  

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Cell As Range

Application.EnableEvents = False
With Target
    If PermitModify(.Column) Then
        Set Cell = Cells(.Row, 1)
        If Not Cell.Locked Then
            Cell.Value = Now
            If .Worksheet.Protection.AllowFormattingCells Then
                .Interior.Color = RGB(181, 244, 0)
            End If
        End If
    End If
End With
Application.EnableEvents = True 
     

End Sub

     

私有函数PermitModify(Clm As Long)As Boolean

Dim Clms As Variant
Dim Rng() As String
Dim i As Integer

Clms = Array("1-9", "11-26", "29-75")
For i = 0 To UBound(Clms)
    If Clm >= Val(Clms(i)) Then
        Rng = Split(Clms(i), "-")
        If UBound(Rng) = 0 Then
            ReDim Preserve Rng(1)
            Rng(1) = Rng(0)
        End If
        If Clm <= Val(Rng(1)) Then
            PermitModify = True
            Exit For
        End If
    End If
Next i 
     

结束功能

此代码将首先检查单元格是否在允许列中。 (与之前的功能相同,但在上下文中重命名。)然后它将检查A列中的单元格是否被锁定,如果发现锁定,则仍然无法执行任何操作。 如果它已解锁,则会将日期和时间写入其中。 接下来,代码将检查您的保护是否允许单元格格式化。如果是,修改后的细胞将被着色。如果根据保护规则不允许单元格格式化,则单元格不会被着色,但您也不会收到错误。

为了使您的表单更加用户友好,我建议不要选择&#34;选择锁定的单元格&#34;在工作表保护对话框中。