我已经使用了一些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
任何人都可以告诉我在哪里犯规吗?
答案 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}声明。