因为我必须锁定某些列,所以Priate sub不起作用,我需要选择某些单元格以使Provate子工作,例如:我需要从第1列到第9行以及第11到第26行和第29行到第76行
If Target.Column > 1 And Target.Column <= 76 Then
答案 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;在工作表保护对话框中。