ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

递归 搜索文件(搜索目录及子目录)

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-30 16:49 | 显示全部楼层
本帖已被收录到知识树中,索引项:递归
QUOTE:
以下是引用northwolves在2008-5-30 16:43:20的发言:

可用字典实现:

Sub macro1()
Dim arr, i, dic, d
Set dic = CreateObject("scripting.dictionary")
arr = [a1].CurrentRegion
ReDim brr(2 To UBound(arr))
For i = 2 To UBound(arr)
dic(arr(i, 2) & " ") = arr(i, 2)
If Not dic.exists(arr(i, 2)) Then
dic(arr(i, 1)) = " " & arr(i, 2) & " " & arr(i, 1)
Else
dic(arr(i, 1)) = dic(arr(i, 2)) & " " & arr(i, 1)
End If
For Each d In dic.keys
If d <> arr(i, 2) And dic(d) Like " " & arr(i, 1) & " #*" Then dic(d) = Replace(dic(d), " " & arr(i, 1) & " ", dic(arr(i, 1)) & " ")
Next
Next
Debug.Print Join(dic.items, vbCrLf)
End Sub

Returns:

23
 0 23 1
 0 23 2
11
 0 22 11 3
22
 0 22 4
 0 22 11 5
 0 22 6
 0 22 7
1
 0 23 1 8
 0 22 9
0
 0 10
 0 22 11
 0 22 12
 0 22 13
 0 22 14
26
 0 23 24 25 26 15
 0 23 24 25 26 16
 0 22 17
 0 23 24 25 26 18
 0 22 19
 0 22 20
 0 21
 0 22
 0 23
 0 23 24
24
 0 23 24 25
25
 0 23 24 25 26
 0 23 24 27

狼版的这个牵一发动全身,对于任意添加树枝可就不好办了.

[此贴子已经被作者于2008-5-30 16:50:16编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-30 17:02 | 显示全部楼层
QUOTE:
以下是引用丸究阵引在2008-5-30 16:44:28的发言:

仔细看了看,其实你的ID 、老父ID就是我的ID、GID。

实际应用中,有这两例数足够了。

之所以四列,主要是为了删除\修改\添加\查询数据方便,

当然如你所说只需老父的ID是可以,但数据量一大,老爸要找儿子还要一个个找一遍吗?为什么不可能直接找到位置来呢?

找兄弟也要一个个找一遍吗?

T6PTnbBs.rar (40.56 KB, 下载次数: 53)

TA的精华主题

TA的得分主题

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

狼版的这个牵一发动全身,对于任意添加树枝可就不好办了.


这个自然是这样。只有两列数据时,似乎没有很高效的办法。

标记各父节点,姐妹节点是一个不错的选择

TA的精华主题

TA的得分主题

发表于 2008-5-30 17:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
当然可以只设定一个类似fullpath属性的字段,结合节点的key属性,效率还是可以的

TA的精华主题

TA的得分主题

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

之所以四列,主要是为了删除\修改\添加\查询数据方便,

当然如你所说只需老父的ID是可以,但数据量一大,老爸要找儿子还要一个个找一遍吗?为什么不可能直接找到位置来呢?

找兄弟也要一个个找一遍吗?


要删除文件夹,就要知道其下所有的文件夹、文件ID(可能很多层),按你的这种组织方式,怎样获取?

TA的精华主题

TA的得分主题

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

TO:northwolves

谢谢!

您的那个算法好像不行!

TA的精华主题

TA的得分主题

发表于 2008-5-30 22:12 | 显示全部楼层

有了点灵感,把两种结合起来,把我的那个增加一列,记录下一级文件夹的ID,会不会好一些?

TA的精华主题

TA的得分主题

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

忘了说了,我做的那个为了避免查找的数据过于庞大,是将文件夹、文件放在两个表中。

TA的精华主题

TA的得分主题

发表于 2008-5-30 22:29 | 显示全部楼层
QUOTE:
以下是引用丸究阵引在2008-5-30 21:16:30的发言:

要删除文件夹,就要知道其下所有的文件夹、文件ID(可能很多层),按你的这种组织方式,怎样获取?

我上传的那个文件就是解决此问题!

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-31 08:07 | 显示全部楼层
QUOTE:
以下是引用丸究阵引在2008-5-30 22:29:11的发言:

我上传的那个文件就是解决此问题!

以下是引用彭希仁在2008-5-31 8:07:33的发言:

删除非常简单,去掉前一个对下一个的标识就可以了,如果删除一个目标下的所有内容,只需把老父ID中的长子去除,或标为无用.因为的他的读记录方式就是通过ID引导的,

当然也可以用递归的方式去删除,绝对是根据ID的引导直接找到子目录,不会做无用功.

当然我建意是只做标识,下次要添加记录,可以优先对已标识的无用记录进行覆盖.就行了.有点像硬盘的数据管理原理吧

[此贴子已经被作者于2008-5-31 8:11:14编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 10:31 , Processed in 0.038537 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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