微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VBA 如何查找完全匹配?升序父/子列表

如何解决VBA 如何查找完全匹配?升序父/子列表

我遇到了一个我不知道如何解决的问题。

文字表达时非常简单,但通常我正在尝试编写一个代码,该代码将通过“J”列从下到上(Z 到 A)并查找当前活动单元格减去右至并包括一个分隔符。因此,在逻辑字符串中,它将按如下方式遍历单元格:

当前活动单元格包含:1.2.3

(我们用分隔符“.”去掉右侧,留下 1.2 并搜索始终只有一个实例的完全匹配)

一个活动单元格包含:1.2 (我们用分隔符“.”去掉右侧,留下 1 并搜索始终只有一个实例的完全匹配项)

并且这种情况一直持续到在列“J”中没有下一个具有完全匹配内容的单元格

此时,最上面的单元格列“C”内容的单元格将被复制到第一个单元格列“C”,并且循环将向上移动一行以重新开始循环直到“J2”。

换句话说,有一个 SOLIDWORKS 项目编号。我需要找到每个子级的最上层父级并将内容从分支根传递给子级的层次树列表。

下面是一些图片,可以更好地理解这个概念: 这就是我在上面的文字中解释的。 https://i.stack.imgur.com/fLYgg.png

所以你看,按照上面解释的逻辑,我需要将“800”传递给同一列第 3 行,循环从下到上开始。可能有数千个分支和父级,所以这个逻辑是我能想到的最好的。

到目前为止,我得到了这个:

Dim last_row As Long
last_row = Cells(Rows.Count,"J").End(xlUp).Row

For i = 2 To last_row
    current_index = Split(Cells(i,10).Value,".")(0)
    left_column = Cells(i,3).Value
    For j = current_index To last_row
        nestled_index = Split(Cells(j,".")(0)
        If current_index = nestled_index Then
            Cells(j,3).Value = left_column
        End If
    Next j
Next I

据我所知,它还寻找搜索值的部分匹配,但我需要一个完全匹配。希望你们能帮助我解决这个问题并帮助我学习 VBA。

一个实际的 excel 工作簿示例,在“B”列中填充了预期值: https://easyupload.io/33dbly

解决方法

这个怎么样:

INFO_CARD_ID       DOCUMENT_NUM  REVISION_NM
---------------------------------------------
UJ3P25HO3JBPLJZ2HU DOC1          05
JWQ5TCIV4JC2BCQ4C5 DOC2          05

请注意,它在对象引用或整体优雅方面不是很干净,但应该可以。

编辑:好的,我将保留上面美味复杂的解决方案作为后代的见证。显然这行不通,因为它假设始终存在头节点,但事实并非如此。但是提供了一个非常简单的解决方案,它依赖于数据集似乎是有序的这一事实。

Dim last_row As Long: last_row = Cells(Rows.Count,"J").End(xlUp).Row
Dim indexes as variant
Dim i as long,j as long,k as long
Dim index as string
Dim d as Object: set d = CreateObject("Scripting.Dictionary")

For i = 2 To last_row
    d.Add Cells(i,10).Text,Cells(i,3).Text
Next i

For i = 2 To last_row
    indexes = Split(Cells(i,10).Value,".")
    For j = 0 to Ubound(indexes)
        index = ""
        For k = 0 to j    
            index = index & indexes(k) & "."
        Next k
        index = left(index,len(index)-1)
        If d.Exists(index) then 
            Cells(i,3) = d(index)
            Exit For
        End if
    Next j
Next i

请注意,第 45 行的预期结果是 001,但这与从 207 开始的最低节点不符,所以我的结果与预期不同,但我会说你的预期不正确(或者你也混淆了逻辑很多)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。