【问题标题】:Using a VBA Try/Except Equivalent for If/Else对 If/Else 使用 VBA Try/Except 等效项
【发布时间】:2019-05-13 16:14:45
【问题描述】:

我正在尝试遍历一些电子表格范围并使用 try/except 来构建 if/else 语句。我这样做的原因是因为 IsNumeric() 不适合我,所以我正在尝试做这样的事情(尝试从 python 格式化除外)

Dim Temp as Integer
Dim Myrange as Range
Dim Myrow as Range
Set Myrange = Range("A1","A1000")
For Each Myrow in Myrange.Row
  If IsEmpty(Range("A" & Myrow.Row)) Then  
    Exit For 'To escape the loop at the end of the filled cells
  Else
    Try:
      Temp = (Myrow.Value() - 0) 'This causes a #VALUE! error when the Myrow.Value is not a number.
    Except:
        Range("B" & Myrow.Row).Value = Temp 'this sets the value of the rightmost cell to whatever current value of Temp is.  

我还尝试了其他一些错误捕获,但似乎无法在 VBA 中获取它。

For Each Myrow In Myrange.Rows
       If IsEmpty(Range("A" & Myrow.Row)) Then
         Exit For
       Else
           On Error Resume Next
           Temp = Myrow.Value() - 0
           If Err.Number = 0 Then
               Range("A" & Myrow.Row).Value = ""
           ElseIf Err.Number <> 0 Then
               Range("B" & Myrow.Row) = Temp
           End If
       End If
   Next Myrow

我真的只是想顺着列表往下看,看到第一个数字,设置 B0 的值:Bn1 = Temp,当 An 被击中(新数字)时,Temp 的值变为 temp2,然后单元格 Bn1+1 -> Bn2-1 是 temp2,直到找到一个新数字等。

在工作表中,我可以通过向下拖动公式 =(A1-0) 来查看那些不是数字但由于某种原因我无法对其进行编码的错误消息。


使用@MathieuGuindon 的建议解决了这个问题,方法是使用变体类型并对其进行测试。解决方案代码:

    Dim Myrange As Range
    Dim Myrow As Range
    Dim Temp As Variant
    Dim NextTemp As Variant

    Set Myrange = Selection
    For Each Myrow In Myrange.Rows
        NextTemp = Range("A" & Myrow.Row).Value
        If IsEmpty(Range("A" & Myrow.Row)) Then
          Exit For
        ElseIf IsNumeric(NextTemp) Then
            Temp = NextTemp
            Range("A" & Myrow.Row).Value = ""
        Else
            Range("B" & Myrow.Row).Value = Temp
                End If
    Next Myrow

【问题讨论】:

  • 这条线应该在做什么Myrow.Value() - 0
  • 最好的错误处理是没有错误处理 - 如果将Temp 分配给MyRow.Value 会引发类型不匹配,将MyRow.Value 读入Variant 并确定是否IsNumeric(MyRow.Value) 在尝试将其强制转换为 Integer 之前;那么你就不用担心错误处理了。
  • 另外On Error Resume Next 应该与恢复错误处理的On Error GoTo 0 语句配对 - 没有它,OERN 将抑制过程范围内的所有错误。
  • 您在尝试使用IsNumeric(Myrow.Value) 时遇到什么错误?
  • @MathieuGuindon 我本来想问你关于“最好的错误处理是没有错误处理”的更多细节,然后我发现你已经有一个 blog post 覆盖它。有助于更好地理解该主题。

标签: excel vba error-handling


【解决方案1】:

稍微简化一下,学习 Mathieu 的 cmets,试试这个。虽然不确定你在做什么,但可能不太正确。

Sub x()

Dim Temp As Variant
Dim Myrange As Range
Dim Myrow As Range

Set Myrange = Range("A1", "A1000")

For Each Myrow In Myrange
    If Not IsEmpty(Myrow) Then
        Temp = Myrow.Value - 0
            If IsNumeric(Temp) Then
               Myrow.Value = vbNullString
            Else
                Myrow.Offset(, 1).Value = Temp
            End If
    End If
Next Myrow

End Sub

【讨论】:

  • 这基本上就是我所做的,谢谢。不知道如何发布我的代码。
  • 感谢您接受我的回答。但是,如果您愿意,您可以发布自己的代码作为答案。
【解决方案2】:

一种方法是在您的子程序末尾有一个专用的错误处理程序,并检查错误代码(13 表示类型不匹配):

选项显式 公共子枚举值() On Error GoTo err_handle 将温度调暗为整数 将 Myrange 调暗为范围 将 Myrow 调暗为范围 将 myNumber 调暗为 Double ' Int?长的? 设置 Myrange = Range("A1", "A1000") 对于 Myrange.Rows 中的每个 Myrow If IsEmpty(Range("A" & Myrow.Row)) 那么 Exit For ' 在填充单元格结束时退出循环 别的 myNumber = CDbl(Myrow.Value()) Debug.Print myNumber 万一 ' 使用标签,因为 VBA 不支持循环继续。 循环继续: 下一个迈罗 退出我: 退出子 错误句柄: 选择 Case Err.Number 案例 13 ' 类型不匹配 转到循环_继续 其他情况 MsgBox Err.Description, vbOKOnly + vbCritical, Err.Number 转到exit_me 结束选择 结束子

这样,如果我们遇到 CDbl(或等效函数)失败的值,我们只需继续下一行。

【讨论】:

    【解决方案3】:

    虽然第一个示例包含 Try:Except: 作为标签,但它们不提供错误控制。 Try/Except 是 错误控制方法,而不是

    不清楚您是否可能在 A 列中有看起来像数字的文本。如果 Temp = (Myrow.Value() - 0) 仅用于确定 A 列中的值是否为数字而不用作转换,那么 SpecialCells 可以快速找到数字在 A 列中。

    dim rng as range
    
    on error resume next
    'locate typed numbers in column A
    set rng = Range("A:A").SpecialCells(xlCellTypeConstants, xlNumbers)
    on error goto 0
    
    If not rng is nothing then
        rng = vbNullString
    End If
    
    on error resume next
    'locate text values in column A
    set rng = Range("A:A").SpecialCells(xlCellTypeConstants, xlTextValues)
    on error goto 0
    
    If not rng is nothing then
        rng.Offset(0, 1) = rng.Value
    End If
    

    您还可以使用xlCellTypeFormulas 返回公式返回的数字或文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多