【问题标题】:Filter range of cells before passing to function在传递给函数之前过滤单元格范围
【发布时间】:2019-02-19 07:19:02
【问题描述】:

我有一个自定义 VBA 函数,我正在将大量单元格传递给(单列中大约 600 个单元格)。

公式如下:

=getRootWord($I620, OFFSET($H$8,0,0,(ROW()-ROW($H$8)),1))

(基本上,它说,“对于调用此公式的给定单元格,传入一个覆盖其上方每个单元格的范围,从第 8 行开始” - 有没有更好的方法来编写该公式?)

我的问题是,自定义 VBA 函数运行速度有点慢,实际上,传入的 90% 的单元格我不需要,并且必须在 VBA 函数中忽略。

此单元格上方的任何具有公式的单元格,而不是文本,我不感兴趣。

如何使用 Excel 公式对该范围进行操作 (OFFSET($H$8,0,0,(ROW()-ROW($H$8)),1)) 并排除该范围内具有公式的任何单元格? 或者排除任何非文本单元格?

该列中的每个单元格要么是一个公式(显示的公式相同),要么是文本 - 没有空格、数字、日期等...

【问题讨论】:

  • 也许看看xlCellTypeConstants。如果没有看到实际的 UDF,这有点难以分辨。
  • 大多数 VBA UDF 可以通过改进代码显着加速:所以发布您的 VBA 代码。
  • @CharlesWilliams 我认为 StackOverflow 不喜欢通用的“改进我的代码!”问题?
  • 无论如何,我的问题是我不明白 OFFSET() 使公式不稳定,从而不必要地重新计算数百个单元格。删除 OFFSET() 的使用大大加快了速度,大约 90%。

标签: excel


【解决方案1】:

Application.ThisCellApplication.Caller 将引用 UDF 所在的单元格。您可以从其中之一获取当前行。

Range.SpecialCells(xlCellTypeConstants) 只会考虑值;不是公式或空格。 Range.SpecialCells(xlCellTypeConstants, xlTextValues) 进一步将其收紧为文本值。如果存在未连接的文本值“区域”,您可能必须通过范围联合的区域。

要获得 I 列中从第 8 行开始到使用公式尝试的行的单元格范围,

dim rng as range

with application.caller.parent
    set rng = intersect(.range(.cells(8, "I"), .cells(application.caller.row-1, "I"))).SpecialCells(xlCellTypeConstants, xlTextValues)
end with

debug.print rng.address(0,0)

【讨论】:

  • 很遗憾,您不能在 UDF 中使用 Specialcells
  • 哎呀!那是我的错。
  • @Rory,但它可以调用另一个宏来完成这项工作吗?
  • @JvdV - 不 - 从 UDF 调用另一个宏不会消除限制。
  • 谢谢,我已经尝试过使用 SpecialCells()。在将东西交给 VBA 之前,我更多的是寻找 Excel 公式方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多