您好所有,并感谢您的帮助提前,
我有一个Excel片,其是仅采取多张纸的总和。 最好,最简单地说,该公式是一样的东西=sum(Sheet1!A1,Sheet2!A1,Sheet3!A1,Sheet4!A1)
有迹象表明,事情虽然复杂化的几个问题。 首先要明确的,我不知道张总结的数量和顺序,也不知道他们的名字。 该公式将被复制到其他〜150个细胞,所以我需要的总和是动态的,而不是每次都物理地增加片材以150〜细胞。 (另外的片材的结构和命名不允许容易拖动为公式。)
所以首先,我想我可以用它写indirect()
参考。 我做了一个栏列出所有将被添加到每个细胞的表名。 不幸的是, concatenate()
不能在阵列中使用,所以我不得不求助于下面看的UDF:
Function CONCAT(Delimiter As Variant, ParamArray CellRanges() As Variant) As String
Dim Cell As Range, Area As Variant
If IsMissing(Delimiter) Then Delimiter = ""
For Each Area In CellRanges
If TypeName(Area) = "Range" Then
For Each Cell In Area
If Len(Cell.Value) Then CONCAT = CONCAT & Delimiter & Cell.Value
Next
Else
CONCAT = CONCAT & Delimiter & Area
End If
Next
CONCAT = Mid(CONCAT, Len(Delimiter) + 1)
End Function
使用UDF,我能得到一个大的字符串以正确的语法,例如=CONCAT("'!A"&(B1+1)&",'",Array_of_Sheets)&"'!A"&(B1+1)
。 的CONCAT()
需要一个分离器作为第一个参数和所述阵列(一个或多个)作为第二个参数。 然后我追加的字符串末尾的“分隔符”以及输出的东西,如Sheet1'!A1,'Sheet2'!A1
。 我想在这一点上,一个简单的=sum(indirect(STRING))
就足够了,但是=sum(indirect("Sheet1!A1,Sheet2!A1,Sheet3!A1,Sheet4!A1"))
因为不起作用indirect()
不能看似处理逗号。
因此,要解决这个问题,我切换=CONCAT()
来=CONCAT("'!A"&(B1+1)&"+'",Array_of_Sheets)&"'!A"&(B1+1)
以输出Sheet1'!A1+'Sheet2'!A1
。 现在,我又写了UDF,迫使它下面来评价看到:
Function EVAL(RefCell As String)
Application.Volatile
EVAL = Evaluate(RefCell)
End Function
这个工作! 真棒,对不对? 一些使用和测试,虽然之后,它似乎并不十分一致。 当我们有其他的表格中打开,它并不总是评估(我们将有其他片打开)。 还有就是我用读其他的一些不一致volatile
的UDF,但我无法找到他们。
所以对于我的理想,我想这样做没有任何VBA可言,但我怀疑,这将是不可能的。 我宁愿不依赖于用户手动重新计算工作表(部分为理由volatile
)。 最后,我只是希望它sum()
所以如果用户打开该文档以一致的方式,只是打打印,用户并不需要确认的功能被正确评估(检查#REF错误或手动添加了值以确保它们是正确的)。 我希望能找到一个替代使用eval()
公式。
编辑下面的附加信息
我曾与使用三维阵列实验,但有我遇到了一些问题。 比方说,在工作簿有8片。 那些8片,只有两个可能馈入这个总表。 有一个setup
片材时, total
片, data entry
片,以及data analysis
片。 的total
片合计断的data analysis
表。 典型地, data entry
片具有一致data analysis
表。 因此,用户可以使双方的拷贝data entry
和data analysis
表。 片材的最合理的顺序将与开始setup
片,然后每个配对data entry
和data analysis
表,和total
片。 很显然,这个设置将不会以3D阵列工作。 我们将不得不重新安排表,并确保用户知道纸张的顺序实际上事项(非典型配置)。 也将有其中一个或两个实例data analysis
片将不被包括在total
表。 因此,我们可以结束了的片材的配置setup \ data entry (1) \ data entry (2) \ START \ data anaylsis (1) \ data analysis (2) \ END \ totals \ data entry (3) \ data entry (4) \ data anaylsis (3) \ data analysis (4)
我的感觉是一个三维阵列配置几乎可以做加法太动态。 我宁愿有一个明确的列表,则取决于用户正在四处移动片以具有正确的总计有信心。