如何编写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
1条答案
按热度按时间h7appiyu1#
如果我没理解错的话,下面的代码是为了回答你的标题问题。
代码忽略问题"正文"中的所有信息。
准备:
活动工作表中的所有单元格都必须设置为未锁定格式。
每个复选框的名称必须如下所示:"cbR02"、"cbR03"、"cbR04"等,其中名称的最后两位数字是复选框所在的行。因此,在上例中,cbR02位于第2行,cbR03位于第3行,cbR04位于第4行。
在第一个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,而是其他名称。