简单的“识别和替换”Excel VBA代码

时间:2014-02-10 16:57:41

标签: excel-vba vba excel

我有两列“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”)。值=“否”

1 个答案:

答案 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列(例如,如果cellB2 ,然后cell.Offset(, -1)会引用A2
  • 然后我们在行If cell.Offset(, -1) = "aaa" Or cell.Offset(, -1) = "ddd" Then中测试标准 - 如果列A中的相应单元格是“aaa”或“ddd”,则将列B中的值更改为“是”,否则列B
  • 中的单元格不执行任何操作
  • 最后一步 - cell.Locked = (cell = "YES") - 如果单元格包含“是”,则锁定它,否则解锁。