Excel根据用户更改范围内的另一个单元格更新范围中的单元格值
我一直在用Excel VBA工作一段时间,但我还是很新的。 我search了这些问题,发现了一些类似的东西,但没有一个能够正确修改我的需求。
我有一个数据input表,用户在col B中手动input数据(来自validation的列表)。如果他selectcol B中的N / A,则需要清除col D和H中的相关数据(对于同一行)。 该表具有固定不变的行数。
我已经尝试了一些方法,但是我在这里推动了我的理解极限。 下面的方法似乎很简单,但每次尝试时都会导致excel崩溃。 我已经在适当的工作表模块中。
Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long For i = 1 To 500 If Range("B" & i).Value = "N/A" Then Range("D" & i,"H" & i).Value = "" End If Next i End Sub
任何人都可以告诉我,我在哪里弄污?
下面的代码应该会停止你的内存溢出:
Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range 'check whether anything needs to be processed If Not Intersect(Target, Columns("B")) Is Nothing Then Application.EnableEvents = False ' stop other events from firing 'process each cell that has changed For Each c In Intersect(Target, Columns("B")).Cells If c.Value = "N/A" Then c.Offset(0, 2).Value = "" c.Offset(0, 6).Value = "" End If Next Application.EnableEvents = True ' allow other events to fire End If End Sub
注意:正如ASH在他们的回答中提到的,如果你实际上没有检查stringN/A
,但是检查#N/A
错误条件,你将需要改变你的If
语句。
If Range("B" & i).Value = "N/A" Then
如果单元格具有.Value
#N/A
,则它的.Value
既不是文本也不是数字,而是错误代码为2042
的Error Variant
。 您无法将错误变体与string进行比较,这是运行时错误types不匹配 。
所以要检查一个错误的情况下,使用
If isError(Range("B" & i).Value) Then
或者检查具体的错误NA
,你可以使用
If Application.IsNA(Range("B" & i).Value) Then
最后,如果你想获得单元格的显示文本,你可以使用.Text
属性(不是推荐的方法来testing它):
If Range("B" & i).Text = "#N/A" Then
最后,在你改正这个之后,就像@ YowE3k在评论中所说的那样,如果你想改变它里面的东西,在你的Worksheet_Change
例程的入口处禁用事件,否则你将有一个可重入的例程和一个猜测: stackoverflow
。