代码之家  ›  专栏  ›  技术社区  ›  fedone

由于太长,将Excel阵列公式拆分为VBA

  •  1
  • fedone  · 技术社区  · 7 年前

    公式如下:

    =IF(B2=VLOOKUP(B2,Admin!$G$5:$G$501,1,FALSE),IFERROR(INDEX(Admin!$G$5:$K$501,MATCH(1,(Admin!$I$5:$I$501=A2)*(Admin!$G$5:$G$501=B2),0),5),INDEX(Admin!$G$5:$K$501,MATCH(1,(Admin!$I$5:$I$501="ALL")*(Admin!$G$5:$G$501=B2),0),5)),"")
    

    我尝试使用以下代码通过VBA应用它:

    Sub LongArrayformula()
      Dim ArrayFormulaPart1, ArrayFormulaPart2 As String
      ArrayFormulaPart1 = "=IF(B2=VLOOKUP(B2,Admin!$G$5:$G$501,1,FALSE),IFERROR(INDEX(Admin!$G$5:$K$501,XXXX"
      ArrayFormulaPart2 = "MATCH(1,(Admin!$I$5:$I$501=A2)*(Admin!$G$5:$G$501=B2),0),5),INDEX(Admin!$G$5:$K$501,MATCH(1,(Admin!$I$5:$I$501=""ALL"")*(Admin!$G$5:$G$501=B2),0),5)),"""")"
         With ActiveSheet.Range("bv2")
             .FormulaArray = ArrayFormulaPart1
             .Replace "XXXX", ArrayFormulaPart2, lookat:=xlPart
    
            End With
    End Sub
    

    我知道在网上有很多网站都涉及这个话题,但我不能让这个公式自动应用。

    我不断收到错误“无法设置Range类的FormulaArray属性”,并且突出显示“.FormulaArray=ArrayFormulaPart1”。

    我也尝试过其他代码,但运气不好。由于语法对我来说几乎是未知的,所以我不确定要修改什么才能使我播下的许多代码适应我的需要。

    提前感谢您的帮助,并最终快速解释了如何使用VBA正确设置数组公式。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Scott Craner    7 年前

    这是因为第一个公式必须是一个可行的公式才能首先输入:

    Sub LongArrayformula()
        Dim ArrayFormulaPart1, ArrayFormulaPart2 As String
        ArrayFormulaPart1 = "=IF(B2=VLOOKUP(B2,Admin!$G$5:$G$501,1,FALSE),IFERROR(INDEX(Admin!$G$5:$K$501,9999,5),INDEX(Admin!$G$5:$K$501,MATCH(1,(Admin!$I$5:$I$501=""ALL"")*(Admin!$G$5:$G$501=B2),0),5)),"""")"
        ArrayFormulaPart2 = "MATCH(1,(Admin!$I$5:$I$501=A2)*(Admin!$G$5:$G$501=B2),0)"
        With ActiveSheet.Range("bv2")
            .FormulaArray = ArrayFormulaPart1
            .Replace "9999", ArrayFormulaPart2, lookat:=xlPart
        End With
    End Sub