代码:
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”。为什么不呢?
答案 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
)相对到指定范围。例如,如果UsedRange
为B2:Z10
,则Me.UsedRange.Columns("E")
将引用范围F2:F10
。
OP代码中的另一个问题是它将针对任何单元格更改运行,包括列A
中的单元格更改。这将引发错误,因为列A
中的偏移-1无效。
那么,如何修复呢?正如jbarker2160所回答的,您应该利用Target
参数,该参数告诉您哪些单元格已更改。然而,这个答案留下了一些问题。
E
=“Cu”和列D
是否为“WR229”,但我们不知道将首先输入哪一个UCase$()
)此代码解决了上述问题
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"