Vba 尝试使用FormulaArray时出现错误1004。替换技巧不起作用
背景:我得到了一个很酷的数组公式,它在Excel中工作得非常完美。现在我试着用VBA做同样的公式。因此,我在一个单元格中键入数组公式,并用宏进行记录。这个公式非常有效。宏记录器告诉我:Vba 尝试使用FormulaArray时出现错误1004。替换技巧不起作用,vba,excel,Vba,Excel,背景:我得到了一个很酷的数组公式,它在Excel中工作得非常完美。现在我试着用VBA做同样的公式。因此,我在一个单元格中键入数组公式,并用宏进行记录。这个公式非常有效。宏记录器告诉我: Selection.FormulaArray = _ "=INDEX('[HOGARES ALBACETE.xlsx]21076'!C1,MATCH(MAX(IF(RIGHT('[HOGARES ALBACETE.xlsx]21076'!C1,LEN(R[-1]C)+2)=""["" &R[-1]
Selection.FormulaArray = _
"=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)"
如果我尝试运行上面的代码,我会得到错误1004。潜艇只有那条线。没有别的了
经过一些研究,我了解到:
因此,我将公式分为两部分:
Dim theFormulaPart1 As String
Dim theFormulaPart2 As String
Dim MiReemplazo As String
MiReemplazo = "cacota"
theFormulaPart1 = "=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)"
theFormulaPart2 = "IF(RIGHT('[HOGARES ALBACETE.xlsx]21076'!C1,LEN(R[-1]C)+2)=""[""&R[-1]C&""]"",'[HOGARES ALBACETE.xlsx]21076'!C2)"
With ActiveSheet.Range(“F2”)
.FormulaArray = theFormulaPart1
.Replace MiReemplazo, theFormulaPart2
End With
我没有得到错误,但是部分。替换MiReemplazo,公式2什么都不做,我的意思是,替换没有发生,但是代码执行
此外,还尝试了:
ActiveSheet.Range("F2").FormulaArray = theFormulaPart1
DoEvents
Cells.Replace What:=MiReemplazo, Replacement:=theFormulaPart2, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
但什么都没有。所以我有点没主意了
此外,还检查了两个公式字符串173107的长度。我需要更粗的线吗
我很确定这不是问题:
如果我手动键入Excel中的公式,则该公式有效。因此,这不是公式本身的问题
我只是在一个单元格中工作,并试图在其他工作簿的单元格中获取一个值,所以这不是内存或资源的问题。
提前感谢。我敢打赌,您的Excel没有设置为使用R1C1引用,因此,当您试图将R1C1引用字符串放入A1样式的公式中时,替换将不起作用。尝试使用:
Application.ReferenceStyle = xlR1C1
With ActiveSheet.Range("F2")
.FormulaArray = theFormulaPart1
.Replace MiReemplazo, theFormulaPart2
End With
Application.ReferenceStyle = xlA1
由于强制重新计算移动的对象,这需要花费一点时间,但似乎效果不错 问题:外部工作簿引用正在将数组公式推到字符限制之外 解决方案:a将外部工作表移到本地工作簿b完成数组公式插入c将本地工作表移回外部工作簿,让Excel计算出来
Sub arrayFormulaTooBig()
Dim ha2ndx As Long, wbha As Workbook, wbf As Workbook
Dim sel As Range
Set sel = Selection
Set wbha = Workbooks("HOGARES ALBACETE.xlsx")
Set wbf = sel.parent.parent
'Application.Calculation = xlCalculationmanual
'Application.ScreenUpdating = False
'move the external worksheet to local and reduce worksheet name to minimum characters
With wbha
If .Worksheets.Count = 1 Then
.Worksheets.Add after:=.Worksheets(.Worksheets.Count)
.Worksheets(.Worksheets.Count).Name = "to be removed"
End If
With .Worksheets("21076")
ha2ndx = .Index
.Move after:=wbf.Worksheets(wbf.Worksheets.Count)
End With
End With
'minimize worksheet name
wbf.Worksheets("21076").Name = ChrW(215)
'from 282 characters
'Selection.FormulaArray = _
"=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)"
'to 137 characters
sel.FormulaArray = _
"=INDEX(×!C1,MATCH(MAX(IF(RIGHT(×!C1,LEN(R[-1]C)+2)=""["" &R[-1]C&""]"",×!C2)),IF(RIGHT(×!C1,LEN(R[-1]C)+2)=""[""&R[-1]C&""]"",×!C2),0),1)"
With wbf
With .Worksheets(ChrW(215))
.Move before:=wbha.Worksheets(ha2ndx)
End With
End With
'restore worksheet name
wbha.Worksheets(ChrW(215)).Name = "21076"
On Error Resume Next
Application.DisplayAlerts = False
wbha.Worksheets("to be removed").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
cacota是命名范围吗?21076是HOGARES ALBACETE.xlsx中唯一的工作表吗?@ScottCraner不,不是。只是一个可以替换的词。任何工作簿、范围或值中的任何内容均不可用cacota@Jeeped. 不,还有更多的工作表。为什么?以下方法要求外部工作簿中至少保留一份工作表。谢谢!我明天查一下,然后告诉你。但是我在另一台电脑上做了一个测试,没有我需要的工作手册,我检查了公式,看起来它是有效的。我得到一个裁判!错误,可能是因为这台电脑没有访问权限。但是检查了公式的文本,它是完整的,所以我很确定这会起作用!:让我明天测试一下,你是对的!刚刚添加了你的代码,它工作得很好!谢谢我个人会在上面加一点,以免惹恼用户。在顶部,将currRefStyle设置为整数:currRefStyle=Application.ReferenceStyle,然后将最后一行更改为Application.ReferenceStyle=currRefStyle。这样,如果用户使用的是R1C1,则不会更改他们的首选项。非常感谢您的努力@Jeeped。你总是试图帮助和感谢。我会尝试调整它以获得我需要的所有工作表。我想复制工作表,然后使用更简单的公式会更好。谢谢您不能复制工作表。您需要移动它们,以便Excel的开销处理范围引用更改。您需要移动它们,以便Excel的开销处理范围引用更改。符合事实的那我就照你说的做。再次感谢!