【问题标题】:Type mismatch when checking for a formula error in VBA [duplicate]检查 VBA 中的公式错误时类型不匹配 [重复]
【发布时间】:2020-07-31 08:56:37
【问题描述】:

我有一个简单的 vba 代码来更改列 Y 和 Z 上的一些值。代码如下:

Option Explicit

Sub removeVALUE()

Application.ScreenUpdating = False

Dim i As Long
Dim LastRow As Long
Const startrow As Byte = 2

LastRow = Range("Y" & Rows.Count).End(xlUp).Row

For i = startrow To LastRow

If Range("Y" & i).Value = "N/A" Then
    Range("Y" & i).Value = "F"
End If

Next i

Application.ScreenUpdating = True

End Sub

代码在 Y 列上运行良好,但是当我将所有范围 Y 更改为范围 Z 时,它将返回类型不匹配的错误。我一直在想,但似乎找不到原因。谁能帮我?我不知道为什么它会给我这个错误。

【问题讨论】:

  • 看起来您在某处出现公式错误。目视检查列中的单元格。您可能还想参考THIS
  • 您有哪个 Excel 版本?执行在什么时候停止?
  • 原来我有#VALUE!在其中一个细胞中。使用 isError 修复它。谢谢!
  • 太棒了。然后将其作为副本关闭。

标签: excel vba


【解决方案1】:

您首先必须检查单元格的计算结果是否完全错误(使用IsError()),然后您可以检查错误类型。

仅检查单元格是否包含值“N/A”不起作用,您需要使用 CVErr(xlErrNA) 检查错误号。

你可以试试这个修改后的代码:

Sub removeVALUE()

    Application.ScreenUpdating = False

    Dim i As Long
    Dim LastRow As Long
    Const startrow As Byte = 2
    
    LastRow = Range("Y" & Rows.Count).End(xlUp).Row
    
    For i = startrow To LastRow
        
        'Check if the cell evaluates to an error
        If IsError(Range("Y" & i).Value) Then
            'Check the error type (xlErrNA for N/A error
            If Range("Y" & i).Value = CVErr(xlErrNA) Then
                Range("Y" & i).Value = "F"
            End If
        End If
    
    Next i
    
    Application.ScreenUpdating = True

End Sub

如果您想检查不同类型的错误,您可以使用以下常量代替xlErrNa(取自Microsofts documentation):

Constant    Error number    Cell error value
xlErrDiv0   2007            #DIV/0!
xlErrNA     2042            #N/A
xlErrName   2029            #NAME?
xlErrNull   2000            #NULL!
xlErrNum    2036            #NUM!
xlErrRef    2023            #REF!
xlErrValue  2015            #VALUE!

【讨论】:

  • 谢谢!原来我有一个#VALUE!在其中一个细胞中
  • @user99 我已经用其他错误类型的正确常量更新了我的答案。
【解决方案2】:

首先检查错误值

  • 声明为Byte 没有任何好处。最好对所有整数使用 Long
  • 如果N/A 是文本,那么这将起作用。如果是 #N/A,请使用 Michael Wycisk 的解决方案。

守则

Option Explicit

Sub removeVALUE()

    Const StartRow As Long = 2
    Const CritCol As String = "Y"
    Const CritVal As String = "N/A"
    Const NewVal As String = "F"
    
    Dim LastRow As Long
    LastRow = Range(CritCol & Rows.Count).End(xlUp).Row
    
    Application.ScreenUpdating = False
    
    Dim Current As Variant, i As Long
    
    For i = StartRow To LastRow
        Current = Range(CritCol & i).Value
        If Not IsError(Current) Then
            If Current = CritVal Then
                Range(CritCol & i).Value = NewVal
            End If
        End If
    Next i
    
    Application.ScreenUpdating = True

End Sub

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2020-12-10
    • 2014-01-05
    • 1970-01-01
    • 2017-04-12
    • 2017-04-14
    相关资源
    最近更新 更多