【发布时间】: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