发布已在原始帖子
下方更新我正在使用两个表并希望将它们连接起来,但是,第一部分包含的值多于第二部分。我能够通过在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)
(如果此编辑过程不是让我知道的正确程序,我会关闭帖子)
答案 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