【问题标题】:Formula too long - character limit reached - will VBA work?公式太长 - 达到字符限制 - VBA 可以工作吗?
【发布时间】:2018-11-10 14:08:45
【问题描述】:

我正在创建一个工具来汇总我们放入 Excel 工作簿的某些数据。所以本质上,在我们将工作簿的名称输入摘要工具后,我使用“间接”功能从工作簿中提取。一般是这样的想法:

IFERROR(INDIRECT("'[" & Refs!$B$4 & "]" & $A$1 & "'!" & EmplRefs!$C91),0)=C$76,1,0)

$B$4 是第一个文件名的位置,然后我会做+IFERROR(INDIRECT ... $B$5 等等等等。这很好用。但是,我需要对其进行设置,使其最多可容纳 70 个文件。除了在特定公式中它是 IF/AND 语句并且它使公式超出公式/单元格的字符限制之外,这也可以正常工作。

如果我把它放到VBA中,VBA会允许超长公式,还是同样的限制?

我对向单元格添加公式的理解:

Sub voccomplete()
    Worksheets("Employment").Range("E83").Formula = "=[giant formula here]"
End Sub

欢迎其他关于如何获取此信息的想法(我认为我对 VBA 不是很熟悉,我通常可以按照说明进行操作)...这是有问题的公式(仅容纳 25 个文件):

IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$4& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$4& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$5& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$5& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$6& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$6& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$7& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$7& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$8& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$8& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$9& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$9& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$10& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$10& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$11& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$11& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$12& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$12& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$13& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$13& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$14& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$14& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$15& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$15& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$16& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$16& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$17& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$17& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$18& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$18& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$19& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$19& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$20& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$20& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$21& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$21& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$22& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$22& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$23& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$23& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$24& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$24& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$25& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$25& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$26& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$26& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$27& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$27& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)+IF(AND(IFERROR(INDIRECT("'[" & Refs!$B$28& "]" & $A$1 & "'!" & EmplRefs!$C91),0)=B$76,IFERROR(INDIRECT("'[" & Refs!$B$28& "]" & $A$1 & "'!" & EmplRefs!$B93),0)="Completed"),1,0)

计算机信息:Windows 7 Professional、Excel 2016

【问题讨论】:

  • 不要使用这么长的公式(您可能不想实际使用,这太难理解/排除故障/管理),为什么不使用帮助列。在每个参考 B[row] 旁边,只需输入您的公式以查看它是否“已完成”然后您可以使用它来汇总/过滤?
  • INDIRECT 不适用于已关闭的工作簿。你真的打开了 70 个工作簿吗?
  • 此外,您可以在单元格公式中输入的内容有字符限制;所以如果可能的话,你可能会找到另一种方法。
  • 你的想法是什么,只是为了检查各个文件在某个单元格中是否具有一定的值?
  • @Rachel 直接回答您的问题,而不是为您提供解决方案:VBA 对论坛/论坛没有做任何特别的事情,所以如果您尝试将该公式放入单元格中,您将拥有同样的问题(但由于VBA而得到不同的错误)。最好像 Harrassed Dad 的回答那样在 VBA 中做你想做的事情。

标签: vba excel formulas character-limit


【解决方案1】:

因此,您正在遍历工作簿,查看 A1 中定义的工作表,并在该工作表中查看 C91 中定义的单元格,并将其与 b76 中保存的值进行比较 - 如果它相等并且 B93 中定义的单元格也相等到“完成”然后你加一。

您需要一个用户定义函数,该函数将定义要查看的工作簿的范围 (B4:B74 ?) 以及范围 C91 和 B93 以及“B76”的内容作为地址

 Public Function NumberCompleted(WorkbooksToLookAt as range, S1 as string, S2 as string,s3 as string) as long
 Dim wb as workbook
 Dim ws as worksheet
 Dim r as range
 dim c as range
 dim counter as long
 For each r in Workbookstolookat
     set wb = workbooks(r)
     set ws = wb.worksheets(range("a1").text)
     set c = ws.range(s1)
     if c = ws.range(s2) then
           if ws.range(s3)="Completed" then
                 counter = counter + 1
           end if
      end if
    Next r
    NumberCompleted = counter
    End Function

您将在电子表格中用作

  =NumberCompleted(B4:B74,C91,"B76",B93)

注意:我在手机上,所以我无法运行它,所以它可能存在语法错误

【讨论】:

  • 只要工作簿处于打开状态,这看起来就可以工作。如果它们未打开,则需要另一种方法从关闭的工作簿中查询数据。
  • @BruceWayne 是的,基本上我正在检查打开的工作簿中的所有相同单元格,如果它是“是”(或“否”等),则将其加一以获得完整计数。另外 - 谢谢你的想法!这可能行得通。
  • @harassed-dad 感谢您的回复 - 这绝对超出了我的水平,但我会梳理一下,看看 ti 是否可以满足我的目的。看起来它会比我现在拥有的要容易得多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2022-11-01
  • 2021-06-15
相关资源
最近更新 更多