如何将Excel中的多单元格数组公式的结果放入VBA中的数组中?

ztyzrc3y  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(260)

我有一个相对复杂的(我认为)公式,结果是一个多单元阵列公式。用户单击Excel中界面工作表上的一个按钮,我希望这会触发一些VBA代码,将多单元格数组公式的数组结果放入VBA子程序中的数组中。
我需要使用的公式如下:=FILTER(OFFSET(INDIRECT(Results!O22);0;-3);MOD(SEQUENCE(1;COLUMNS(INDIRECT(Results!O22)));5)=0)
结果的价值!O22为:="SumSheet_OffTrt"&"!"&ADDRESS(ROW(rng_Data_start_ALL);MATCH(O23;INDIRECT("SumSheet_OffTrt"&"!"&ROW(rng_AddRows_ALL)&":"&ROW(rng_AddRows_ALL));0))&":"&ADDRESS(ROW(rng_Data_start_ALL) + COUNTA(INDIRECT("SumSheet_OffTrt"&"!"&CHAR(64 + COLUMN(OFFSET(rng_Data_start_ALL;1;0)))&":"&CHAR(64 + COLUMN(OFFSET(rng_Data_start_ALL;1;0)))))-1;MATCH(P$6;INDIRECT("SumSheet_OffTrt"&"!"&ROW(rng_AddRows_ALL)&":"&ROW(rng_AddRows_ALL));0)-1)
结果这个疯狂的公式在结果!O22是:SumSheet_OffTrt!$BY$14:$CR$68,存储一些数据的范围。
当将上面提供的FILTER公式手动输入Excel时,该公式将在工作表中生成一个功能性多单元格数组。
但是,当我尝试使用VBA将公式输入Excel时,它不起作用。
注意,我使用的是瑞典语版本的Excel,其中“;”是分隔符。我还尝试了在VBA代码中使用“,”进行下面讨论的所有内容。
我尝试了以下方法:
1.使用Application.Evaluate方法将数组的值设置为等于公式结果:

Dim strFrmla As String
Dim aryRsltData As Variant
strFrmla = =FILTER(OFFSET(INDIRECT(Results!O22);0;-3);MOD(SEQUENCE(1;COLUMNS(INDIRECT(Results!O22)));5)=0)
aryRsltData  = Application.Evaluate(strFrmla)

在这种情况下,aryRsltData的值为Error 2015或VALUE!.
1.将Range的value、formula或formulaarray设置为等于公式的字符串变量,目的是将数组设置为等于结果范围值:

Dim strFrmla As String
strFrmla = =FILTER(OFFSET(INDIRECT(Results!O22);0;-3);MOD(SEQUENCE(1;COLUMNS(INDIRECT(Results!O22)));5)=0)

Sheet2.Range("A1").FormulaArray = strFrmla

上面的最后一行代码触发以下错误:“应用程序定义或对象定义的错误”。如果我使用.Value.Formula,也会出现同样的错误。
1.我尝试阻止Excel响应值输入,然后使用VBA放置公式,然后返回应用程序默认值:

Dim strFrmla As String

Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayStatusBar = False

strFrmla = =FILTER(OFFSET(INDIRECT(Results!O22);0;-3);MOD(SEQUENCE(1;COLUMNS(INDIRECT(Results!O22)));5)=0)

Sheet2.Range("A1").FormulaArray = strFrmla

Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.Calculate

生成与尝试#2相同的错误。
1.我尝试将公式作为文本粘贴到范围中,然后清除格式,然后进行计算。

Dim strTargFrmla As String
strFrmla = =FILTER(OFFSET(INDIRECT(Results!O22);0;-3);MOD(SEQUENCE(1;COLUMNS(INDIRECT(Results!O22)));5)=0)

Sheet2.Range("A1").FormulaArray = "'" & strFrmla
Sheet2.Range("A1").ClearFormats
Application.Calculate

这会将公式导入单元格,即使是未格式化的,但用户仍然需要单击单元格并按Enter键来填充多单元格数组。
有一个类似的讨论,我已经尝试了他们似乎接近我正在做的建议:https://stackoverflow.com/questions/50030749/insert-array-formula-in-excel-vba我已经审查了其他几个线程,似乎找不到解决方案。
最终,我尝试做的只是将生成的多单元格数组放入VBA中的数组,以便我可以继续向工作簿添加特定功能。
非常感谢任何人可以提供的任何支持。我相信还有其他的方法可以达到我的目标,所以如果这里没有什么进展,我会从头开始再试一次。
非常感谢!

zdwk9cvp

zdwk9cvp1#

在那些对原始帖子发表评论的人的支持下,找到了解决方案。通过将strFrmla设置为等于=FILTER(OFFSET(INDIRECT('Results'!R22C15),0,-3),MOD(SEQUENCE(1,COLUMNS(INDIRECT('Results'!R22C15))),5)=0)来使用R1C1引用样式,然后运行以下命令解决了这个问题:Sheet2.Range("A1").Formula2R1C1 = strFrmla
出于某种原因,使用R1C1参考样式工作。这是通过使用记录宏功能,并按照注解中的建议手动粘贴功能性多单元格数组公式来确定的。
谢谢大家的支持,如果你明白为什么会这样,请随时发表评论。

相关问题