Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何使用VBA将长度超过255个字符的数组公式作为字符串自动输入excel单元格?_Arrays_Vba_Excel - Fatal编程技术网

Arrays 如何使用VBA将长度超过255个字符的数组公式作为字符串自动输入excel单元格?

Arrays 如何使用VBA将长度超过255个字符的数组公式作为字符串自动输入excel单元格?,arrays,vba,excel,Arrays,Vba,Excel,我的代码适用于非数组公式,但当我尝试将其作为数组公式时,它最终会粘贴整行代码,而不是它应该给出的结果。这就是它的样子: 我的VBA代码如下所示(无需阅读整个代码): 仍然无法处理如上所示的运行时错误 工作代码(感谢Chris Mack): 带有工作表(“DTR”)。单元格(总行数+公式+1,20) .FormulaArray=“=如果(索引('Payroll Tables and Settings'!D$2:D$1048576,匹配(DTR!B2,'Payroll Tables and Set

我的代码适用于非数组公式,但当我尝试将其作为数组公式时,它最终会粘贴整行代码,而不是它应该给出的结果。这就是它的样子:

我的VBA代码如下所示(无需阅读整个代码):

仍然无法处理如上所示的运行时错误

工作代码(感谢Chris Mack):

带有工作表(“DTR”)。单元格(总行数+公式+1,20)
.FormulaArray=“=如果(索引('Payroll Tables and Settings'!D$2:D$1048576,匹配(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))=”额外“,P2*7777/82424)”
.替换“7777”,“索引('工资表和设置'!B$2:B$1048576,匹配(DTR!B2,'工资表和设置'!A$2:A$1048576,0))”
.替换“2424”,“如果(索引(‘工资表和设置’!F$2:F$1048576,匹配(DTR!B2,‘工资表和设置’!A$2:A$1048576,0))>0,如果(AI2=”“Sunday“”,0,如果(或(AF2>=24,AF2=‘工资表和设置’!Z$2:Z$538,如果(DTR!C2=‘工资表和设置’!Z$2:Z$538,如果(DTR!C2尝试:

更新:

关于克服设置FormulaArray属性时的限制,解决此问题的一种方法是将公式拆分为多个组件,然后使用别名来表示这些组件。然后可以用实际的公式字符串替换别名

两条规则:

  • 在每个阶段,公式都必须遵守Excel公式的语法规则
  • 每个替换字符串的长度必须小于或等于255个字符
  • (更新:Per:“如果使用A1表示法,则R1C1等效值必须少于255个字符。”)

    单个组件的最佳候选组件是公式的任何部分,这些部分通过运算符(例如,加法、乘法、大于)生成一个值,用于与另一个值相对应。因此,如果您可以获得您输入的初始公式,如下图所示,您将走上正确的道路(您甚至可以使用“评估公式”对此有一些想法,因为它将评估公式中的组件,并向您展示每个步骤)

    同样,请记住,这些部分的长度必须小于或等于255个字符。如果不小于或等于255个字符,则通常可以将它们分解为更多的部分

    例如:

    Sub OvercomeFormulaArrayLimit()
    
        Selection.FormulaArray = "=SUM(IF(A2:A9=12,IF(B2:B9=23,C2:C9)))+XYZ"
    
        For r = 1 To 10
    
            Selection.Replace "XYZ", "SUM(IF(Sheet1!A2:A9=12,IF(Sheet1!B2:B9=23,Sheet1!C2:C9)))+XYZ"
    
        Next
    
        Selection.Replace "XYZ", "SUM(IF(Sheet1!A2:A9=12,IF(Sheet1!B2:B9=23,Sheet1!C2:C9)))"
    
    End Sub
    
    因此,在您的代码中,一个示例是:

    With Worksheets("DTR").Cells(Total_Rows_Formulas + 1, 20)
    
        .FormulaArray = "=IF(replExtra=""Extra"" ..."
        .Replace "replExtra", "INDEX('Payroll Tables and Settings'!D$2:D$1048576,MATCH(DTR!B" & Total_Rows_Formulas + 1 & ",'Payroll Tables and Settings'!A$2:A$1048576,0))"
        'etc.
    
    End With
    
    基于上述代码的有效解决方案:

    With Worksheets("DTR").Cells(Total_Rows_Formulas + 1, 20)
            .FormulaArray = "=IF(INDEX('Payroll Tables and Settings'!D$2:D$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))=""Extra"",P2*7777/8,2424)"
            .Replace "7777", "INDEX('Payroll Tables and Settings'!B$2:B$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))"
            .Replace "2424", "IF(INDEX('Payroll Tables and Settings'!F$2:F$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))>0, IF(AI2=""Sunday"",0, IF(OR(AF2>=24,AF2<=8)=TRUE,1111+2222+3333,b.)),4444+5555+6666)"
            .Replace "1111", "(INDEX('Payroll Tables and Settings'!F$2:F$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))/2)"
            .Replace "+2222", "/(INDEX('Payroll Tables and Settings'!AC$2:AC$538,MATCH(1,IF(DTR!C2>='Payroll Tables and Settings'!Z$2:Z$538,IF(DTR!C2<='Payroll Tables and Settings'!AA$2:AA$538,1)),0))+8888)"
            .Replace "+8888)", "-INDEX('Payroll Tables and Settings'!AB$2:AB$538,MATCH(1,IF(DTR!C2>='Payroll Tables and Settings'!Z$2:Z$538,IF(DTR!C2<='Payroll Tables and Settings'!AA$2:AA$538,1)),0)))"
            .Replace "+3333", "IF(SUM(DTR!P2:S2)<8,IF(IFERROR(INDEX('Holidays Table'!B$2:B$104857,MATCH(C2,'Holidays Table'!A$2:A$104857,0)),0)=0,(8-SUM(DTR!P2:S2))*(INDEX('Payroll Tables and Settings'!B$2:B$104857,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$104857,0))/8),0),0)"
            .Replace "4444", "(INDEX('Payroll Tables and Settings'!F$2:F$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))/2)"
            .Replace "+5555", "/(INDEX('Payroll Tables and Settings'!AG$2:AG$538,MATCH(1,IF(DTR!C2>='Payroll Tables and Settings'!AD$2:AD$538,IF(DTR!C2<='Payroll Tables and Settings'!AE$2:AE$538,1)),0))+1212)"
            .Replace "+1212)", "-INDEX('Payroll Tables and Settings'!AF$2:AF$538,MATCH(1,IF(DTR!C2>='Payroll Tables and Settings'!AD$2:AD$538,IF(DTR!C2<='Payroll Tables and Settings'!AE$2:AE$538,1)),0)))"
            .Replace "+6666", "IF(SUM(DTR!P2:S2)<8,IF(IFERROR(INDEX('Holidays Table'!B$2:B$104857,MATCH(C2,'Holidays Table'!A$2:A$104857,0)),0)=0,(8-SUM(DTR!P2:S2))*(INDEX('Payroll Tables and Settings'!B$2:B$104857,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$104857,0))/8),0),0)"
    End With
    
    带有工作表(“DTR”)。单元格(总行数+公式+1,20)
    .FormulaArray=“=如果(索引('Payroll Tables and Settings'!D$2:D$1048576,匹配(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))=”额外“,P2*7777/82424)”
    .替换“7777”,“索引('工资表和设置'!B$2:B$1048576,匹配(DTR!B2,'工资表和设置'!A$2:A$1048576,0))”
    
    。替换“2424”、“如果(索引(‘工资表和设置’!F$2:F$1048576,匹配(DTR!B2,‘工资表和设置’!A$2:A$1048576,0))>0、如果(AI2=”“Sunday’)、0、如果(或(AF2>=24,AF2=‘工资表和设置’!Z$2:Z$538、如果(DTR!C2=‘工资表和设置’!Z$2:Z$538,如果(DTR!c2尝试了错误。可能它必须是一个范围而不是单元格?我将尝试使用范围。使用
    范围(“T2”).FormulaArray
    也给出了相同的错误。该公式有效,因为当我按ctrl+shift+enter时,返回的值是正确的。作为高代表性用户,您应该知道仅代码的答案被标记为低质量帖子。请提供一些解释,为什么这可以解决OP的问题。@MarcSantos我已更新我的答案以解决此错误r、 谢谢,过一会儿我会试试这个检查你公式的长度。我相信FormulaArray限制为255个字符。基于此:,是的,它有一个限制..我有2130个字符:(但我不能把它缩短。还有其他方法吗?为什么要问这个问题?有一个解决办法。我在发布这个问题后实际上看到了网页,直到你提到它,我才注意到字符限制。那是什么解决办法??
    Worksheets("DTR").Cells(Total_Rows_Formulas + 1, 20).FormulaArray = ...
    
    {=IF(FirstPart=SecondPart,ThirdPart*FourthPath,FifthPart)}
    
    Sub OvercomeFormulaArrayLimit()
    
        Selection.FormulaArray = "=SUM(IF(A2:A9=12,IF(B2:B9=23,C2:C9)))+XYZ"
    
        For r = 1 To 10
    
            Selection.Replace "XYZ", "SUM(IF(Sheet1!A2:A9=12,IF(Sheet1!B2:B9=23,Sheet1!C2:C9)))+XYZ"
    
        Next
    
        Selection.Replace "XYZ", "SUM(IF(Sheet1!A2:A9=12,IF(Sheet1!B2:B9=23,Sheet1!C2:C9)))"
    
    End Sub
    
    With Worksheets("DTR").Cells(Total_Rows_Formulas + 1, 20)
    
        .FormulaArray = "=IF(replExtra=""Extra"" ..."
        .Replace "replExtra", "INDEX('Payroll Tables and Settings'!D$2:D$1048576,MATCH(DTR!B" & Total_Rows_Formulas + 1 & ",'Payroll Tables and Settings'!A$2:A$1048576,0))"
        'etc.
    
    End With
    
    With Worksheets("DTR").Cells(Total_Rows_Formulas + 1, 20)
            .FormulaArray = "=IF(INDEX('Payroll Tables and Settings'!D$2:D$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))=""Extra"",P2*7777/8,2424)"
            .Replace "7777", "INDEX('Payroll Tables and Settings'!B$2:B$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))"
            .Replace "2424", "IF(INDEX('Payroll Tables and Settings'!F$2:F$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))>0, IF(AI2=""Sunday"",0, IF(OR(AF2>=24,AF2<=8)=TRUE,1111+2222+3333,b.)),4444+5555+6666)"
            .Replace "1111", "(INDEX('Payroll Tables and Settings'!F$2:F$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))/2)"
            .Replace "+2222", "/(INDEX('Payroll Tables and Settings'!AC$2:AC$538,MATCH(1,IF(DTR!C2>='Payroll Tables and Settings'!Z$2:Z$538,IF(DTR!C2<='Payroll Tables and Settings'!AA$2:AA$538,1)),0))+8888)"
            .Replace "+8888)", "-INDEX('Payroll Tables and Settings'!AB$2:AB$538,MATCH(1,IF(DTR!C2>='Payroll Tables and Settings'!Z$2:Z$538,IF(DTR!C2<='Payroll Tables and Settings'!AA$2:AA$538,1)),0)))"
            .Replace "+3333", "IF(SUM(DTR!P2:S2)<8,IF(IFERROR(INDEX('Holidays Table'!B$2:B$104857,MATCH(C2,'Holidays Table'!A$2:A$104857,0)),0)=0,(8-SUM(DTR!P2:S2))*(INDEX('Payroll Tables and Settings'!B$2:B$104857,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$104857,0))/8),0),0)"
            .Replace "4444", "(INDEX('Payroll Tables and Settings'!F$2:F$1048576,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$1048576,0))/2)"
            .Replace "+5555", "/(INDEX('Payroll Tables and Settings'!AG$2:AG$538,MATCH(1,IF(DTR!C2>='Payroll Tables and Settings'!AD$2:AD$538,IF(DTR!C2<='Payroll Tables and Settings'!AE$2:AE$538,1)),0))+1212)"
            .Replace "+1212)", "-INDEX('Payroll Tables and Settings'!AF$2:AF$538,MATCH(1,IF(DTR!C2>='Payroll Tables and Settings'!AD$2:AD$538,IF(DTR!C2<='Payroll Tables and Settings'!AE$2:AE$538,1)),0)))"
            .Replace "+6666", "IF(SUM(DTR!P2:S2)<8,IF(IFERROR(INDEX('Holidays Table'!B$2:B$104857,MATCH(C2,'Holidays Table'!A$2:A$104857,0)),0)=0,(8-SUM(DTR!P2:S2))*(INDEX('Payroll Tables and Settings'!B$2:B$104857,MATCH(DTR!B2,'Payroll Tables and Settings'!A$2:A$104857,0))/8),0),0)"
    End With