指向Excel中的相对其他工作表

时间:2010-10-29 16:13:25

标签: excel worksheet-function

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

我知道如何通过

拨打其他表格
=Sheet1!A1

但现在我需要用

解释得最好的东西
=Sheet[-1]!A1

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

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

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

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

  3. 如果你绝对想要去VBA路线,那么你必须写一些代码:
    3A。获取活动工作簿的所有名称并将它们存储在一个数组中 3B。标识该阵列中当前活动工作簿的索引号。从该索引中减去1以使工作表向左移动 3C。从该工作表中获取单元格值。

  4. 你也可以使用命名范围变得怪异。在Excel 2003中,转到插入 - >名称 - >定义,添加新的命名范围,您可以在计算中使用该名称,而不是按行和列引用单元格。

  5. 修改

      

    这一个的整个想法就是这样   你有安排的床单,并且是   能够移动它们,那个   应改变计算。 - Gnutt   1小时前

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

    您需要探索数据验证的想法:

    1. 使用数据 - >验证,制作一个下拉菜单,列出工作簿中的所有工作表(如果所有工作表的名称都是静态的,您可以对它们进行硬编码,否则,您“我需要一些VBA来拉它们。”
    2. 然后用户只需选择自己选择的表格,而间接()将自动更新所有内容。
    3. 或者,您也可以查看工具 - >情景。我不认识任何人使用此功能,但你可能是一个很好的候选人。基本上,它允许您使用不同的数据集(即“场景”)查看计算结果,以便用户可以在它们之间来回切换。

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

答案 1 :(得分:1)

=INDIRECT("Sheet"&TEXT(VALUE(MID(CELL("filename",A8),FIND("]",CELL("filename",A8))+1,256))-1,"#")&"!A1")  

注意事项:

  1. 您的工作簿必须先保存
  2. A8可以替换为对任何非错误单元的引用

答案 2 :(得分:1)

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

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

应该能够使用row()作为索引标记来定义你想要的信息,比如REPLACE,OFFSET或INDEX,但你不能因为它们只引用2D阵列。

Excel将3-D引用视为统计函数的数组,而对于引用函数它似乎不相同。你可能有SUM(sheetX:sheetY!A1)并且能够在它们之间添加一个工作表,没有(例如)INDEX(sheetX:sheetY!A1,n)函数。我已经尝试使用这些2D函数作为数组公式的一部分,并将3D引用定义为数组或命名范围......好吧值得一试:)。

所以我相信这是一个有效的行动。我也相信必须有一种方法可以做到这一点,但是现在我回到了一个UDF,它有计算问题导致错误的风险,或者操纵Workbook_SheetChange函数或类似功能。或者创建一个主表来控制使用基于所有工作簿数组的子例程填充的所有其他主表。

答案 3 :(得分: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