我有包含记录的数据表。 每条记录在 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 存储)确实可以找到所有记录!哈??
谢谢, 克里斯托夫
我认为,您可以直接检查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