VBA – 值转换#REF! 例外
除了#REF之外,指定区域应该被转换为值是一个问题! 是错误的。
Sub keplet_helyett_ertek() Range("C3:J65").Select For Each akt_range In Selection.Areas If akt_range.Value <> CVErr(xlErrRef) Then akt_range.Formula = akt_range.Value End If Next End Sub
然后,运行时“13”错误
另一个问题是,如果一个单元格不包含错误值,你也会得到types不匹配。 要采取的testing是:
For Each akt_range In Range("C3:J65") If Not IsError(akt_Range.Value) Then akt_range.Formula = akt_range.Value End If Next
For Each akt_range In Selection.Areas
应该
For Each akt_range In Selection
为了更有效的替代
Range("C3:J65").Select For Each akt_range In Selection.Areas
同
Dim akt_range As Range For Each akt_range In Range("C3:J65")
Sub keplet_helyett_ertek() Dim akt_range As Range, ok As Boolean Range("C3:J65").Select For Each akt_range In Selection ok = Not IsError(akt_range.Value) If Not ok Then ok = (akt_range.Value <> CVErr(xlErrRef)) If ok Then akt_range.Formula = akt_range.Value Next End Sub
如果像问题状态一样,你只对排除#REF!
感兴趣#REF!
错误, 这是正确的检查:
For Each akt_range In Range("C3:J65") If CStr(akt_range.Value2) <> CStr(CVErr(xlErrRef)) Then akt_range.Value = akt_range.Value2 End If Next
从技术上讲,上面的错误代码在#REF!
返回一个公式的特殊情况#REF!
确切地说,例如, ="Error 2023"
。 绝对防弹检查是这样的:
For Each akt_range In Range("C3:J65") If Not IsError(akt_range.Value2) Or CStr(akt_range.Value2) <> CStr(CVErr(xlErrRef)) Then akt_range.Value = akt_range.Value2 End If Next
如果你想排除所有错误,更好的解决scheme是使用.SpecialCells()
来消除循环前范围内的错误:
For Each akt_range In Range("C3:J65").SpecialCells(xlCellTypeFormulas, xlLogical + xlNumbers + xlTextValues) akt_range.Value = akt_range.Value2 Next