ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 12777|回复: 15

[讨论]树形结构

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-5-30 11:22 | 显示全部楼层 |阅读模式

电脑的文件夹,家谱(生孩的关系),都是树形结构.以何种方式在EXCEL表达这种关系,以便于维护和查询呢,这就是我们所要讨论话题.我做了一个附件,有两个代码,初步满足了基本的要求,但由于第一次尝试考虑这个问题,必然存在众多的考虑不周不之处,所以拿出来晒晒.发挥大家的家聪明才智以便更加完善.谢谢

一、树形结构的存储格式

                 运行代码一可以将当前路径文件夹内的文件以树形结构的方式保存到EXCEL工作表中.

Public arr1, y%
Sub peng()
    ReDim arr1(1 To 65536, 1 To 5)
    y = 0
    Call xi(ActiveWorkbook.Path, 0)
    Cells(2, 1).Resize(y, 5) = arr1
End Sub

'a查询文件条件设置
'pt路径设置
Sub xi(pt, ByVal f)
    On Error GoTo ren
    Dim x%, i%, z%
    ReDim arr(1 To 100)
    dirs = Dir(pt & "\", vbDirectory)
    Do While dirs <> ""
        If dirs <> "." And dirs <> ".." Then
            x = x + 1
            If x > UBound(arr) Then ReDim Preserve arr(1 To UBound(arr) + 100)
            arr(x) = pt & "\" & dirs
        End If
        dirs = Dir
    Loop
    For i = 1 To UBound(arr)
        If arr(i) = "" Then Exit Sub
        y = y + 1
        arr1(y, 1) = arr(i)
        arr1(y, 2) = y  '自已ID
        arr1(y, 3) = f  '父ID
        If i = 1 And f > 0 Then arr1(f, 5) = y   '长子
        If z > 0 Then arr1(z, 4) = y   '弟
        z = y
        Call xi(arr(i), y)
    Next i
ren:
End Sub
Sub 显示()
UserForm1.Show (0)
End Sub

二、以直观的方式显示出来。
Public nodX As Node, arr
Private Sub UserForm_Initialize()
    TreeView1.LineStyle = 1
    TreeView1.Nodes.Clear
    arr = Cells(2, 1).Resize([a65536].End(xlUp).Row - 1, 5)
    Call peng(1)
End Sub
Sub peng(x)
  On Error GoTo ren
    If arr(x, 3) = 0 Then
        Set nodX = TreeView1.Nodes.Add(, , arr(x, 2) & "p", arr(x, 1))
    Else
        Set nodX = TreeView1.Nodes.Add(arr(x, 3) & "p", tvwChild, arr(x, 2) & "p", arr(x, 1))
    End If
    If arr(x, 4) > 0 Then Call peng(arr(x, 4))
    If arr(x, 5) > 0 Then Call peng(arr(x, 5))
ren:
End Sub

jLLK7AYo.rar (40.56 KB, 下载次数: 4095)


[此贴子已经被作者于2008-5-30 11:38:15编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-30 11:42 | 显示全部楼层

[讨论]树形结构

[讨论]树形结构

TA的精华主题

TA的得分主题

发表于 2008-5-30 12:09 | 显示全部楼层
调用WINDOWS自己的树形结构可以吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-30 14:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用realsoar在2008-5-30 12:09:58的发言:
调用WINDOWS自己的树形结构可以吗?
可以啊,但你要怎样才能以文档的形式存储到EXCEL中呢?

TA的精华主题

TA的得分主题

发表于 2008-5-30 16:48 | 显示全部楼层
这个treeview不需要把目录存到表中。也不要在打开窗体时全部加载(费时间),打开窗体时,只加载根目录,点击treeview节点时,再加载节点下一级的目录。

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-30 17:09 | 显示全部楼层
QUOTE:
以下是引用sgrshh29在2008-5-30 16:48:46的发言:
这个treeview不需要把目录存到表中。也不要在打开窗体时全部加载(费时间),打开窗体时,只加载根目录,点击treeview节点时,再加载节点下一级的目录。

你这主意不错,不过我样表中数据量太小的,为了简化工作,所以就没有这样做.

TA的精华主题

TA的得分主题

发表于 2008-5-30 17:25 | 显示全部楼层
QUOTE:
以下是引用彭希仁在2008-5-30 17:09:50的发言:

你这主意不错,不过我样表中数据量太小的,为了简化工作,所以就没有这样做.

以下建议供彭版参考:

因为文件和路径是会变化的(如目录和文件的增减,文件的移动等),所以把这个写入表中是没有什么实际意义的。只有动态加载的treeview才能反映实际目录的情况。

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-30 17:47 | 显示全部楼层
QUOTE:
以下是引用sgrshh29在2008-5-30 17:25:43的发言:

以下建议供彭版参考:

因为文件和路径是会变化的(如目录和文件的增减,文件的移动等),所以把这个写入表中是没有什么实际意义的。只有动态加载的treeview才能反映实际目录的情况。

我写这个贴子的意义主要是讨论以何种方式存储树形结构的数据,用目录和文件只是举个列子.

例如:要做一份电子档的祖谱,可能有上百代人,而且还会不断的增加人.

.

TA的精华主题

TA的得分主题

发表于 2008-5-30 19:15 | 显示全部楼层

一般情况下,比较实用的treeview界面要求能够做到:

1、可以拖拉项目,把节点通过拖拉移动到另一个节点下。

2、通过菜单(一般是右键菜单),可以增加或者删除任意一个节点下的项目。

3、要实现以上目标,一般需要有一个表格来保存数据,设计的好的话,大都数情况只要三个列就能达到目的。其中一个列记录节点内容,另外二个列分别表示这个节点的父节点与本身的id号码。也就是每个节点只要三个关键字就可以。

以上观点仅供参考。

[此贴子已经被作者于2008-5-30 19:57:55编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-30 20:44 | 显示全部楼层

三个字段确实是可以办到,只要父节点在子节点之前,对于建立treeview是一点问题都没有.

    我一直在考虑的问题是我们的硬盘是如何记录数据的,例如:前面的数据删除了,后面存入新数据必然会存到已删除的数据那里去,那样要保留父节点在子节点之前是不可能的,那样数据全部得移动一次.而且数据用得越多必然越乱.如何有效的利用硬盘空间,并且可以快速的查找到需要的内容,而不需遍历硬个硬盘呢?我想硬盘存储的原理必然有它的高明之处.

   不好意思想得太多了,不过这个问题自从我接触电脑就开始困扰我了.到现在我也还没明白过来.

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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 12:58 , Processed in 0.052893 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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