-4

单击此处查看并了解我的表格

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

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

如果 AxRow 为 TRUE,我想锁定 Range 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 日下午 15 点],B707 = 30.1600 [11 月 30 日下午 16 点],...)。

当出现 FALSE 语句时,以下所有单元格都是 FALSE,如您所见 $C$2 = 30.1545 < B707 = 30.1600,因此 A707 = FALSE 等等。

实际示例: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
4

1 回答 1

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将产生TRUE或者FALSE决定一个范围是否被锁定

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"
于 2018-11-30T14:35:29.217 回答