。查找方法未按顺序搜索

时间:2018-07-20 20:16:45

标签: excel vba

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

这仅在第一个搜索值Dom中发生。其余字符串将按照它们出现的顺序进行构建(请参见Column B)。我添加了SearchDirection:= xlNext,但在 with without 的代码中,输出保持不变。

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

所讨论的单元格为D2。它应该显示USD/EUR/GBP而不是EUR/GBP/USD

enter image description here

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

1 个答案:

答案 0 :(得分:3)

根据Microsoft documentation关于Range.Find方法的说法, 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)