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既不是文本也不是数字,而是错误代码为2042Error 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