Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 带有IF语句和索引的Excel自定义公式,MATCH返回#值错误_Vba_Excel_Function_Custom Function - Fatal编程技术网

Vba 带有IF语句和索引的Excel自定义公式,MATCH返回#值错误

Vba 带有IF语句和索引的Excel自定义公式,MATCH返回#值错误,vba,excel,function,custom-function,Vba,Excel,Function,Custom Function,我正在从一个Excel工作表提取值到另一个Excel工作表。我使用以下公式: = IF(ISBLANK(IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1));Error2;IFNA(INDEX(Range1;Row;MATCH(Dates;Range2;0));Error1)) 因为我需要对提取的数据进行计算,所以我想创建一个自定义函数,通过消除每次输入相同参数的需要来简化提取过程。因此,我构建了以下函数: Function DataCap

我正在从一个Excel工作表提取值到另一个Excel工作表。我使用以下公式:

= 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
当我运行它时,我得到了#值错误。如果我将等式(具有相同参数)直接粘贴到单元格中,它将按预期工作。因此,我认为问题在于VBA无法进行计算。有什么建议可以解决这个问题吗


提前感谢您的帮助

如果无法在您的数据上测试它,我无法确定这是否可行,但它至少可以为您指出更多正确的方向

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

您是否已将
Range
Range2
Error1
Error2
定义为命名范围?在公式中不能使用VBA变量名,并且在公式字符串中需要使用逗号而不是分号。@RobinMackenzie,不,范围、Range2等仅在代码中定义,不在Excel工作表中。@Rory谢谢您的输入,我的本地Excel版本需要分号而不是逗号。如果我不能在公式中使用变量名,是否有其他选择?这无关紧要,
formula
属性要求您在代码中使用US设置。我也不明白你想做什么-函数没有
公式
属性,所以你希望实现什么?这很完美。非常感谢。请您解释一下是什么原因导致我的原始脚本出现问题,以便我下次了解。VBA函数将始终返回一个值,而不是一个公式(因为函数本质上就是公式),因此尝试围绕该模型进行构建主要是我的不同做法。我只是将您的公式拆分为基本部分,然后在VBA中重新编写,在适用的情况下使用WorksheetFunction使其操作与最初编写的操作类似。第一个
If
检查
索引是否为错误,如果是,则返回Error1;第二个
If
检查
索引是否为空(即长度=0),如果为空,则返回Error2;如果两者都不正确,它将返回
索引
。此外,在VBA中设置的范围与在公式中设置的范围略有不同,特别是使用
图纸(“图纸名称”).Range(“A1:B1”)
语法,而不是
范围(“图纸名称!A1:B1”)
。如果您还没有尝试过,那么使用宏录制器(Developer选项卡,Record Macro)来做一些事情对于理解引用内容的语法会有很大帮助。