【发布时间】:2010-10-29 16:13:25
【问题描述】:
我正在尝试找到一种方法,从单元格中获取位于当前工作表左侧(托盘下方)的工作表中的单元格的数据。
我知道如何通过
调用其他工作表=Sheet1!A1
但现在我需要一些最好的解释
=Sheet[-1]!A1
有什么想法吗?
【问题讨论】:
我正在尝试找到一种方法,从单元格中获取位于当前工作表左侧(托盘下方)的工作表中的单元格的数据。
我知道如何通过
调用其他工作表=Sheet1!A1
但现在我需要一些最好的解释
=Sheet[-1]!A1
有什么想法吗?
【问题讨论】:
使用跳位顺序作为计算的基本部分是一种复杂且危险的 Excel 计算方法。 Excel 提供了许多您最好使用的替代方法:
belisarius 建议的简化版本是:=INDIRECT(A1 & "!A2") 其中单元格 A1 包含数据源工作表的名称,A2 包含数据源工作表中目标单元格的名称。如果您知道您感兴趣的工作表的名称(或可以通过某种方式查找),请使用此方法。
如果您需要经常这样做,您可能希望将数据导出到实际数据库(即 MS Access)。然后您可以进行标准 SQL 查询并将结果导入您的 Excel 文件。
如果您绝对想走 VBA 路线,那么您必须编写一些代码:
3a。获取活动工作簿的所有名称并将它们存储在一个数组中。
3b。标识该数组中当前活动工作簿的索引号。从该索引中减去 1 以使工作表位于左侧。
3c。从该工作表中获取单元格值。
您还可以使用命名范围变得怪异。在 Excel 2003 中,转到 Insert->Name->Define,添加一个新的命名范围,您可以在计算中使用该名称,而不是逐行逐列引用单元格。
这个想法的整个想法是 你已经安排好了床单,并且是 能够移动它们,而且 应改变计算。 – 格努特 1 小时前
请,请,不要那样做。对于初学者来说,这不是与电子表格交互的标准方法。您的最终用户可能会感到困惑,甚至可能不会要求澄清。
您会想要探索数据验证的想法:
或者,您也可以查看工具->场景。我不认识任何使用此功能的人,但您可能是一个很好的人选。基本上,它可以让您查看使用不同数据集(即“场景”)的计算结果,以便用户可以在它们之间来回切换。
使用上述两种方法中的任何一种,您都可以完全避免使用 VBA,从而避免用户在打开文件时出现烦人的警告消息。
【讨论】:
=INDIRECT("Sheet"&TEXT(VALUE(MID(CELL("filename",A8),FIND("]",CELL("filename",A8))+1,256))-1,"#")&"!A1")
注意事项:
【讨论】:
我知道这不是一个好的做法,但我想做类似的事情。它确实在一定程度上复制了数据库功能,但我没有时间或支持从头开始构建一个已经完成一半的东西。
我希望能够这样做的原因是创建一个汇总表,该表链接到工作簿中的所有工作表,并在您插入新工作表时自动扩展。这是为了管理一个大型销售/报告电子表格,其中包含许多具有相同结构的不同业务部门(即使用相同的工作表格式为不同的人报告相同的结果。营业额很高。我想要几个摘要报告源工作表不同方面的工作表。如果每次都重新创建所有表,管理起来非常耗时。
您应该能够使用 row() 作为索引标记来定义您想要使用诸如 REPLACE、OFFSET 或 INDEX 之类的信息,但您不能,因为它们仅指 2D数组。
虽然 Excel 将 3-D 引用视为统计函数的数组,但它似乎对引用函数不做同样的事情。您可能有 SUM(sheetX:sheetY!A1) 并且能够在两者之间添加一个工作表,没有(例如)一个 INDEX(sheetX:sheetY!A1,n) 函数。我已经尝试将这些 2D 函数用作数组公式的一部分,并将 3D 引用定义为数组或命名范围……嗯,值得一试:)。
所以我相信这是一个有效的行动。我也相信一定有办法做到这一点,但现在我依靠 UDF,它有由计算问题或操作 Workbook_SheetChange 函数或类似函数引起的错误风险。或者创建一个主工作表来控制所有其他工作表,使用基于所有工作簿数组的子例程填充。
【讨论】:
这些功能对我很有效。他们得到工作表索引( 您调用它们的范围),从该索引中添加或减去,然后创建 该(相对)工作表的范围和传入的地址。
Function relativeSheet(r As Range, iRelative As Integer)
Application.Volatile
relativeSheet = Sheets(r.Cells(1, 1).Parent.Index + iRelative).Range(r.Address)
End Function
Function prevSheet(r As Range)
prevSheet = relativeSheet(r, -1)
End Function
Function nextSheet(r As Range)
nextSheet = relativeSheet(r, 1)
End Function
【讨论】: