好的,这就是我想要完成的。对于此示例,我有一个由 4 个数据表和一个总计表组成的工作簿。4 个数据表中的每一个都有一个相似的名称,遵循相同的模式,唯一的区别是日期。(例如 9854978_1009_US.txt,其中 1009 是更改的日期,而文件名的其余部分相同)。在这些文档中的每一个中,F 列都包含一系列数字,我想找到它们的总和,但我不知道 F 中有多少单元格实际上包含数字。(但是,数字下方永远不会有其他信息,所以理论上我可以将整个 F 列加在一起)。随着时间的推移,我还将向工作簿添加新文件,并且不想重写我从 F 列收集数据的代码。基本上我想要完成的是' totals' 文件从工作簿中名为 '9854978_????_US.txt' 的文档中获取每一列 F,其中问号根据文件名而变化。我将如何在纯 Excel 代码中执行此操作?
2 回答
在这种情况下,我建议使用 VBA,但我发现了一个(诚然效率低下)只有 excel 公式的解决方案。
在新工作表的单元格 A1 中写入 1,然后在下面的单元格中写入 2。选择两个单元格并向下拖动。自动完成功能将产生从 1 到拖动结束的数字。继续,直到你到达数字 9999
在单元格 B1 中输入公式=TEXT(A1,"000#")
;向下拖动公式以获取文本从0001到9999的文本。
在单元格 C1 中输入公式="9854978_"&B1&"_US.txt"
;向下拖动公式以获取从 9854978_0001_US.txt 到 9854978_9999_US.txt 的文本
在单元格 D1 中输入公式:
=if(ISERROR(SUM(INDIRECT(C1&"!F:F"))),0,SUM(INDIRECT(C1&"!F:F")))
; 向下拖动公式以获得总和。
减少可能的数字集,该解决方案的效率可能会大大降低。缺少年份,可能的日期只有 365。
PS:公式可能有点错误,因为我是从本地化版本的 excel 中翻译过来的。
这是一个将执行此计算的函数:
Function TotalColF() As Double
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
If left(wks.name,7) = "9854978" then
TotalColF = TotalColF + Application.WorksheetFunction.Sum(wks.Range("F:F"))
End If
Next wks
End Function
这不是一个易失性函数,因此如果您添加另一个工作表,或更改 F 列中的值,则在您通过 Ctrl + Alt + F9 强制重新计算之前,不会显示修改后的总数。
如果您需要一个始终显示正确总数的 volatile 函数,请告诉我。可变函数会使重新计算时间变慢,但这对您来说可能不是问题。
如果您通过 VBA 添加新工作表,则可以使用 VBA 指令强制重新计算:Application.CalculateFull