2014-09-19 83 views
0

代码:事件处理程序 - 不更新单元格按预期

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 

的问题是,当条件满足时,细胞不会被重置为值“铝”。为什么不?

+0

您是否尝试过将在圈顶部一个断点,单步调试代码? – paulroho 2014-09-19 18:41:47

回答

1

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

为什么?因为.Columns(和.Rows.Cells就此而言)是相对到指定的范围。例如,如果UsedRangeB2:Z10,则Me.UsedRange.Columns("E")将参考范围F2:F10

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

那么,如何解决它?正如jbarker2160回答的那样,您应该利用参数Target,该参数告诉您哪些单元格已更改。但是这个答案留下了一些问题。

  • 我们要检查E柱=“铜”和列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 
+0

更好的解决方案。我不知道EnableEvents可能是错误的。谢谢,克里斯。 – jmaz 2014-09-20 19:30:19

0

改变这一行:

cell = "Al" 

要这样:

cell.Value = "Al" 
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属性。

+0

aphoria的答案很有帮助,而且这更进一步。感谢您通过更好的编码练习来帮助我。 – jmaz 2014-09-19 19:09:09

+0

解决问题后,您应该回到帖子并将最有帮助的答案标记为“答案”。 – 2014-09-22 16:57:50

+0

我标记了chris neilsens的回答最有帮助。 – jmaz 2014-09-22 17:44:41