Select Case 错误2007

3

我循环遍历一个数组并检查单元格的值,然而有时候检查到的单元格值是 "#DIV/0!",这时我的宏就会停止运行。怎样才能解决这个问题?我已经尝试了两种方法但都没有取得积极的效果。

vRange = Range(Cells(ShiftRow, 4), Cells(ShiftRow - 3, TheLastColumn)).Value

Dim i As Integer

For i = 4 To TheLastColumn
    Select Case vRange(4, i)
        Case Is = "#DIV/0!"
            vRange(1, i) = ""
        Case Is = "1"
            vRange(1, i) = vRange(3, i)
        Case Is = "2"
            vRange(1, i) = vRange(3, i - 1)
        Case Is = "3"
            vRange(1, i) = vRange(3, i - 2)
        Case Is = "I"
            vRange(1, i) = vRange(3, i)
        Case Is = "II"
            vRange(1, i) = vRange(3, i - 1)
        Case Is = "III"
            vRange(1, i) = vRange(3, i - 2)
        Case Else
            vRange(1, i) = ""

    End Select
Next i

我也尝试了:Case CVErr(xlErrDiv0)

1
你能在本地窗口中检查vRange的值吗?看起来你的循环应该是这样的:For i = 1 To UBound(vRange, 2)Case CVErr(xlErrDiv0)应该是正确的方式,所以错误可能出现在其他地方。 - Slai
如果在您的选择语句之前执行 If IsError(vRange(4, i)) then vRange(4, i) = "",会发生什么? - Rémi
@maers,请尝试使用我下面的答案中的错误捕获技术。 - Shai Rado
@Slai 我使用了 i = 4 To TheLastColumn,因为 LBound(vRange) To UBound(vRange) 只循环了1到4。但实际上 UBound(vRange, 2) 是可以的。然而,总体来说问题仍然存在。 @Rémi 它起作用了!谢谢! - maers
1
看起来你不需要使用 Case CVErr(xlErrDiv0),因为你的 Case Else 语句已经可以处理它了。 - Slai
4个回答

2

尝试使用On Error Resume Next捕获Error,并添加以下代码替换您的Select Case:

Dim i As Integer

On Error Resume Next
For i = 4 To TheLastColumn

    Select Case vRange(4, i)
        Case Is = "#DIV/0!"
            If err.Number = 13 Then ' this is Error number 13 when deviding by zero
                vRange(1, i) = ""
                err.Clear
            End If

        Case Is = "1"
            vRange(1, i) = vRange(3, i)
        Case Is = "2"
            vRange(1, i) = vRange(3, i - 1)
        Case Is = "3"
            vRange(1, i) = vRange(3, i - 2)
        Case Is = "I"
            vRange(1, i) = vRange(3, i)
        Case Is = "II"
            vRange(1, i) = vRange(3, i - 1)
        Case Is = "III"
            vRange(1, i) = vRange(3, i - 2)
        Case Else
            vRange(1, i) = ""

    End Select

Next i

谢谢!你和 Remi 的想法很相似,我会选择其中一个。 - maers

2

CStr([#DIV/0!]) 返回字符串 "Error 2007",因此您可以按照以下方式更改代码

vRange = Range(Cells(ShiftRow - 3, 4), Cells(ShiftRow, TheLastColumn)).Value ' the second cell is usualy the bottom right, but Excel takes care of that
Dim i As Integer

For i = 4 To UBound(vRange, 2)
    Select Case CStr(vRange(4, i))
        Case "1", "I":     vRange(1, i) = vRange(3, i)
        Case "2", "II":    vRange(1, i) = vRange(3, i - 1)
        Case "3", "III":   vRange(1, i) = vRange(3, i - 2)
        Case "Error 2007": vRange(1, i) = "" ' optional because Case Else can handle it
        Case Else:         vRange(1, i) = ""
    End Select
Next i

我不是专家(显然),但这似乎是最好的解决方案。谢谢。 - maers

1

除了Slai的出色回答之外,这些信息可能对未来的读者有所帮助。

我有一个.csv文件 - 纯文本 - 我正在运行一个脚本,以使任何不是数字的单元格变色。因此,对于每个单元格,我都会运行这个函数:

Function fnIsNumber(Value) As Boolean
   fnIsNumber = Evaluate("ISNUMBER(0+""" & Value & """)")
End Function

有些单元格的值(纯文本 - 记住这是csv)为#DIV/0!。对于这些单元格,上述函数会中止,并显示消息Run-time error '13': Type mismatch

在Excel宏中,即使是字符串#DIV/0!也会被评估为"Error 2007",因此我必须按照Slai上面的建议修改函数:

Function fnIsNumber(Value) As Boolean
   If CStr(Value) = "Error 2007" Then
      fnIsNumber = False
   Else
      fnIsNumber = Evaluate("ISNUMBER(0+""" & Value & """)")
   End If
End Function

0

包含错误的单元格返回一个不同的数据类型(子类型错误变体),而非错误单元格。这使得比较变得复杂。

一种方法是在另一个case语句中嵌套一个case语句。外部case检查单元格类型(错误/非错误)。内部case根据非错误值选择要执行的操作。我使用了TypeName函数来确定我正在处理的数据类型。

此示例适用于活动单元格。更新值以进行测试。

Sub test()
' Update contents of active cell to test.
' Test cases:
'
'   Value   Output
'   1/0     Error: Error 2007
'   1       One
'   Hi      Hi
'   <other> Other


    ' Outer case checks for errors.
    Select Case TypeName(ActiveCell.Value)
        Case "Error"
            ' We have an error.
            MsgBox "Error: " & CStr(CVErr(ActiveCell.Value))

        Case Else
            ' Non-error.
            ' Inner case checks cell content.
            Select Case ActiveCell.Value
                Case 1
                    ' User entered 1.
                    MsgBox "One"

                Case "Hi"
                    ' User entered "Hi".
                    MsgBox "Hi"

                Case Else
                    ' Unknown user entry.
                    MsgBox "Other"

            End Select
    End Select
End Sub

你可以通过添加第二个内部 case 来改进这个子程序,以检查不同的错误代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接