Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 10478|回复: 31

如何查找父子关系

[复制链接]
发表于 2015-9-15 11:16 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2015-9-15 17:44 编辑

QQ截图20150915173854.jpg
1.rar (18.4 KB, 下载次数: 15)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-9-15 13:47 | 显示全部楼层
查父子关系得找娃他妈,要不然只有验DNA
玩笑话!

这是考数据结构和算法吗?到那里面查查树的遍列
回复

使用道具 举报

 楼主| 发表于 2015-9-15 15:02 来自手机 | 显示全部楼层
上清宫主 发表于 2015-9-15 13:47
查父子关系得找娃他妈,要不然只有验DNA
玩笑话!


只是想把这种题整理一下,以后好解决同类问题。对于这类问题,怎样的思路比较合理,如果不是碰巧想到一个方法,自己对此,也是比较手忙脚乱,无从下手的。。。。
回复

使用道具 举报

发表于 2015-9-15 17:12 | 显示全部楼层
有子必有父,找到父,父变子。找不到父loop
回复

使用道具 举报

 楼主| 发表于 2015-9-15 17:16 | 显示全部楼层
pengyx 发表于 2015-9-15 17:12
有子必有父,找到父,父变子。找不到父loop

谢谢 pengyx

父变子,不大懂。。。。
找不到父跳出,是对于错误的情况的处理么?
回复

使用道具 举报

发表于 2015-9-16 08:41 | 显示全部楼层
没看懂,等以后水平提高了再回来看看,先收藏了再说{:35:}
回复

使用道具 举报

发表于 2015-9-16 13:43 | 显示全部楼层
爱疯 发表于 2015-9-15 17:16
谢谢 pengyx!

父变子,不大懂。。。。

Sub pengyx()
rw = [a65536].End(3).Row
rz = Range("a2:a" & rw)
rf = Range("b2:b" & rw)
ReDim ar(1 To UBound(rz), 1 To 1)
For i = 1 To UBound(rz)
    s = rf(i, 1)
    ar(i, 1) = rz(i, 1)
    While s <> ""
        For j = 1 To UBound(rz)
            If rz(j, 1) = s Then
                ar(i, 1) = rz(j, 1) & ">" & ar(i, 1)
                s = rf(j, 1)
                Exit For
            End If
        Next
        If j = UBound(rz) Then s = ""
    Wend
Next
Range("f2").Resize(UBound(rz), 1) = ar
End Sub
几句代码,真没必要定义变量,你把字母用完了,我都找不到用的了

11.zip

42.16 KB, 下载次数: 20

评分

参与人数 1 +10 金币 +10 收起 理由
爱疯 + 10 + 10 学习!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-9-16 17:34 | 显示全部楼层
本帖最后由 爱疯 于 2016-9-9 23:44 编辑
pengyx 发表于 2015-9-16 13:43
Sub pengyx()
rw = [a65536].End(3).Row
rz = Range("a2:a" & rw)

Sub pengyx()
    rw = [a65536].End(3).Row
    rz = Range("a2:a" & rw)
    rf = Range("b2:b" & rw)
    ReDim ar(1 To UBound(rz), 1 To 1)

    '有子必有父:基于"若无父,子是(顶层的)父"的规则。
    For i = 1 To UBound(rz)
        s = rf(i, 1)
        '提前写入,很可能重写。
        ar(i, 1) = rz(i, 1)

        '若变量s<>"",则循环
        While s <> ""
            For j = 1 To UBound(rz)
                '父如果同时也是子
                If rz(j, 1) = s Then
                    '父ar(i, 1)变为子,并将之前统计累计到ar(i,1):父的父 > 父
                    ar(i, 1) = rz(j, 1) & ">" & ar(i, 1)
                    '指定变量s = 父的父
                    s = rf(j, 1)
                    Exit For
                End If
            Next
            '强制j不出错
            If j = UBound(rz) Then s = ""
        Wend
    Next
    Range("f2").Resize(UBound(rz), 1) = ar
End Sub
8.rar (40.29 KB, 下载次数: 18)
回复

使用道具 举报

发表于 2015-9-18 07:41 | 显示全部楼层
我也写了个查找代码,因为是新手,写的不好,见笑
我用倒查法,For 循环嵌套 Do 再嵌套 For,效果挺好的
  1. Sub findDad()
  2. Dim guanXi As String, Fu As String, Zi As String
  3. For x = Range("A65536").End(xlUp).Row To 2 Step -1
  4. guanXi = ""
  5. Zi = Cells(x, 1)
  6. Fu = Cells(x, 2)
  7. If Fu <> "" Then
  8. Do
  9. If guanXi = "" Then guanXi = Zi & ">" & Fu Else guanXi = guanXi & ">" & Fu
  10. For i = 2 To x
  11. If Cells(i, 1) = Fu Then Fu = Cells(i, 2): Exit For
  12. If Fu = "" Then Exit Do
  13. Next
  14. Loop
  15. Else
  16. guanXi = Zi
  17. End If
  18. Cells(x, 3) = guanXi
  19. Next
  20. End Sub
复制代码

评分

参与人数 1 +10 金币 +10 收起 理由
爱疯 + 10 + 10 学习!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-9-18 10:06 | 显示全部楼层
本帖最后由 爱疯 于 2015-9-18 10:18 编辑

QQ截图20150918100152.jpg


2.jpg


只发现这样一个错误,9楼会死循环。
For i = 2 To x
改为
For i = 2 To Range("A65536").End(xlUp).Row
就好了,其它修改不重要,注释是自己的理解。


Sub findDad()
    Dim A, guanXi As String, Fu As String, Zi As String, i, j
    A = Range("A1:c" & Cells(Rows.Count, 1).End(3).Row)
   
    For i = 2 To UBound(A)
        guanXi = "": Zi = A(i, 1): Fu = A(i, 2)

        If Fu <> "" Then
            Do Until Fu = ""
                '2)记录关系:或 父>子,或 父>关系
                If guanXi = "" Then guanXi = Fu & ">" & Zi Else guanXi = Fu & ">" & guanXi
               
                '3)找爷爷
                For j = 2 To UBound(A)
                    If A(j, 1) = Fu Then Fu = A(j, 2): Exit For
                Next
            Loop
        Else
            '1)父是空,最简单,关系就是子
            guanXi = Zi
        End If

        A(i, 3) = guanXi
    Next
   
    [a1].Resize(i - 1, 3) = A
End Sub
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-4 03:41 , Processed in 0.686972 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表