【问题标题】:Recover the displayed result of a formula恢复公式的显示结果
【发布时间】:2021-12-07 07:15:49
【问题描述】:

我尝试检索单元格中显示的值:

Private Sub Check_Commentaires()

    'Declarations des variables
    Dim WB1 As Workbook
    Dim i, val2
    Dim val1 As Variant
    Set WB1 = ActiveWorkbook
    
    For i = 2 To 10000
        val1 = WB1.Sheets("Avant").Cells(i, 7).Value
        val2 = WB1.Sheets("Avant").Cells(i, 14).Value
        If (val1 = "#N/A" And val2 = "") Or (val1 = "0" And val2 = "") Then
            ThisWorkbook.Sheets("Feuil1").Cells(4, 6).Value = "NOK"
            WB1.Close False
            Exit Sub
        Else
            ThisWorkbook.Sheets("Feuil1").Cells(4, 6).Value = "OK"
        End If
    Next
        WB1.Close False
End Sub

但是在这个单元格中 (i,7) 我有 =recherchev(something...) 所以它不适用于错误消息“类型兼容性”。

有没有办法将WB1.Sheets("Avant").Cells(i, 7) 中显示的结果存储为字符串?

【问题讨论】:

  • 如果WorksheetFunction.IsNA(val1),则声明val1 As Variant
  • 请显示正确的minimal reproducible example,包括您的变量声明。 val1val2 是如何声明的? • 还请包括对您正在尝试做的事情的描述。你的目标是什么?
  • 在 val1 上使用 WorksheetFunction.IsNA(val1) 出现相同的错误 2042
  • 那是因为val1="0" 将因类型不匹配而失败。可能最好将If 分开。您不能将错误值与字符串进行比较,因此当val1 是错误值时,val1 = "0" 将引发类型不匹配错误。

标签: excel vba storage formula display


【解决方案1】:

请尝试替换:

       If (val1 = "#N/A" And val2 = "") Or (val1 = "0" And val2 = "") Then
            ThisWorkbook.Sheets("Feuil1").Cells(4, 6).Value = "NOK"
            WB1.Close False
            Exit Sub
        Else
            ThisWorkbook.Sheets("Feuil1").Cells(4, 6).Value = "OK"
        End If

  If IsError(val1) Then ' error
        If val1 = CVErr(2042) And val2 = "" Then 'N#A error and empty string in val2
           ThisWorkbook.Sheets("Feuil1").cells(4, 6).Value = "NOK"
           wb1.Close False
           Exit Sub
        End If
  ElseIf val1 = "0" And val2 = "" Then                                'no error
        ThisWorkbook.Sheets("Feuil1").cells(4, 6).Value = "NOK"
        wb1.Close False
        Exit Sub
  Else
      ThisWorkbook.Sheets("Feuil1").cells(4, 6).Value = "OK"
  End If

val2 = "0" 应该表示它是一个 0 字符串。这是你的情况吗?

【讨论】:

  • 谢谢! val2 = "0" 是一个错误。
  • @NewCSharpWork 好的。另一个建议呢?我的意思是最后的WB1.Close 行......上面的建议不是你需要的吗?
  • 它就像我想要的那样工作,因为如果第一个 WB1.Close 是触发器,我会使用 exit sub。
  • @NewCSharpWork 没错。我错过了那部分,我只看了我准备的代码...... :)。我将删除那部分。并且,最终将其添加到代码答案中...
【解决方案2】:

如果我是正确的,recherchevVLookup 的荷兰语版本。这会在找不到任何内容时返回 #N/A,但请注意,这 不是 字符串 "#N/A",它是一个 错误,它是 VBA 中自己的数据类型。

您不能将错误与字符串进行比较,您会得到类型不匹配。

正如 BigBen 在 cmets 中所写,您可以使用 WorksheetFunction.IsNA(val1) 检查它是否包含错误。但是,如果您将 If 语句更改为:

If (WorksheetFunction.IsNA(val1) And val2 = "") Or (val1 = "0" And val2 = "") Then

如果 val1 由于第二个条件而持有 #N/A,您仍然会遇到相同的运行时错误 - val1 = "0" 仍然会引发该错误。 VBA 将评估 If 语句的所有部分,即使第一部分为真(因此整个 If 条件为 TRUE Or anything 将始终为真)。

最简单的解决方案:

val1 = WB1.Sheets("Avant").Cells(i, 7).Value
If WorksheetFunction.IsNA(val1) then val1 = 0
val2 = WB1.Sheets("Avant").Cells(i, 14).Value
If val1 = 0 And val2 = "" Then
   (...)
Else
   (...)
End If

【讨论】:

  • 谢谢,recherchev 是法文版!
  • ...您应该使用英文公式名称,这样我们就不必猜测或谷歌了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多