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