VBA-在命名范围内将#N / A替换为0

时间:2017-05-09 04:53:18

标签: excel vba excel-vba excel-formula

我正在尝试使用此代码替换上一个操作中命名区域中的#N / A值:

For Each cl In m
    If cl.Value = "#N/A" Then
        Set cl.Value = 0
    End If
Next cl

但是这给了我垃圾输出。 我做错了什么?

4 个答案:

答案 0 :(得分:2)

检查错误的方法是使用IsError()功能。变量值不会包含字符串" #N / A"虽然单元格的.Text值会(但只有当单元格宽度足够大时)。所以IsError是一个更安全的赌注。一旦您确定您的单元格包含错误,您的下一个任务就是使用CVErr()函数查找哪个单元格。为了完整起见,我在下面的示例代码中包含了所有错误(有关函数的说明,请访问:https://msdn.microsoft.com/en-us/library/bb211091(v=office.12).aspx

Dim cell As Range
Dim v As Variant

Set cell = Sheet1.Range("A1")
v = cell.Value

If IsError(v) Then
    Select Case v
        Case CVErr(xlErrDiv0)
        Case CVErr(xlErrNA)
            cell.Value = 0
        Case CVErr(xlErrName)
        Case CVErr(xlErrNull)
        Case CVErr(xlErrNum)
        Case CVErr(xlErrRef)
        Case CVErr(xlErrValue)
        Case Else
    End Select
End If

答案 1 :(得分:1)

一些选择。

  1. 将所有内容保存在工作表中(从那时起,我最喜欢的就是在VBA层中隐藏了关键功能)。使用公式=IFNA(A1, 0),其中A1包含要测试的单元格,或者在旧版本的Excel中使用=IF(ISNA(A1), 0, A1)

  2. 使用VBA。如果v是包含单元格值的Variant,请使用

    If IsError(v) Then
        If v = CVErr(xlErrNA) Then
            'Set the cell to 0
        End If
    End If
    

    您需要嵌套块的位置,因为VBA不支持短路And,并且对等式=的测试可能会导致某些变体类型出错。

  3. 使用可以说是最清晰的

    If Excel.WorksheetFunction.IsNA(v)

  4. 作为针对此使用VBA解决方案的最后警示性评论,请注意(2)和(3)倾向于删除其参数取决于值设置为#N/A的单元格为#N/A的公式倾向于通过大多数内置的Excel函数传播

答案 2 :(得分:1)

更简单的版本:

'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

答案 3 :(得分:-1)

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

For Each cl In m
    If IsError(cl) Then
        cl.Value = 0
    End If
Next cl