【问题标题】:Excel function limit 8192 characterExcel 函数限制 8192 个字符
【发布时间】:2017-02-07 16:24:15
【问题描述】:

我在一个单元格中有超过 10,000 个字符的公式。我不能引用多个单元格,因为要求限制了它。

例子:

=IF(NOT(ISERROR(SEARCH(String1,IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))="","",INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))),"")))),SUBSTITUTE(IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))="","",INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))),""),String1,$G2),IF(NOT(ISERROR(SEARCH(String2,IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))="","",INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))),"")))),SUBSTITUTE(IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))="","",INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))),""),String2,$F2), IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))="","",INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,"&","_"),"-","_")," ",""),":","_")),COLUMNS($K$1:K$1))),"")))

我不确定该公式是否有帮助。但是那个公式的例子。

在 Excel 中获得了命名范围(定义的名称),公式可能会根据该范围的名称调用单元格。

公式/函数有类似的东西吗?由于嵌套公式,我的函数很长。

我可以用我自己的字符替换 "SUBSTITUTE" 吗?像前。 SUBTE

【问题讨论】:

  • 你考虑过VBA吗?包含数千个字符的公式很难调试。
  • VBA 对于不了解它的其他人来说相当混乱。试图解释将使我的工作增加三倍。另外,我不太擅长 VBA。
  • 解释一个 开始 =IF(NOT(ISERROR(SEARCH(String1,IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE 的 10,000 个字符的公式很容易解释吗?像这样的公式本质上是只写的,除了他们的作者之外几乎没有人能理解它们(而且,作者自己通常不理解,不完全),而等效的 VBA 很容易理解和分享。跨度>
  • 但是——我认为不应该投反对票。这仍然是一个好问题。
  • 恰恰相反。如果您向我们很好地解释了问题,我们可以帮助您编写 VBA 代码。那么只要把代码放到正确的地方就可以了。

标签: vba excel excel-formula


【解决方案1】:

如前所述,几乎可以肯定,最好的解决方案是编写一个简洁的 VBA 函数来为您完成所有工作。

但是,正如您明确要求的那样。这是一个只是SUBSTITITE但长度更短的函数的代码。我看不到您使用instance_num 参数的任何地方,所以我没有在其中构建它。

您需要将以下代码添加到 VBA 编辑器中的新模块中,然后您可以在工作表上使用 SUBSTITUTE() 函数,只需编写 SU()

Function SU(txt As String, old_text As String, new_text As String) As String
    SU = Application.WorksheetFunction.Substitute(txt, old_text, new_text)
End Function

【讨论】:

    【解决方案2】:

    VBA 可能是最好的选择。 不过,如果您不能考虑它,请考虑将公式拆分为 5 到 6 个较小的公式。它可以更好,使用该公式的人有更多机会了解正在发生的事情:

    例如像这样: 这里第二行的公式被拆分为第一行的另外两个公式。

    注意:Wenn 表示IF

    此外 - 当您使用如此大的公式时,请始终尝试以有意义的方式格式化它们。例如,像这样:

    这是通过单击您想要换行的位置并按ALT+Enter 来实现的。代表所有人,每天处理写得不好的公式 - 谢谢! :)

    编辑: 无论如何,如果 VBA 是一个选项,最坏的情况应该是这样的:

    Option Explicit
    
    Public Function MyLongFormula() As String
    
        Dim strResult As String
    
        Application.Volatile
    
        strResult = "=IF(NOT(ISERROR(SEARCH(String1,IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),"
        strResult = strResult & "COLUMNS($K$1:K$1))="""","""",INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),"
        strResult = strResult & "COLUMNS($K$1:K$1))),"""")))),SUBSTITUTE(IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),"
        strResult = strResult & "COLUMNS($K$1:K$1))="""","""",INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),COLUMNS($K$1:K$1))),""""),"
        strResult = strResult & "String1,$G2),IF(NOT(ISERROR(SEARCH(String2,IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),"
        strResult = strResult & "COLUMNS($K$1:K$1))="""","""",INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),COLUMNS($K$1:K$1))),"""")))),"
        strResult = strResult & "SUBSTITUTE(IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),COLUMNS($K$1:K$1))="""","""","
        strResult = strResult & "INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),COLUMNS($K$1:K$1))),""""),String2,$F2),"
        strResult = strResult & "IFERROR(IF(INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),COLUMNS($K$1:K$1))="""","""","
        strResult = strResult & "INDEX(INDIRECT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($J2,""&"",""_""),""-"",""_""),"" "",""""),"":"",""_"")),COLUMNS($K$1:K$1))),"""")))"
    
        MyLongFormula = Evaluate(strResult)
    
    End Function
    
    Public Function MyLongFormula2() As String
    
        Application.Volatile
        MyLongFormula2 = Evaluate("=sum(1,2)")
    
    End Function
    

    只需写信=MyLongFormula2 即可了解它的预期工作方式。

    【讨论】:

    • ALT+Enter 的好建议。我经常感到困惑的是,Excel 编辑公式的功能很差。
    • 不幸的是,OP 说:我不能引用多个单元格,因为要求限制了它
    • 我认为是 SUBSTITUTE 嵌套的问题。有没有办法用“或”替换嵌套?示例:=(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($H2,"&","_"),"‌​-","_")," ",""),":","_")),A1,"") 替换为 =SUBSTITUTE($H2,"&" or ":" or ",",A1,"")。 SUBSTITUTE 函数中旧文本中的“”。
    • @silver_river - 没有 VBA 这可能是最好的选择 - stackoverflow.com/questions/22313965/…
    【解决方案3】:

    很遗憾,您的问题的答案是“不”,或者至少“不完全”。您不能直接命名函数,但可以使用named formulas。例如,您不能使用名称为函数 SUM() 创建别名 S,但您可以创建命名公式 S,当它出现在另一个公式中时,将对 100 个元素求和细胞上方。有了一定的聪明,你通常可以使用命名公式来缩短很长的公式,但不像引入函数的缩写那样机械。

    可以使用 VBA 创建 UDF 函数,这些函数是工作表函数的缩写别名,但如果您要使用 VBA,您通常可以用功能等效的 UDF 替换整个公式,而不是简单地替换别名的一些功能。请参阅@CallumDA 的答案,了解我所说的工作表函数的 VBA 别名。

    【讨论】:

    • 谢谢。会调查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2016-05-29
    相关资源
    最近更新 更多