【问题标题】:Point to a relative other Sheet in Excel指向 Excel 中的相对其他工作表
【发布时间】:2010-10-29 16:13:25
【问题描述】:

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

我知道如何通过

调用其他工作表
=Sheet1!A1

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

=Sheet[-1]!A1

有什么想法吗?

【问题讨论】:

    标签: excel worksheet-function


    【解决方案1】:

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

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

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

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

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

    编辑

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

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

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

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

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

    使用上述两种方法中的任何一种,您都可以完全避免使用 VBA,从而避免用户在打开文件时出现烦人的警告消息。

    【讨论】:

    • 必须同意有风险的部分,尤其是不小心拖动工作表的用户
    • @datatoo,我希望 OP 打算在文件分发之前调用 VBA 进程。
    • 这个想法的整个想法是,你已经安排好了工作表,并且能够移动它们,这将改变计算。
    【解决方案2】:
    =INDIRECT("Sheet"&TEXT(VALUE(MID(CELL("filename",A8),FIND("]",CELL("filename",A8))+1,256))-1,"#")&"!A1")  
    

    注意事项:

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

    【讨论】:

    • 这只有在我使用 Sheet1、Sheet2 等名称时才有效?我需要能够始终从当前表格左侧的表格中获取数据。使用 VB 代码我会使用工作表的索引代码,但我还没有找到任何方法来使用公式。
    • 不是 AFAIK。在这里你可以找到一个近似值,但定义一个 UDF vbaexpress.com/kb/getarticle.php?kb_id=402
    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多