Excel基于用户更改范围中的另一个单元格来更新范围中的单元格值

时间:2017-06-30 02:16:20

标签: excel vba excel-vba

我已经使用了一些Excel VBA一段时间,但我还是很新的。我已经搜索过这些问题,发现了一些类似的东西,但没有一个能够根据我的需要正确修改。

我有一个数据输入表,用户手动输入col B中的数据(来自验证列表)。如果他在col 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

任何人都可以告诉我在哪里犯规吗?

2 个答案:

答案 0 :(得分:1)

If Range("B" & i).Value = "N/A" Then

如果单元格有#N/A,则其.Value既不是文字也不是数字,而是Error Variant,错误代码为2042。您无法将错误变体与字符串进行比较,而是运行时错误 type mismatch

因此,要检查错误情况,请使用

If isError(Range("B" & i).Value) Then

或者要检查特定错误NA,您可以使用

If Application.IsNA(Range("B" & i).Value) Then

最后,如果你想获得单元格的显示文本,你可以使用.Text属性(不是推荐的测试方法):

 If Range("B" & i).Text = "#N/A" Then

最后,在你更正后,正如@ YowE3k在评论中说的那样,如果你想改变它里面的东西,在你的Worksheet_Change例程的条目中禁用事件,否则你将有一个可重入的例程和一个猜猜:stackoverflow

答案 1 :(得分:1)

以下代码应该可以阻止您的内存溢出:

match '/posts/multiple_action', to: 'posts#multiple_action', via: [:create, :patch, :get, :options]

注意:正如ASH在答案中提到的,如果您实际上没有检查字符串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 ,但是正在检查N/A错误情况,则需要更改{{1}声明。