Excel 有没有一种方法可以通过一个简单的函数从其他不同大小的表中计算数组?

Excel 有没有一种方法可以通过一个简单的函数从其他不同大小的表中计算数组?,excel,vba,Excel,Vba,我有一个函数,它根据一张表中数据的变化情况创建自定义函数和数组。如果我尝试在主工作表上对其求值,它将返回#值,但如果我在工作表上对其求值,则来自它的数组将返回正确的输出。如果三维阵列大小发生变化,你知道如何解决这个问题吗 返回数组是因为我正在处理一个复杂的sumproduct函数。sumproduct函数是唯一嵌套在求值公式中的函数 我的VBA当前看起来像: Function Makeformula(Ref As String) Application.Volatile Makeformula

我有一个函数,它根据一张表中数据的变化情况创建自定义函数和数组。如果我尝试在主工作表上对其求值,它将返回#值,但如果我在工作表上对其求值,则来自它的数组将返回正确的输出。如果三维阵列大小发生变化,你知道如何解决这个问题吗

返回数组是因为我正在处理一个复杂的sumproduct函数。sumproduct函数是唯一嵌套在求值公式中的函数

我的VBA当前看起来像:

Function Makeformula(Ref As String)
Application.Volatile
Makeformula = Evaluate(Ref)
End Function
嗨,本

小结:(1a)和(2a)如果我将(1)和(2)的输出复制并粘贴到新单元格中,并将文本作为函数运行(通过添加等号),则下面的(1a)和(2a)将在第1页中提取正确的结果。(1) 适用于所提供的任一解决方案,(2)不适用于现有解决方案。(2) 是一个数组,因为sumproduct为sumproduct提取两个值

我尝试了你给出的两个答案,但都没有用。我将在下面附上一些代码来向您展示,并将长公式加粗,以使眼睛更容易看到

与之前类似,当my sumproduct最终生成如(1)所示的文本值,而不是(2)所示的文本值时,您的答案也会起作用。唯一的区别是(1)不是多维数组,而(2)是。还值得注意的是,当我将(1)和(2)作为文本值单独复制和粘贴到空白单元格中并放置前导等号时,它们会提取正确的值。但是,(2)无法使用您提供的Makeformula函数正确计算,即使它可以作为生成Sumproduct公式后插入到新单元格中的纯文本进行计算。(2) 导致一个#值!按原样出错

下面是如何使用MakeFormula函数将它们输入到单元格中。我在函数的第二个参数中使用了“月末输入前端”,因为如果像(1a)和(2a)中看到的那样独立运行,sumproduct最终会引用这个参数。将第一个解决方案的第二个参数更改为“月末后端”也不起作用

(1) =MakeFormula2((“SUMPRODUCT(”&VLOOKUP(VLOOKUP('Inc Stmnt'20 vs'19')!$C11,'Month End Input Backend'!$B$4:$D$78,3,FALSE),'Month End Input Backend'!$H$4:$K$27,3,FALSE)&“&CHAR(34)&U$7&CHAR(34)&”)(&LEFT(myvlookup($C11,'Month End Input Backend Input Backend'!$B$4:$E$78,2,间接(VLOOKUP,VLOOKUP)(VLOOKUP)(VLOOKUP)(VLOOKUP('Inc Stmnt'20 vs'19'!$C11,'Month End Input Backend'!$B$4:$D$78,3,FALSE),'Month End Input Backend'!$H$4:$K$27,4,FALSE)),LEN(myvlookup('C11,'Month End Input Backend')!$B$4:$E$78,2,间接(VLOOKUP('Inc Stmnt'20 vs'19'!$C11,'Month End Input Backend Input Backend'!$B$4:$D$78,3,FALSE),'Month End Input Backend Input'$4:$K$27,1)和(VLOOKUP)-)-1)(VLOOKUP('Inc Stmnt'20 vs'19'!$C11,'月末输入后端'!$B$4:$D$78,3,假),'月末输入后端'!$H$4:$K$27,2,假)和“)”),“月末输入前端”)

^这个有效

(2) =MakeFormula2()(“=SUMPRODUCT(”&VLOOKUP(VLOOKUP('Inc Stmnt'20 vs'19')!$C35,'月末输入后端'!$b4:$d78,3,FALSE),'月末输入后端'!$h4:$k27,3,FALSE)&“&CHAR(34)&u7&CHAR(34)&”)(&LEFT(myvlookup($C35,'月末输入后端')!$b4:$e78,2,间接(VLOOKUP)(VLOOKUP(ookup)(ookup)(ookup)(34)&u34)('Inc Stmnt'20 vs'19'!$C35,'Month End Input Backend'!$B$4:$D$78,3,FALSE),'Month End Input Backend'!$H$4:$K$27,4,FALSE)),LEN(myvlookup('C35,'Month End Input Backend')!$B$4:$E$78,2,间接(VLOOKUP('Inc Stmnt'20 vs'19'!$C35,'Month End Input Backend Input Backend'!$C$4:$D$78,3,FALSE),'Month End Input Backend Input Backend$H$4:$K$27,1)和(VLOOKUP)-)-kup)(VLOOKUP('Inc Stmnt'20 vs'19'!$C35,'月末输入后端'!$B$4:$D$78,3,假),'月末输入后端'!$H$4:$K$27,2,假)和“)”),“月末输入前端”)

^^这个没有

下面是公式的sumproduct部分的结果,如果将值作为文本值复制并粘贴到新单元格中,则在这两种情况下都可以正确提取值


(1a) SUMPRODUCT(('Month End Input Frontend'!$C$12:$Q$12="Jan 2020")*(('Month End Input Frontend'!B13:B89="                                Sales of Product Income"))*('Month End Input Frontend'!$C$13:$Q$89))

(2a) SUMPRODUCT(('Month End Input Frontend'!$C$12:$Q$12="Jan 2020")*(('Month End Input Frontend'!B13:B89="                        Billing Fee Expense")+('Month End Input Frontend'!B13:B89="                                Medical Billing and Collection"))*('Month End Input Frontend'!$C$13:$Q$89))

Evaluate
(或
应用程序。Evaluate
)在活动工作表的上下文中运行。您希望使用
工作表。Evaluate
,因此需要向函数传递对相关
工作表的引用。您的选项包括:

  • 将工作表名称作为
    字符串传递
  • 传递一个
    Range
    引用并使用
    Range.Parent
    。您的公式看起来像
    =MakeFormula(“yourlongformula”,“Sheet 2”!A1)

您需要使用
工作表。Evaluate
,因此您需要以某种方式向函数传递对工作表的引用。
Evaluate
相当于
应用程序。Evaluate
,它在activesheet的上下文中运行。@BigBen我是VBA的新手。向函数传递对工作表的引用是什么意思K表?如果该表被称为“表2”,主表为“表1”,那会是什么样子?这将有助于您添加
Ref
字符串的示例和一些示例data@BigBen我更新了问题,向您展示了我使用您的答案时发生的情况。如果有任何不清楚的地方,请告诉我。另一种选择是使用
ThisCell
Caller
来识别包含UDF的范围,然后找到它的父对象Worksheet@chrisneilsen-我不这么认为,因为它听起来与UDF的来源不同。嗯,你可能是对的。但是“3d”很有趣
Public Function MakeFormula(ByVal Ref As String, ByVal SheetName As String) As Variant
    Application.Volatile
    Makeformula = ThisWorkbook.Worksheets(SheetName).Evaluate(Ref)
End Function
Public Function MakeFormula(ByVal Ref As String, ByVal Cell As Range) As Variant
    Application.Volatile
    Makeformula = Cell.Parent.Evaluate(Ref)
End Function