【问题标题】:.Find method not searching in order.Find方法不按顺序搜索
【发布时间】:2018-07-20 20:16:44
【问题描述】:

谁能解释为什么D2 中的字符串在第一个循环中被乱序构建?

这只发生在第一个搜索值Dom 上。其余字符串按它们出现的顺序构建(请参阅Column B)。我尝试添加SearchDirection:= xlNext,但输出保持不变withwithout 那段代码。

在照片中,Column A:B 是原始数据,Column C:D 是宏的输出。

有问题的单元格是D2。它应该显示USD/EUR/GBP 而不是EUR/GBP/USD

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim FoundName As Range, SearchRange As Range, Names As Range, Name As Range
Dim MyString As String, i As Long

ws.Range("A1:A" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ws.Range("C1"), Unique:=True

Set SearchRange = ws.Range("A2:A" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row)
Set Names = ws.Range("C2:C" & ws.Range("C" & ws.Rows.Count).End(xlUp).Row)

For Each Name In Names
    Set FoundName = SearchRange.Find(Name, SearchDirection:=xlNext)
        For i = 1 To Application.WorksheetFunction.CountIf(SearchRange, Name)
            MyString = MyString & FoundName.Offset(, 1) & "/"
            Set FoundName = SearchRange.FindNext(FoundName)
        Next i
    Name.Offset(, 1) = Left(MyString, Len(MyString) - 1)
    MyString = ""
Next Name

【问题讨论】:

  • 您是否尝试将搜索范围更改为Set SearchRange = ws.Range("A1:A" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row)。我想我记得在某处读过Find 在范围内的第一个单元格之后 开始,所以从技术上讲,它开始在in second 单元格中搜索。
  • @Mistella 我没试过。完全有道理。可以在一小时左右测试 -
  • 非常好的米斯特拉和 urdearboy。我通常使用类似以下的东西,它一直有效:Set SearchRange = ws.Cells.Find(What:="whatever you want", After:=ws.Cells(Rows.Count, Columns.Count), SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=True) Set SearchRange = ws.Cells.FindNext(After:=SearchRange)
  • @Guest 这是我正在为其他人开发的解决方案,它最终成为一个很好的实践解决方案,因为我意识到这段代码系统地消除了 find 方法什么都不是的可能性(我是为什么没有通常与 .Find 关联的检查)
  • @pnuts 我没有感谢分享!将在以后的帖子中进行调整

标签: excel vba


【解决方案1】:

根据Microsoft documentation关于Range.Find方法,After参数为:

您希望在其后开始搜索的单元格。这对应于从用户界面进行搜索时活动单元格的位置。请注意,After 必须是范围内的单个单元格。请记住,搜索在此单元格之后开始;在方法返回到此单元格之前,不会搜索指定的单元格。 如果不指定此参数,则搜索从范围左上角的单元格开始

(强调我的)


在您的代码中,您设置要搜索的范围如下:

Set SearchRange = ws.Range("A2:A" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row)

这意味着实际上搜索的第一个单元格将是Range("A3")。有两种方法可以解决这个问题:

  1. 将搜索范围扩大到包括“A1”,因此默认开始是“A2”
  2. After 参数指定为区域中的最后一个单元格。因为搜索会在到达最后一个单元格后返回到第一个单元格。

在您的场景中,我相信最简单的解决方案是 (1)。这可以通过简单地调整你的代码行来完成:

Set SearchRange = ws.Range("A1:A" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row)

【讨论】:

  • 最简单的解决方案总是最好的。 +1 为我做我的研究大声笑我在我的故障排除工作中过于复杂了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
相关资源
最近更新 更多