VBA Find 和 FindNext 无法匹配字符串(里面有 CR 或 LF)

问题描述 投票:0回答:1

我有包含记录的数据表。 每条记录在 A 列中都有一个标签代码 这个标签代码不是唯一的,它是记录的功能名称,1个功能项可以在表中拥有多个具有相同标签代码的记录

我需要一个宏函数来从具有给定标签代码的所有记录中获取某些信息。

合乎逻辑的方法是使用 Find 和 FindNext ,就像我已经做过很多次一样 但他的时间……根本行不通。我尝试了很多事情/变体..但仍然没有100%正常工作:有时找到1条记录,有时没有,有时找到几条,有时全部。

特别的事情是(这可能是原因):标签代码内部通常有一个 char(10) 。

参见下面的功能。该函数是从表本身调用的,kebelCeel 参数是记录行上的一个单元格。因此必须始终至少有 1 个匹配记录。 (如果标签代码为空,则代码假定这是一个错误,并且仅返回该行的信息,而不是寻找其他空标签代码)

    Function KabelTrajectInfo(kabelCell As Range) As String
    
    Dim rij As Integer
    
    rij = kabelCell.Row
    
    Dim KcellCol As New Collection
    Dim Kcell As Range
    Dim firstRow As Long
    Dim tagcode As String

    tagcode = kabelCell.EntireRow.Cells(1, 1).Text 'also tried with .Value and .Formula
    
    With Intersect(Sheets("Kabels").Range("A:A"), Sheets("Kabels").UsedRange)
        If tagcode = "" Then
            Set Kcell = kabelCell.EntireRow.Cells(1, 1)
        Else
            'find: also tried with lookin xlFormulas and xlFormulas2
            Set Kcell = .Find(What:=tagcode, _
                After:=.Cells(1, 1), LookIn:= _
                xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
                xlNext, MatchCase:=True, SearchFormat:=False)

            'strange: sometimes not found, so check with match: this ALWAYS finds the 1st matching row
            If Kcell Is Nothing Then 
                firstRow = Application.WorksheetFunction.Match(tagcode, .Cells, 0)
                If firstRow = 0 Then
                    Set Kcell = kabelCell.EntireRow.Cells(1, 1)
                Else
                    Set Kcell = Sheets("Kabels").Cells(firstRow, 1)
                End If
            End If
        End If
        firstRow = Kcell.Row
        
        While Not Kcell Is Nothing
            KcellCol.Add Item:=Kcell

            'initial logical solution with findnext: never finds the next one
            Set Kcell = .FindNext(Kcell)

            'backup solution with Find and own check to prevent loop: sometimes finds the other one, but often not all or not the last one
            If tagcode <> "" Then Set Kcell = .Find(What:=tagcode, After:=Kcell, LookIn:=xlValues, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
                xlNext, MatchCase:=True, SearchFormat:=False)
            If Not Kcell Is Nothing Then
                If Kcell.Row = firstRow Then Set Kcell = Nothing
            End If
        Wend
    End With
    
    For Each Kcell In KcellCol
    ... some code to create a tempStr
    Next Kcell

    KabelTrajectInfo = tempStr
End Function

我花了很多时间来尝试各种变体..但我放弃了,所以我向你讲话:有人知道我忽略了什么吗?或者这是字符串匹配中 char(10) 的问题?

注意:直接在 Excel 工作表中尝试查找/下一个(标签代码仍然从 VBA 存储)确实可以找到所有记录!哈??

谢谢, 克里斯托夫

excel vba string find
1个回答
0
投票

我认为,您可以直接检查UsedRange中的每个单元格,而不是依赖于嵌入特殊字符的

Find
FindNext
,这可能会很挑剔,例如:

   For Each cell In Intersect(ws.Range("A:A"), ws.UsedRange)
        ' Match the tagcode and handle CHAR(10)
        If Replace(cell.Text, vbLf, "") = Replace(tagcode, vbLf, "") Then
            KcellCol.Add cell
        End If
    Next cell
© www.soinside.com 2019 - 2024. All rights reserved.