If Not IsError函数中的错误,如果没有返回Else

时间:2018-06-18 21:08:05

标签: excel vba

发布已在原始帖子

下方更新

我正在使用两个表并希望将它们连接起来,但是,第一部分包含的值多于第二部分。我能够通过在IfError函数中添加Evaluate来解决这个问题,从代码示例(1)到(2),(使用If Error Then Blank的帮助)

(1)

Worksheets("Sheet1").Range("Cell1").Value = Worksheets("Sheet1").Evaluate("=INDEX(data,MATCH(value,lookup_column,FALSE),column)") 

(2)

Worksheets("Sheet1").Range("Cell1").Value = Worksheets("Sheet1").Evaluate("=INDEX(data,MATCH(value,lookup_column,FALSE),column), Cell2")

但是,我仍然想要一条消息说有错误,所以我试过

Sub Name()
    Application.ScreenUpdating = False
    On Error GoTo Msg

    Worksheets("Sheet1").Range("Cell1").Value = Worksheets("Sheet1").Evaluate("=INDEX(data,MATCH(value,lookup_column,FALSE),column), Cell2")

    Worksheets("Sheet1").Range("Cell1").Value = Worksheets("Sheet1").Evaluate("=INDEX(data,MATCH(value,lookup_column,FALSE),column)")

    Exit Sub
Msg:         MsgBox "You've had a fatal error"
    End

End Sub

它没有返回消息,我假设这是因为VBA的代码写得正确而且Excel函数代码有错误。那么有没有办法使用另一个函数来确定excel错误?

这是较大编码的一个子部分,所以我知道它可以在excel中独立完成,但这只是整体的一小部分。提前谢谢。

UDATE

通过评论,我可以删除评估功能,并使用以下内容替换原始代码:

Sub SetWaterfall ()

Application.ScreenUpdating = False


 Dim vMatchVal As Variant

If Not IsError(vMatchVal) Then

vMatchVal = Application.Match(Sheets("Sheet1").Range("SelectLine"), Sheets("Sheet1").Range("AS8:AS34"), 0)


Worksheets("Sheet1").Range("AW45").Value = Application.Index(Sheets("Controls").Range("AR8:AR34"), vMatchVal)

Else
Worksheets("Controls").Range("AW45").Value = "Not Data"

MsgBox "First number not found"
End If


End Sub

问题仍然是索引/匹配函数返回#NA错误,并且永远不会出现消息框。

(帮助将索引/匹配功能从Excel公式转换为VBA代码https://www.mrexcel.com/forum/excel-questions/691904-translate-index-match-function-vba-code.html

(如果此编辑过程不是让我知道的正确程序,我会关闭帖子)

1 个答案:

答案 0 :(得分:0)

在修改后的代码中,您将If Not IsError测试之前分配给要测试错误的变量!

让我们修复此问题,然后尝试其他一些重构(出于可读性考虑)。如果仍然无法按预期运行,则需要提供一些示例数据,其他人可以用来复制错误。

Sub SetWaterfall()

' It's not necessary to disable ScreenUpdating for this procedure...
' Application.ScreenUpdating = False

Dim theSheet as Worksheet, controls as Worksheet
Dim vMatchVal As Variant
Dim lookupVal as String
Dim matchRange as Range, indexRange as Range

Set theSheet = Sheets("Sheet1")
Set controls = Sheets("Controls")
Set matchRange = theSheet.Range("AS8:AS34")
Set indexRange = controls.Range("AR8:AR34")

lookupValue = theSheet.Range("SelectLine").Value
vMatchVal = Application.Match(lookupVal, matchRange, 0)

If Not IsError(vMatchVal) Then
    theSheet.Range("AW45").Value = Application.Index(indexRange, vMatchVal)
Else
    controls.Range("AW45").Value = "Not Data"
    MsgBox "First number not found"
End If


End Sub