恢复公式的显示结果
Recover the displayed result of a formula
我尝试检索单元格中显示的值:
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)
中显示的结果存储为字符串?
如果我没记错的话,recherchev
是 VLookup
的荷兰语版本。这个 returns #N/A
什么都没找到,但是要注意这是 不是 字符串 "#N/A"
,它是一个 错误 是 VBA.
中自己的数据类型
您不能将错误与字符串进行比较,否则会导致类型不匹配。
正如 BigBen 在评论中所写,您可以使用 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
请尝试更换:
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字符串。这是你的情况吗?
我尝试检索单元格中显示的值:
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)
中显示的结果存储为字符串?
如果我没记错的话,recherchev
是 VLookup
的荷兰语版本。这个 returns #N/A
什么都没找到,但是要注意这是 不是 字符串 "#N/A"
,它是一个 错误 是 VBA.
您不能将错误与字符串进行比较,否则会导致类型不匹配。
正如 BigBen 在评论中所写,您可以使用 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
请尝试更换:
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字符串。这是你的情况吗?