VBA将命名范围内的N/A替换为0

VBA将命名范围内的N/A替换为0,vba,excel,excel-formula,Vba,Excel,Excel Formula,我正在尝试使用以下代码替换我的命名范围内的N/A值,该值来自以前的操作: For Each cl In m If cl.Value = "#N/A" Then Set cl.Value = 0 End If Next cl 但这给了我垃圾输出。 我做错了什么?检查错误的方法是使用iError函数。变量值不包含字符串N/A,尽管单元格的.Text值会包含,但只有当单元格宽度足够大时才会包含。所以伊瑟罗是一个更安全的赌注。一旦确定单元格中包含错误,下一个任务就是使用

我正在尝试使用以下代码替换我的命名范围内的N/A值,该值来自以前的操作:

For Each cl In m
    If cl.Value = "#N/A" Then
        Set cl.Value = 0
    End If
Next cl
但这给了我垃圾输出。
我做错了什么?

检查错误的方法是使用iError函数。变量值不包含字符串N/A,尽管单元格的.Text值会包含,但只有当单元格宽度足够大时才会包含。所以伊瑟罗是一个更安全的赌注。一旦确定单元格中包含错误,下一个任务就是使用CVErr函数查找错误。为了完整起见,我在下面的示例代码中包含了所有错误,可以在这里找到对函数的解释:


您可以像这样尝试您的代码

For Each cl In m
    If IsError(cl) Then
        cl.Value = 0
    End If
Next cl
有几个选择

保留工作表上的所有内容我最喜欢的,从那时起,您就没有将关键功能隐藏在VBA层中。使用公式=IFNAA1,0,其中A1包含要测试的单元格,或在旧版本的Excel中使用公式=IFISNAA1,0,A1

使用VBA。如果v是包含单元格值的变量,则使用

If IsError(v) Then
    If v = CVErr(xlErrNA) Then
        'Set the cell to 0
    End If
End If
其中需要嵌套块,因为VBA不支持短路和,并且相等性测试=可能会导致某些变量类型出错

使用可以说是最清晰的

如果Excel.WorksheetFunction.IsNAv

作为对使用VBA解决方案的最后警告,请注意,2和3有删除公式的倾向,这些公式的参数取决于设置为N/a的单元格,因为N/a倾向于通过大多数内置Excel函数传播。

更简单的版本:

'Set range to whatever you like
Dim rng As Range
Set rng = Worksheets(1).Range("A1:A2")

'Loop all the cells in range
For Each cell In rng
    If Application.WorksheetFunction.IsNA(cell) Then
        'If cell contains #N/A, then set the value to 0
        cell.value = 0
    End If
Next

这也将替换其他错误,例如值!那是真的。但理想情况下,如果数据和公式管理正确,工作表上不应出现任何此类错误。在这种情况下,如果范围内只有一个错误N/A,则建议的代码将起作用:使用Select:@ShaiRado的非常简洁的解决方案,我很乐意将其称为我自己的解决方案,但这是微软网站上推荐的模式!是的,这样就很清楚了。投票表决。尽管如此,我还是更愿意在工作表上保留这类内容。正确的做法是,不使用VBA,只需使用=IFISNA1;0; A1。我只是认为使用VBA是有原因的。公平点。但由于我是一个老猫,我总是质疑VBA的使用。1997年很酷,但有时会造成比实际情况更大的麻烦。e、 很难进行版本控制,许多组织不允许打开xls或xlsm文件。我非常喜欢这个答案-功能选项绝对值得考虑。
'Set range to whatever you like
Dim rng As Range
Set rng = Worksheets(1).Range("A1:A2")

'Loop all the cells in range
For Each cell In rng
    If Application.WorksheetFunction.IsNA(cell) Then
        'If cell contains #N/A, then set the value to 0
        cell.value = 0
    End If
Next