Vba 尝试使用FormulaArray时出现错误1004。替换技巧不起作用

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]

背景:我得到了一个很酷的数组公式,它在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]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的开销处理范围引用更改。符合事实的那我就照你说的做。再次感谢!