我有两列“A”和“B”。在“A”列中,我只有字符。列'B'暂时为空白,如下所示。
问题01: 我应该使用什么代码来表示每当“aaa”或“ddd”出现时,列'B'的相应单元格','A'列旁边会自动更改为“YES”?
问题02: 此时,无法删除或更改单元格B1和B4中用VBA代码写入的“是”字样(单元格)被锁定了。另一方面,用户可以操纵单元格B2和B3(那些写为“否”)。请注意,我还要使用密码保护被阻止的“是”单元格。
问题03: *如何以编程方式使用我的密码=“mypass”?,因此当VBA在流程中写入“NO”时,用户不需要输入密码来解锁单元格。
下面的代码是试用版,但不起作用:(
提前谢谢!
之前
中校。 A ..... Col.B(空栏)
A1.aaa ..... B1。
A2.bbb ..... B2。
A3.ccc ...... B3。
A4.ddd ..... B4。
后
中校。 A ..... Col.B
A1.aaa ..... B1.YES
A2.bbb ..... B2.NO
A3.ccc ...... B3.NO
A4.ddd ..... B4.YES
表( “计划1”)。激活
如果范围(“A1:A4”)。选择=“aaa”然后 范围(“B1:B4”)。值=“是”
如果范围(“A1:A4”)。选择=“ddd”然后 范围(“B1:B4”)。值=“是”
范围( “B1:B4”)选择
。 Selection.Locked = True
Selection.FormulaHidden = False
ActiveSheet.Protect DrawingObjects:= True,Contents:= True,Scenarios:= True
ActiveSheet.EnableSelection = xlUnlockedCells
否则:
ActiveSheet.Unprotect
范围(“B1:B4”)。值=“否”
答案 0 :(得分:1)
Q1:
您可以将简单IF
公式应用于整个范围,然后使用此公式的结果重写单元格值:
With .Range("B1:B4")
.Formula = "=IF(OR(A1=""aaa"", A1=""ddd""),""YES"",""NO"")"
.Calculate
.Value = .Value
End With
Q2:
您可以遍历您的范围并锁定所有单元格,其值为“YES”(您也可以使用Find方法检测值为“YES”的单元格):
For Each cell In .Range("B1:B4")
cell.Locked = (cell = "YES")
Next cell
问题3:
使用密码取消保护/保护工作表,如下所示:
With Sheets("Plan1")
.Unprotect Password:=pass
'YOUR CODE HERE
.Protect Password:=pass
End With
其他要点:
如果您已经在上一代代码(或手动)上锁定了 UsedRange 中的某些单元格,则应存储该代码地址。我建议你使用Collection:
Dim lockArr As New Collection
然后将所有锁定单元格的地址存储在 UsedRange :
中For Each cell In Sheets("Plan1").UsedRange
If cell.Locked Then lockArr.Add cell.Address
Next
下一步是解锁工作表上的所有单元格(最初Excel会锁定工作表上的所有单元格,即使它们是空的和未使用的):
Sheets("Plan1").Cells.Locked = False
最后,我们只锁定以前锁定在 UsedRange 中的单元格:
For Each addr In lockArr
Sheets("Plan1").Range(addr).Locked = True
Next
结果代码:
Sub test()
Dim pass As String
Dim cell As Range
Dim lockArr As New Collection
Dim addr
pass = "mypass"
With Sheets("Plan1")
.Unprotect Password:=pass
'find all locked cells
For Each cell In .UsedRange
If cell.Locked Then lockArr.Add cell.Address
Next
'unlock all cells on the sheet
.Cells.Locked = False
'lock previously locked cells
For Each addr In lockArr
.Range(addr).Locked = True
Next
With .Range("B1:B4")
.Formula = "=IF(OR(A1=""aaa"", A1=""ddd""),""YES"",""NO"")"
.Calculate
.Value = .Value
For Each cell In .Cells
cell.Locked = (cell = "YES")
Next cell
End With
.Protect Password:=pass, DrawingObjects:=True, Contents:=True, Scenarios:=True
.EnableSelection = xlUnlockedCells
End With
Set lockArr = Nothing
End Sub
<强> UPD:强>
变化
With .Range("B1:B4")
.Formula = "=IF(OR(A1=""aaa"", A1=""ddd""),""YES"",""NO"")"
.Calculate
.Value = .Value
For Each cell In .Cells
cell.Locked = (cell = "YES")
Next cell
End With
到
With .Range("B1:B4")
For Each cell In .Cells
' cell.Offset(, -1) means offset 1 to the left, i.e. column A
'if value in column A mathes criteria then change value in col B to "YES", else do nothing
If cell.Offset(, -1) = "aaa" Or cell.Offset(, -1) = "ddd" Then
cell = "YES"
End If
cell.Locked = (cell = "YES")
Next cell
End With
上述代码说明:
cell
是.Range("B1:B4")
的单元格之一,cell.Offset(, -1)
表示向左偏移1,即A列(例如,如果cell
为B2
,然后cell.Offset(, -1)
会引用A2
)If cell.Offset(, -1) = "aaa" Or cell.Offset(, -1) = "ddd" Then
中测试标准 - 如果列A
中的相应单元格是“aaa”或“ddd”,则将列B
中的值更改为“是”,否则列B
cell.Locked = (cell = "YES")
- 如果单元格包含“是”,则锁定它,否则解锁。