【问题标题】:find cell reference of a cell from another cell in excel在excel中从另一个单元格中查找单元格的单元格引用
【发布时间】:2012-01-30 03:54:51
【问题描述】:

我有一个工作表,它从同一个工作簿 (=data!C68) 中的不同工作表返回一个值,该工作表返回一个值。

在另一个单元格中,我想引用原始单元格中的引用,但将行增加 1 - (=data!C69)。单元格不相邻。

这是否可以通过函数或 fromula 实现?

谢谢

乔纳森

【问题讨论】:

    标签: vba excel


    【解决方案1】:
    Option Explicit
    Function GetCellReferenceUsedInFormula(ByVal src As Range) As Range
    If src.HasFormula Then
        Set GetCellReferenceUsedInFormula = Evaluate(Mid(src.Formula, 2))
    End If
    End Function
    

    并在公式中使用上述函数OFFSET

    =OFFSET(GetCellReferenceUsedInFormula(A1),1,0)
    

    这是假设单元格 A1 包含公式 =data!C68
    请注意,VBA 代码假定公式很简单(即=somecellreference)。

    【讨论】:

      【解决方案2】:

      有很多方法可以实现这一点。这是一种方法。我通过合并要偏移的行和列来扩展该功能。将此代码粘贴到模块中

      语法

      =GetOffset(Range,Row,Col)

      备注

      范围(必填)是具有公式的单元格

      (可选)要偏移的行

      Col(可选)要偏移的列

      示例用法

      =GetOffset(A1) :这将从 A1 所指的同一单元格中获取值。如果 A1 指的是=data!C69,那么 GetOffset 将从数据中获取价值!C69

      =GetOffset(A1,1) :这将从 A1 所指的下一个单元格(向下 1 行)获取值。如果 A1 指的是=data!C69,那么 GetOffset 将从数据中获取价值!C70

      =GetOffset(A1,1,1) :这将从 A1 所指的下一个单元格(跨 1 Col 向下 1 行)获取值。如果 A1 指的是=data!C69,那么 GetOffset 将从数据中获取价值!D70

      =GetOffset(A1,0,1) :这将从 A1 所指的下一个单元格(跨 1 Col 的同一行)获取值。如果 A1 指的是=data!C69,则 GetOffset 将从数据中获取值!D69

      代码

      Public Function GetOffset(Rng As Range, Rw As Long, Col As Long) As Variant
          Dim MyArray() As String, strTemp As String
          Dim TempRow As Long, TempCol As Long
      
          On Error GoTo Whoa
      
          Application.Volatile
      
          MyArray = Split(Rng.Formula, "!")
      
          TempRow = Range(MyArray(UBound(MyArray))).Row
          TempCol = Range(MyArray(UBound(MyArray))).Column
      
          TempRow = TempRow + Rw
          TempCol = TempCol + Col
      
          strTemp = MyArray(0) & "!" & Cells(TempRow, TempCol).Address
      
          GetOffset = Application.Evaluate(Trim(strTemp))
          Exit Function
      Whoa:
      End Function
      

      【讨论】:

      • 哇,哇,哇。这真是太棒了,它就像一个梦一样,我不能感谢你,它确实为我节省了几个小时。我真的很感谢你的帮助。谢谢乔纳森
      • 使用Application.Volatile 不是一个好习惯。即,只要工作表上发生计算事件,无论是否有任何依赖单元格发生更改,VBA 代码都会执行。
      • 这不是一个好习惯吗?我很抱歉,但说谁? :) 我希望它重新计算,因此我将其包括在内:) 你的意思是说自从 NOW(),RAND() 在计算事件上发生变化,所以它很糟糕?您必须明智地使用 Application.Volatile,因为冗长的函数会使您的工作表变慢,否则没有问题。
      • 我同意,我不明白 application.volatile 的含义,但我只是知道 Siddharth 的代码工作得很好,并且为我节省了一大堆时间,对我来说,这是一个好习惯!!!谢谢乔纳森
      • @SiddharthRout:尝试使用Function test2() As String Application.Volatile test2 = "Hello world" msgbox "why is it hitting here?" End Function 之类的小函数,并在 Excel 单元格 (B1) 中使用它。然后在单元格 A1 中输入值 1,在单元格 A2 中输入值 2 并在单元格 A3 中输入公式 =SUM(A1:A2),您会看到 test2 函数被调用,我认为这是不应该发生的。现在,将单元格 A1 中的值更改为 2(这将触发单元格 A3 重新计算)。我问一个问题,当它的依赖参数都没有改变时,为什么这个函数要重新计算自己?
      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多