4

我试图找到一种方法,从单元格中获取位于当前工作表左侧(托盘下方)的工作表中的单元格的数据。

我知道如何通过

=Sheet1!A1

但现在我需要一些最好的解释

=Sheet[-1]!A1

有任何想法吗?

4

4 回答 4

4

使用跳位顺序作为计算的基本部分是 Excel 计算的一种复杂且危险的方法。Excel 提供了许多您最好使用的替代方法:

  1. 贝利撒留的建议的简化版本是:=INDIRECT(A1 & "!A2")其中单元格 A1 具有数据源工作表的名称,而 A2 具有数据源工作表中目标单元格的名称。如果您知道您感兴趣的工作表的名称(或可以通过某种方式查找),请使用此方法。

  2. 如果您需要经常这样做,您可能希望将数据导出到实际数据库(即 MS Access)。然后,您可以进行标准 SQL 查询并将结果导入 Excel 文件。

  3. 如果您绝对想走 VBA 路线,那么您必须编写一些代码:
    3a。获取活动工作簿的所有名称并将它们存储在一个数组中。
    3b。标识该数组中当前活动工作簿的索引号。从该索引中减去 1 以使工作表位于左侧。
    3c。从该工作表中获取单元格值。

  4. 您还可以使用命名范围变得怪异。在 Excel 2003 中,转到Insert->Name->Define,添加一个新的命名范围,您可以在计算中使用该名称,而不是按行和列引用单元格。

编辑

这个想法的整个想法是,你已经安排好了床单,并且能够移动它们,这将改变计算。– Gnutt 1 小时前

请,请,不要那样做。对于初学者来说,这不是与电子表格交互的标准方法。您的最终用户可能会感到困惑,甚至可能不会要求澄清。

你会想要探索数据验证的想法:

  1. 使用Data->Validation创建一个下拉菜单,列出工作簿中的所有工作表(如果所有工作表的名称都是静态的,您可以硬编码它们,否则,您需要一些 VBA 来提取它们)。
  2. 然后用户只需选择他们选择的工作表,indirect() 将自动更新所有内容。

或者,您也可以查看Tools->Scenarios。我不认识任何使用此功能的人,但您可能是一个很好的人选。基本上,它可以让您查看使用不同数据集(即“场景”)的计算结果,以便用户可以在它们之间来回切换。

使用上述两种方法中的任何一种,您很有可能完全避免使用 VBA,从而在用户打开文件时为他们节省恼人的警告消息。

于 2010-10-29T20:55:51.463 回答
1
=INDIRECT("Sheet"&TEXT(VALUE(MID(CELL("filename",A8),FIND("]",CELL("filename",A8))+1,256))-1,"#")&"!A1")  

注意事项:

  1. 您的工作簿必须事先保存
  2. A8 可以替换为对任何非错误单元格的引用
于 2010-10-29T17:05:28.467 回答
1

我知道这在这里不被视为好的做法,但我想做类似的事情。它确实在一定程度上复制了数据库功能,但是当一些东西已经完成一半时,我没有时间或支持从头开始构建一个。

我希望能够这样做的原因是创建一个汇总表,该表链接到工作簿中的所有工作表,并在您插入新工作表时自动扩展。这是为了管理一个大型销售/报告电子表格,其中包含许多具有相同结构的不同业务部门(即使用相同的工作表格式为不同的人报告相同的结果。营业额很高。我想要几个摘要报告源工作表的不同方面的工作表。如果每次都重新创建所有表,则管理起来非常耗时。

应该能够使用 row() 作为索引标记来定义您想要使用诸如 REPLACE、OFFSET 或 INDEX 之类的信息,但您不能因为它们仅引用 2D 数组。

尽管 Excel 将 3-D 引用视为统计函数的数组,但它似乎对引用函数不做同样的事情。您可能有 SUM(sheetX:sheetY!A1) 并且能够在两者之间添加一个工作表,没有(例如)一个 INDEX(sheetX:sheetY!A1,n) 函数。我已经尝试将这些 2D 函数用作数组公式的一部分,并将 3D 引用定义为数组或命名范围……嗯,值得一试:)。

所以我相信这是一个有效的行动。我也相信一定有办法做到这一点,但现在我依靠 UDF,它有由计算问题或操作 Workbook_SheetChange 函数或类似函数引起的错误风险。或者创建一个主工作表来控制所有其他工作表,这些工作表是通过使用基于所有工作簿数组的子例程来填充的。

于 2011-02-07T21:07:40.740 回答
0

这些功能对我很有效。他们获取工作表索引(您调用它们的范围的父级),从该索引中添加或减去,然后从该(相对)工作表和传入的地址创建一个范围。

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
于 2019-07-15T08:08:33.297 回答