2017-08-21 61 views
2

我从一个Excel工作表中提取值到另一个。我用下面的公式:Excel自定义公式与IF语句和INDEX,MATCH返回一个#VALUE错误

= IF(ISBLANK(IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1));Error2;IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1)) 

因为我需要做的计算与提取的数据,我想创建一个自定义功能,将不再需要键入其保持不变每次参数简化了提取过程。所以我建立了以下功能:

Function DataCap(Dates As Variant, Row As Variant) As Variant 

    Dim Range1 As Range 'Define the whole lookup table 
     Set Range1 = Range("Data!A1:P151") 

    Dim Range2 As Range 'Define the date lookup table 
     Set Range2 = Range("Data!A3:P3") 

    Dim Error1 As Range 'Define the error 1; if no value 
     Set Error1 = Range("X16") 

    Dim Error2 As Range 'Define the error 2; if blank 
     Set Error2 = Range("Y16") 

    DataCap.Formula "= IF(ISBLANK(IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1));Error2;IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1))" 


End Function 

当我运行它时,我得到#VALUE错误。如果我直接在单元格中粘贴方程(使用相同的参数),它会按预期工作。所以,我认为问题在于VBA无法进行计算。任何建议如何解决这个问题?

感谢您的帮助提前

+0

您是否将'Range','Range2','Error1'和'Error2'定义为命名范围? –

+0

您不能在公式中使用VBA变量名称,并且您需要在公式字符串中使用逗号而不是分号。 – Rory

+0

@RobinMackenzie,范围,范围2等仅在代码中定义,而不是在Excel表格中定义。 – Mark

回答

1

没有能够测试它在你的数据我不能肯定这是否会工作,但它可能至少能够更你指出正确的方向。

Public Function DCap(xDates As Variant, xRow As Variant) 
Dim Range1 As Range, Range2 As Range, Error1 As Range, Error2 As Range 

Set Range1 = ActiveWorkbook.Sheets("Data").Range("A1:P151") 
Set Range2 = ActiveWorkbook.Sheets("Data").Range("A3:P3") 

Set Error1 = ActiveWorkbook.ActiveSheet.Range("X16") 
Set Error2 = ActiveWorkbook.ActiveSheet.Range("Y16") 

On Error Resume Next 
If IsError(WorksheetFunction.Index(Range1, xRow, WorksheetFunction.Match(xDates, Range2, 0))) Then 
    DCap = Error1 
ElseIf Len(WorksheetFunction.Index(Range1, xRow, WorksheetFunction.Match(xDates, Range2, 0))) = 0 Then 
    DCap = Error2 
Else 
    DCap = WorksheetFunction.Index(Range1, xRow, WorksheetFunction.Match(xDates, Range2, 0)) 
End If 
On Error GoTo 0 

End Function 
+0

这是完美的。非常感谢你。 – Mark

+0

你能否也请解释一下,在我原来的脚本中是什么导致了问题,所以我知道下一次? – Mark

+1

VBA函数将始终返回一个值,而不是一个公式(因为实质上函数是公式),所以试图围绕该模型构建主要是我做的不同。我只是将公式分解到它的基本部分,并在VBA中重新编写它,使用WorksheetFunction(在适用的情况下保持它的操作与它原来的写法类似)。第一个If'检查'Index'是否是错误,如果是,则返回Error1;第二个'If'检查'Index'是否为空(即长度= 0),如果是,则返回Error2;如果这两个都不正确,则返回索引。 –