在多个范围内替换#Ref

时间:2019-09-18 20:25:36

标签: excel vba

编码新手,如果仍然完全不了解上下文,而我仍在尝试学习它们,那么请抱歉。

我有一些单元正在尝试从另一个工作表中的几个数据透视表中提取数据。如果无法从数据透视表中提取任何信息,它将返回#REF。该宏应该在几个范围内的每个单元格中搜索以查找#REF并将其替换为0。之所以要使用该范围而不是整个工作表,是因为某些方程式试图从表中添加值并且由于其中一些值为#REF,因此总和最终也为#REF。我需要将这些方程式保留在那里,因此一旦替换#REF,它们将得到总和。

    Dim Areas(13) As Range
    Set Areas(1) = Range("C5:Z7")
    Set Areas(2) = Range("C10:Z14")
    Set Areas(3) = Range("C27:Z27")
    Set Areas(4) = Range("C33:Z45")
    Set Areas(5) = Range("C52:Z55")
    Set Areas(6) = Range("C58:Z61")
    Set Areas(7) = Range("C63:Z66")
    Set Areas(8) = Range("C68:Z72")
    Set Areas(9) = Range("C74:Z78")
    Set Areas(10) = Range("C80:Z84")
    Set Areas(11) = Range("C86:Z90")
    Set Areas(12) = Range("C92:Z96")
    Set Areas(13) = Range("C102:Z112")

    For R = 1 To 13
        For Each cell In Areas(R)            'Error: For Each may only iterate over a collection object 
            If cell.Value = CVErr(xlErrName) Then
                .Replace What:="#REF!", Replacement:="0", LookAt:=xlPart, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
            Else
        Next

在我的代码之后,我做了很多说明,以尝试根据下面列出的其他StackOverflow问题进行解决。我认为他们的工作将形成一个单一的范围,但我正在与多个。 如果我所做的一切都没有意义,请忽略以下内容,并帮助我重新开始。 (请?)让我知道是否需要更多信息。

    If IsError(cell.Value) Then
'    If cell.Value = CVErr(xlErrName) Then
'        ...
'    End If
'End If

'Dim nm As Name
'    For Each nm In ActiveWorkbook.Names
'        If InStr(nm.Value, "#REF!") > 0 Then
'            nm.Delete
'    End If
    'Next nm

'    ActiveCell.Replace What:="#REF!", Replacement:="0", LookAt:=xlPart, _
'        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
'        ReplaceFormat:=False

'With Range("B11:AP55").SpecialCells(xlCellTypeFormulas)
'    .Formula = Replace(.Formula, "#REF", "Master", , , vbTextCompare)
'End With

1 个答案:

答案 0 :(得分:1)

作为Find的替代方法,请考虑使用SpecialCells

仅删除 #REF错误

Sub Demo1()
    Dim rng As Range
    Dim rErr As Range
    Dim cl As Range

    With ActiveSheet 'or specify a specific sheet
        Set rng = .Range("C5:Z7,C10:Z14,C27:Z27,C33:Z45,C52:Z55,C58:Z61,C63:Z66,C68:Z72,C74:Z78,C80:Z84,C86:Z90,C92:Z96,C102:Z112")
    End With

    On Error Resume Next
    Set rErr = rng.SpecialCells(xlCellTypeFormulas, xlErrors)
    On Error GoTo 0

    If Not rErr Is Nothing Then
        For Each cl In rErr.Cells
            If cl.Value = CVErr(xlErrRef) Then
                cl.Offset(0, 1) = 0
            End If
        Next
    End If
End Sub

要删除所有错误:

Sub Demo2()
    Dim rng As Range
    Dim rErr As Range

    With ActiveSheet 'or specify a specific sheet
        Set rng = .Range("C5:Z7,C10:Z14,C27:Z27,C33:Z45,C52:Z55,C58:Z61,C63:Z66,C68:Z72,C74:Z78,C80:Z84,C86:Z90,C92:Z96,C102:Z112")
    End With

    On Error Resume Next
    Set rErr = rng.SpecialCells(xlCellTypeFormulas, xlErrors)
    On Error GoTo 0

    If Not rErr Is Nothing Then
        rErr = 0
    End If
End Sub