【问题标题】:Find first and last row containing specific text查找包含特定文本的第一行和最后一行
【发布时间】:2021-04-02 13:45:39
【问题描述】:

我有一长串(2,000 + 行)不同值的列表。我试图找到每个值的第一行和最后一行。举个例子(注意:所有数据都在一列):

Bats
Bats
Bats
Bats
Bats
Bats
Fun
Fun
Fun
Fun
Bases
Bases
Bases
Bases
Bases
Bases
Bases
Bases
Bases
Bases
Bases
Balls
Balls
Balls
Balls
Balls
Balls
Balls
Balls

如何找到包含每个单词的第一行(从顶部开始)和最后一行。 Bats 从第 1 行开始,在第 6 行结束。Fun 从第 7 行开始,在第 10 行结束。

除了将每个单元格与前一个单元格进行比较并在不同时添加行变量的循环之外,还有什么更快的方法吗?

寻找如何在 VBA 中这样做。

【问题讨论】:

标签: excel vba


【解决方案1】:

我想通了 - VBA 风格。我可以使用 find() 来帮忙:

Dim batStartRow as Long, batEndRow as Long
With Sheets("Sheet1")
    batStartRow = .Range("A:A").Find(what:="bats", after:=.Range("A1")).Row
    batEndRow = .Range("A:A").Find(what:="bats",after:=.Range("A1"), searchdirection:=xlPrevious).Row
End With

然后把“bats”换成其他词,就可以了。

编辑:您可能还需要添加 LookIn:=xlValues 限定符,具体取决于正在搜索的信息/数据。

【讨论】:

  • 我认为这个优雅的解决方案应该给我 batStartRow 中的行号。我将它调整为我的宏(只是添加了 sheet.Range 限定和更改研究目标)。但是变量给了我目标,而不是它所在的第一行/最后一行。我可以问你一个澄清吗?
  • @marcoresk 你是什么意思?它作为范围变量而不是数字返回?
  • 例如,StartRow = Sheet1.Range("A:A").Find(what:="2016", after:=Range("A1")).Row 返回我 2016,而不是 A 列中出现 2016 的第一行的编号。也许它不适用于数字?
  • @marcoresk - 你在使用多张纸吗? after:=Range() 之前还需要 Sheet1.。这样能解决吗?
  • 很遗憾没有。问题似乎是我正在寻找一个数字(一年,公式 YEAR 的结果),因为使用文本一切都很好。此外,将单元格格式设置为“常规”并不能解决问题。即使我确定在单元格中查找一个数字(只有 2015 - 2017 年,试图查找 2018 年),宏仍然返回“2018”。当我查找 2016 年(大约 2000 行包含“2016”作为年份)时,结果是 2016 年,而不是第一行/最后一行的数量。
【解决方案2】:

如果值已经分组,您可以使用以下内容查找第一个 Row 出现

=MATCH("Bats",A:A,0)

这可以找到最后一行出现

=(MATCH("Bats",A:A,0)+(COUNTIF(A:A,"Bats"))-1)    

并将“蝙蝠”替换为您要查找的每个不同的值。

【讨论】:

  • 啊,谢谢 - 我正在寻找一种 VBA 方式来做到这一点(应该更清楚),但已经弄清楚了。
  • 没问题,我的错误,显然错过了 VBA 注释 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2022-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多