背景:我有一个很酷的数组公式,它在 Excel 中运行得非常完美。现在我正在尝试使用 VBA 执行相同的公式。所以我在单元格中输入数组公式并用宏记录。该公式运行完美。宏记录器给我这个:
\n\nSelection.FormulaArray = _\n "=INDEX(\'[HOGARES ALBACETE.xlsx]21076\'!C1,MATCH(MAX(IF(RIGHT(\'[HOGARES ALBACETE.xlsx]21076\'!C1,LEN(R[-1]C)+2)=""["" &R[-1]C&""]"",\'[HOGARES ALBACETE.xlsx]21076\'!C2)),IF(RIGHT(\'[HOGARES ALBACETE.xlsx]21076\'!C1,LEN(R[-1]C)+2)=""[""&R[-1]C&""]"",\'[HOGARES ALBACETE.xlsx]21076\'!C2),0),1)"\nRun Code Online (Sandbox Code Playgroud)\n\n如果我尝试运行上面的代码,我会收到错误 1004。子程序只有这一行。没有其他的。
\n\n经过一番研究后,我进入了这个:
\n\nVBA运行时错误1004:无法设置范围类的formulaarray属性
\n\n\n\n所以我把公式分成两部分:
\n\nDim theFormulaPart1 As String\nDim theFormulaPart2 As String\nDim MiReemplazo As String\nMiReemplazo = "cacota"\n\ntheFormulaPart1 = "=INDEX(\'[HOGARES ALBACETE.xlsx]21076\'!C1,MATCH(MAX(IF(RIGHT(\'[HOGARES ALBACETE.xlsx]21076\'!C1,LEN(R[-1]C)+2)=""["" &R[-1]C&""]"",\'[HOGARES ALBACETE.xlsx]21076\'!C2))," & MiReemplazo & ",0),1)"\ntheFormulaPart2 = "IF(RIGHT(\'[HOGARES ALBACETE.xlsx]21076\'!C1,LEN(R[-1]C)+2)=""[""&R[-1]C&""]"",\'[HOGARES ALBACETE.xlsx]21076\'!C2)"\n\nWith ActiveSheet.Range(\xe2\x80\x9cF2\xe2\x80\x9d)\n .FormulaArray = theFormulaPart1\n .Replace MiReemplazo, theFormulaPart2\n End With\nRun Code Online (Sandbox Code Playgroud)\n\n我没有收到任何错误,但该部分.Replace MiReemplazo, theFormulaPart2什么也没做(我的意思是,替换没有发生,但代码执行)
另外,尝试过:
\n\nActiveSheet.Range("F2").FormulaArray = theFormulaPart1\n DoEvents\n Cells.Replace What:=MiReemplazo, Replacement:=theFormulaPart2, LookAt:=xlPart, _\n SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _\n ReplaceFormat:=False\nRun Code Online (Sandbox Code Playgroud)\n\n但什么也没有。所以我有点没有主意了。
\n\n此外,还检查了两个公式字符串的长度 (173,107)。我需要排序器字符串吗?
\n\n我非常确定这不是问题:
\n\n提前致谢。
\n我敢打赌您的 Excel 未设置为使用 R1C1 引用,因此当您尝试将 R1C1 引用的字符串放入 A1 样式公式时,替换将不起作用。尝试使用:
Application.ReferenceStyle = xlR1C1
With ActiveSheet.Range("F2")
.FormulaArray = theFormulaPart1
.Replace MiReemplazo, theFormulaPart2
End With
Application.ReferenceStyle = xlA1
Run Code Online (Sandbox Code Playgroud)