【问题标题】:How to output the Range (or row numbers) of a Formula in a specified cell?如何在指定单元格中输出公式的范围(或行号)?
【发布时间】:2020-01-21 14:40:23
【问题描述】:

进行了几个小时的搜索,但还没有完全找到我要找的东西。我通常在搜索“从公式中提取范围值”等内容,但它并没有真正给我我需要的东西。我什至在输入标题时浏览了“类似问题”部分。

我完全依赖于寻求有关如何编写 VBA 的 sn-ps 的帮助,到目前为止我做得很好。

我想做什么:

好的,我会根据 Pᴇʜ 的建议澄清我要做什么

  1. 我有一个包含数千行数据(10k - 30k 行)的工作表
  2. 以前的员工已经手动完成了这些操作,并在原始数据之间手动输入了 Avg、Min、Max、Std Dev 行。上面计算的行数并不总是一致的(有时是 60 行,有时是 35 行等)
  3. 我正在通过搜索文本“Avg”来搜索底部或末尾行。这很好用。只需找到带有“AVG”的单元格,然后向上移动 1 个单元格,这就是我的结束时间。
  4. 到目前为止我无法做的是找到 START 行(使用循环,因为其中有很多。每个工作表有 30、40、50 个。可能有 60 个工作表。所以效率低下手动执行此操作)

  5. 唯一可靠的方法是使用可用的公式 - (例如,=AVERAGE(C50:C110))。我将始终选择 AVERAGE 公式,它始终是一组范围,而不是多组(每个示例)。

  6. 正如我所提到的,我需要从此公式中提取起始行并将其返回,以便我可以使用它来指定要复制和粘贴的单元格,并为每个数据集反复执行此操作。李>

希望这能澄清我的情况。我尽量不说得太详细,但事后看来这不是最好的主意。

我很抱歉。

Scott_Craner's Link to arcadeprecint's answer应该有效。我只需要修改它以使用循环。

提示?

【问题讨论】:

标签: excel vba


【解决方案1】:

如果单元格 A1 包含公式 =AVERAGE(C50:C110) 则

Debug.Print Range("A1").Precedents.Address(RowAbsolute:=False, ColumnAbsolute:=False)

将返回C50:C110。如果有更多的先前单元格,则地址以逗号分隔,例如 =AVERAGE(C50:C110)+B5 会导致 C50:C110,B5。

或者,您可以循环遍历先例区域以分别获取所有地址。

Dim iArea As Range
For Each iArea In Range("A1").Precedents
    Debug.Print iArea.Address(RowAbsolute:=False, ColumnAbsolute:=False)
Next iArea 

要获得先行地址的开始行和结束行,您可以简单地进行一些行计算:

Dim rng As Range
Set rng = Range("YourAvrCell")

Debug.Print rng.Precedents.Address(RowAbsolute:=False, ColumnAbsolute:=False)

Debug.Print rng.Precedents.Row
Debug.Print rng.Precedents.Rows.Count + r.Precedents.Row - 1

【讨论】:

  • 一个有用的直接方法:-)
  • 公式将始终为 =AVERAGE (xx:xx)。一个范围。可能是我需要找到的 30 个。我目前的过程是 1. 查找数据集 #1 2. 查找包含 =AVERAGE 公式的行 3. 将平均公式的值复制并粘贴到另一张表(多列) 4. 查找此 AVERAGE 的起始行等式 5. 将 C (startRow) 复制并粘贴到另一张表 6. 循环处理所有 30 个数据集或存在的多个数据集
  • 我不确定将列和行信息打印到即时窗口有什么帮助,但我现在正在寻找如何使用它。我希望在循环中存储为行值(变量)或循环中的单元格值。
  • 没看懂,你问的太多了,一个帖子只能问一个。请编辑您的原始问题,显示您正在尝试做的正确示例。屏幕截图可能会有所帮助。还要说明你的总体目标是什么,为什么要实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多