【问题标题】:ERROR 1004 when trying to use FormulaArray. Replace trick does not work尝试使用 FormulaArray 时出现错误 1004。替换技巧不起作用
【发布时间】:2018-07-05 16:39:01
【问题描述】:

背景:我有一个很酷的数组公式,它在 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。子代码只有那一行。没有别的了。

经过一番研究,我明白了:

VBA Run time error 1004: Unable to set the formulaarray property of the range class

Entering Long Array Formulas In VBA

所以我把公式分成两部分:

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

我没有收到任何错误,但 .Replace MiReemplazo, theFormulaPart2 部分什么都不做(我的意思是,替换不会发生,但代码会执行)

另外,尝试过:

ActiveSheet.Range("F2").FormulaArray = theFormulaPart1
        DoEvents
        Cells.Replace What:=MiReemplazo, Replacement:=theFormulaPart2, LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

但什么都没有。所以我有点没有想法。

此外,检查了两个公式字符串的长度 (173,107)。我需要排序器字符串吗?

我很确定这不是问题:

  1. 如果我手动键入 Excel 中的公式,它可以工作。所以不是公式本身的问题
  2. 我只是在 1 个单元格中工作,并试图在其他工作簿的单元格中获取 1 个值,所以不是内存或资源问题。

提前致谢。

【问题讨论】:

  • cacota 是一个命名范围吗?
  • 21076 是 HOGARES ALBACETE.xlsx 中唯一的工作表吗?
  • @ScottCraner 不,不是。只是一个词来代替。任何工作簿、范围或值中都没有 cacota
  • @Jeeped。不,还有更多工作表。为什么? :O
  • 我下面的方法要求在外部工作簿中至少保留 1 个工作表。

标签: vba excel


【解决方案1】:

我敢打赌,您的 Excel 未设置为使用 R1C1 引用,因此当您尝试将 R1C1 引用的字符串放入 A1 样式公式时,替换将不起作用。尝试使用:

Application.ReferenceStyle = xlR1C1
With ActiveSheet.Range("F2")
        .FormulaArray = theFormulaPart1
        .Replace MiReemplazo, theFormulaPart2
    End With
Application.ReferenceStyle = xlA1

【讨论】:

  • 谢谢!明天我会检查并告诉你。但是我在另一台 PC 上进行了测试(无法访问我需要的工作簿)并检查了公式,看起来它可以工作。我收到 #¡REF! 错误,可能是因为这台 PC 无法访问。但是检查了公式的文本并且它是完整的,所以我很确定这会起作用! :) 让我明天测试一下。
  • 你是对的!刚刚添加了您的代码,它运行良好!谢谢!
  • 我个人会在上面添加一点,以免惹恼用户。在顶部Dim currRefStyle as integer: currRefStyle=Application.ReferenceStyle 然后将最后一行更改为Application.ReferenceStyle=currRefStyle。这样,如果用户使用 R1C1,它不会改变他们的偏好。
【解决方案2】:

由于强制重新计算移动的对象,这有点耗时,但它似乎运行良好。

问题:外部工作簿引用正在推动数组公式超出字符限制。

解决方案: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

【讨论】:

  • 非常感谢@Jeeped 的努力。你总是试图帮助和感谢。我会尝试调整它以获得我需要的所有工作表。我猜复制工作表然后使用更简单的公式会更好。谢谢!
  • 您不能复制工作表。您需要移动它们才能让 Excel 的开销处理范围引用更改。
  • 您需要移动它们才能让 Excel 的开销处理范围引用更改。真的!那我就照你说的做。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
相关资源
最近更新 更多