事件处理程序 - 单元未按预期更新

时间:2014-09-19 18:20:05

标签: excel-vba vba excel

代码:

Private Sub Worksheet_change(ByVal target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False

Dim cell

For Each cell In Me.UsedRange.Columns("E").Cells
    If cell.Text = "Cu" And cell.offset(0, -1) = "WR229" Then
        MsgBox "Cu not permitted for WR229 or larger waveguide", vbOKOnly, "Cu Alert"
        cell = "Al"
    End If
Next cell

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

问题是当条件满足时,单元格不会重置为值“A1”。为什么不呢?

3 个答案:

答案 0 :(得分:1)

代码

Private Sub Worksheet_change(ByVal target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False

If target = "Cu" And target.offset(0, -1) = "WR229" Then
    MsgBox "Cu not permitted for WR229 or larger waveguide", vbOKOnly, "Cu Alert"
    target = "Al"
End If

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub  

解释

由于您针对每次更改执行此循环,因此您不需要遍历整个列,并且使用target将不得不使用Value属性。

答案 1 :(得分:1)

OP代码失败的一个可能原因是UsedRange未在列A中启动。如果列A中没有数据且根本没有格式化,则会发生这种情况。

为什么呢?由于.Columns(以及此问题.Rows.Cells相对到指定范围。例如,如果UsedRangeB2:Z10,则Me.UsedRange.Columns("E")将引用范围F2:F10

OP代码中的另一个问题是它将针对任何单元格更改运行,包括列A中的单元格更改。这将引发错误,因为列A中的偏移-1无效。

那么,如何修复呢?正如jbarker2160所回答的,您应该利用Target参数,该参数告诉您哪些单元格已更改。然而,这个答案留下了一些问题。

  • 我们要检查列E =“Cu”和列D是否为“WR229”,但我们不知道将首先输入哪一个
  • 我们应该考虑一次更改几个单元格的可能性,例如由于复制/粘贴
  • 我们应该处理可能的错误并且让事件无法启用
  • OP的代码区分大小写。即当“Cu”不是时,将接受“CU”。这是理想的行为吗? (如果,请从下面的代码中删除UCase$()
  • OP的代码隐含的是,有一系列较大的波导不允许使用Cu。这在下面的代码中仍未解决。

此代码解决了上述问题

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rw As Range

    On Error GoTo EH
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    For Each rw In Application.Intersect( _
      Target.EntireRow, Me.UsedRange.EntireRow.Columns("D:E")).Rows

        If UCase$(rw.Cells(1, 2)) = "CU" And UCase$(rw.Cells(1, 1)) = "WR229" Then
            MsgBox "Cu not permitted for WR229 or larger waveguide", _
              vbOKOnly, "Cu Alert"
            rw.Cells(1, 2) = "Al"
        End If
    Next
EH:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

答案 2 :(得分:0)

更改此行:

cell = "Al"

对此:

cell.Value = "Al"