当“计数器”为TRUE时的锁定范围(在同一行)

时间:2018-11-30 14:14:51

标签: excel vba

Click Here To see and understand my TABLE

如果A2为TRUE,我想锁定范围D2:I2

如果A3为TRUE,我想锁定范围D3:I3 ...

如果AxRow为TRUE,我想锁定范围DxRow:IxRow

我有744行(A2:A745),其中包含TRUE或FALSE语句,这些语句是以下等式A2 = IF($ C $ 2> B2,TRUE,FALSE)的结果。 C2 向我显示“ 30.1545”,这意味着现在11月30日15h45的时间会自动更新(即20分钟后将变为“ 30.1605”)。 B2到B745 单元格显示一个月的天和一个具有固定值的链接小时(B2 = 01.0700 [11月1日上午7点],B3 = 01.0800 [11月1日上午8点],...,B706 = 30.1500 [11月30日15PM],B707 = 30.1600 [11月30日16PM],...)。

出现FALSE语句时,以下所有单元格均为FALSE,因为您可以看到$ C $ 2 = 30.1545

实际示例:A2 = TRUE ... A704 = TRUE,A705 = TRUE,A706 = TRUE,A707 = FALSE,A708 = FALSE ... A745 = FALSE。

我的代码有什么问题?它没有显示任何错误消息,只是感觉Excel锁定并解锁了本应锁定的单元格。

Private Sub Block(ByVal Target As Excel.Range)

Dim xRow As Long
xRow = 2
ThisWorkbook.ActiveSheet.Unprotect Password:="123"
Do Until Cells(xRow, 1).Value = False
If Worksheets("HourlyCount").Cells(xRow, 1).Value = True Then
Range("D" & xRow & ":I" & xRow).Locked = True
End If
xRow = xRow + 1
Loop
ThisWorkbook.ActiveSheet.Protect Password:="123"


End Sub

1 个答案:

答案 0 :(得分:0)

如果您的TRUE / FALSE单元格实际上是文本值,而不是方程式的结果,则需要在下面的代码中用引号将FALSE括起来(If ws.Range("A" & i) = "FALSE" Then

还......

  • 您需要使用有效的工作表来限定对象(范围,单元格等)。否则,您可能指的是错误的工作表。我的代码假定所有有问题的对象都在同一张纸(Sheet1)上
  • 使用Range(Cells(), Cells())来构建一个多变量范围会更容易,它可以代替.Locked = True语句。

Option Explicit

Sub Blockade()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim LR As Long, i As Long

LR = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

ws.Unprotect "123"
    For i = 2 To LR
        If ws.Range("A" & i) = False Then
            ws.Range(ws.Cells(i, 4), ws.Cells(i, 9)).Locked = True
        End If
    Next i
ws.Protect "123"

End Sub

您还可以将循环简化为以下代码。语句Range = False会产生TRUEFALSE,这将确定范围是否被锁定

ws.Unprotect "123"
    For i = 2 To LR
        ws.Range(ws.Cells(i, 4), ws.Cells(i, 9)).Locked = ws.Range("A" & i) = False
    Next i
ws.Protect "123"