excel 如果选中了范围A1:D50中每行的一个单元格或该单元格的值>0,则锁定该行中的其他单元格

thtygnil  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(167)

如何编写vba,以便
如果范围C14:F16中每行的一个单元格被选中或值〉0,则锁定该行中的其他单元格。
以及范围K14:K16中的单元格(总计)=
=0,如果选中复选框
OR =单元格D14:D16.值除以30(如果单元格B2.值〉0)
OR =单元格E14:E16.值除以7(如果单元格C2.值〉0)
OR =单元格F14:F16.值,如果单元格D2.值〉0

Sub Frequency()

Dim rng As Range, cell As Range
Set rng = Range("C14:F16")

Dim rng0 As Range, cell0 As Range, CheckBox As Object
Set rng0 = Range("C14:C16")

Dim rng1 As Range, cell1 As Range
Set rng1 = Range("D14:D16")

Dim rng2 As Range, cell2 As Range
Set rng2 = Range("E14:E16")

Dim rng3 As Range, cell3 As Range
Set rng3 = Range("F14:F16")

For Each cell In rng
    If Range("rng0").Object("CheckBox").Value = True Then
        cell0.Offset(0, 10).Value = 0
    ElseIf Range("rng1").cell1.Value >= 1 Then
        cell1.Offset(0, 9).Value = cell1.Value / 30
    ElseIf Range("rng2").cell2.Value >= 1 Then
        cell2.Offset(0, 8).Value = cell2.Value / 7
    ElseIf Range("rng3").cell3.Value >= 1 Then
        cell3.Offset(0, 7).Value = cell3.Value
    End If
    
Next cell

End Sub

h7appiyu

h7appiyu1#

如果我没理解错的话,下面的代码是为了回答你的标题问题。
代码忽略问题"正文"中的所有信息。
准备:
活动工作表中的所有单元格都必须设置为未锁定格式。
每个复选框的名称必须如下所示:"cbR02"、"cbR03"、"cbR04"等,其中名称的最后两位数字是复选框所在的行。因此,在上例中,cbR02位于第2行,cbR03位于第3行,cbR04位于第4行。

Dim rg As Range: Dim nm As String

Private Sub Worksheet_Change(ByVal Target As Range)
Set rg = Range("A2:D4")
If Not Intersect(Target, rg) Is Nothing Then
    With ActiveSheet
    If Target.Value <> "" And IsNumeric(Target.Value) Then
        .Unprotect
        Rows(Target.Row).Locked = True
        .OLEObjects("cbR" & Format(Target.Row, "00")).Enabled = False
        Target.Locked = False
        .Protect
    ElseIf Target.Value = "" Then
        .Unprotect
        Rows(Target.Row).Locked = False
        .OLEObjects("cbR" & Format(Target.Row, "00")).Enabled = True
        .Protect
    End If
    End With
End If
End Sub

Private Sub cbR02_Click()
ProtectRow "cbR02"
End Sub
Private Sub cbR03_Click()
ProtectRow "cbR03"
End Sub
Private Sub cbR04_Click()
ProtectRow "cbR04"
End Sub

Sub ProtectRow(nm As String)
r = CInt(Right(nm, 2))
With ActiveSheet
If .OLEObjects(nm).Object.Value = True Then
    .Unprotect
    .Rows(r).Locked = True
    .Protect
Else
    .Unprotect
    .Rows(r).Locked = False
    .Protect
End If
End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then MsgBox "Select one cell only"
End Sub

在第一个sub中,它创建一个范围变量(rg)A2:D4,以检测其中的值是否发生了变化。
它检查目标单元格是否不为空并且值是否为数字:
如果是,则取消工作表保护,锁定目标行的行,禁用目标行中的复选框,解锁目标单元格,保护工作表。
否则,它检查目标单元格是否为空-它取消工作表保护,解锁目标单元格,并启用位于目标行的复选框,保护工作表。
第二个到第四个子程序是检测复选框是否被修改,然后用复选框的名称构造一个字符串,然后调用ProtectRow()子程序。
ProtectRow()子函数中,它获取被修改的复选框所在的行号作为r变量,如果复选框值= true,则它锁定整个r行,否则它解锁整个r行。
最后一个子项是避免用户选择多个单元格。
示例:
用户勾选位于第2行的复选框。
然后整个第2行被锁定。用户将不能键入第2行的任何列。如果用户想键入第2行的单元格,他必须先取消选中复选框。然后整个第2行被解锁,使用户能够在第2行键入。
用户在单元格D3中键入一个数字。
然后,整个第3行(单元格D3除外)被锁定,并且位于第3行的复选框被禁用。用户将无法在第3行的任何列中键入内容,也无法勾选位于第3行的复选框。用户必须清除之前在单元格D3中键入的内容,才能键入另一列第3行或勾选位于第3行的复选框。
请注意,rg变量的总行数必须与工作表上复选框的行数相同,并且行号必须与复选框后缀的名称相同。
例如,如果满足以下条件,将抛出错误:
rg = A2:D7---〉总行数= 6
但是复选框的总数不是6。
rg = A2:D7---〉总行数= 6
复选框的总数也是6。
但复选框的名称不是cbR02到cbR07,而是其他名称。

相关问题