ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-6-4 21:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:递归
老是觉得循环一次RST就可以,就是办不到

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-6-4 22:10 | 显示全部楼层
QUOTE:
以下是引用丸究阵引在2008-6-4 21:57:54的发言:
老是觉得循环一次RST就可以,就是办不到

单纯的循环是做不好树形结构的,

TA的精华主题

TA的得分主题

发表于 2008-6-4 22:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用彭希仁在2008-6-4 22:10:57的发言:

单纯的循环是做不好树形结构的,

我是指我的附件内问题!

TA的精华主题

TA的得分主题

发表于 2008-6-5 11:16 | 显示全部楼层
QUOTE:
以下是引用丸究阵引在2008-6-4 22:13:47的发言:

我是指我的附件内问题!

大白话:这种问题用excel做是吃力不讨好。最晕的感觉就是从表中要查找id与gid的关系。如果项目有成千上万的话,那就别做了。单就输入数据就会找不准对应的id号,要出人命的。而用关系型数据库解决这类问题,可以说是轻而易举,请看下图中的数据查询按钮以后出现的树状明细表,一句代码都不需要。而第一个窗体中显示的有多少多少项,主模块也就十几句。

G6ISz81i.rar (23.16 KB, 下载次数: 33)


[此贴子已经被作者于2008-6-7 7:19:09编辑过]

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

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

R2iQg1sB.rar

26.45 KB, 下载次数: 45

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

TA的精华主题

TA的得分主题

发表于 2008-6-5 11:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

衷心谢谢 sgrshh29

原工程是用 vb+mdb 作的 ,excel文件只是为了便于说明!

算法思路基本一致,不过我不喜欢递归,特别是记录太大,堆是无法控制的。

Public Sub 获取子目录()
      s = GetListId(22, GetDcyGidId([A2:A35]))
End Sub

'搜索关于某Gid下所有占用的id列表
Private Function GetListId(strIndex As String, ByVal dcy As Dictionary) As String
    
     Dim i As Integer, blnX As Boolean
     Dim strFirst As String, strNew As String, strLast As String
     Dim arrTemp As Variant, strTemp As String
    
     strFirst = dcy(strIndex)
     arrTemp = Split(strFirst, ",")
   
100
    
     For i = 0 To UBound(arrTemp)
         
          strTemp = dcy(CStr(arrTemp(i)))
         
          If strTemp <> "" Then
               strNew = strTemp & "," & strNew
               blnX = True '标示有新内容
          End If
         
     Next
    
     If blnX Then '标示有新内容
          strLast = strLast & strNew '保存字符串
          arrTemp = Split(Left(strNew, Len(strNew) - 1), ",") '分解成数组
          strNew = "": blnX = False '清空
          GoTo 100 '重新读取Split(strNew, ",")
     End If
    
     GetListId = strLast & strFirst
    
End Function

'----------------------------------------------------------------------
Private Function GetDcyGidId(ByVal rngs As Range) As Dictionary

     Dim dcy As New Dictionary
     Dim strId As String, strGid As String
     Dim r1 As Range

     For Each r1 In rngs

          strGid = r1.Offset(0, 1).Value 'gid
          strId = r1.Value 'id

          If strGid = "" Then GoTo 100 '排除空白

          If Not dcy.Exists(strGid) Then
               dcy.Add strGid, strId
          Else
               dcy(strGid) = dcy(strGid) & "," & strId
          End If
100

     Next
    
     Set GetDcyGidId = dcy
    
End Function

使用递归:


Public Sub 获取子目录()
 
     Dim dcyGidId As Dictionary
    
     Set dcyGidId = GetDcyGidId([A2:A35])
    
     [l4] = GetChildListId(dcyGidId, dcyGidId(CStr(23))) & dcyGidId(CStr(23))
 
End Sub

Private Function GetChildListId(ByVal dcyGidId As Dictionary, ByVal strIds As String) As String
    
     Dim i As Integer, blnX As Boolean
     Dim strNew As String, strTarget As String
     Dim arrTemp As Variant, strTemp As String
    
     arrTemp = Split(strIds, "@")
    
     For i = 0 To UBound(arrTemp)
         
          strTemp = dcyGidId(CStr(arrTemp(i)))
         
          If strTemp <> "" Then
               strNew = strTemp & "@" & strNew
               blnX = True '标示有新内容
          End If
         
     Next
    
     If blnX Then strTarget = GetChildListId(dcyGidId, Left(strNew, Len(strNew) - 1)) & strNew
     '标示有新内容
   
     GetChildListId = strTarget
    
End Function

'----------------------------------------------------------------------
Private Function GetDcyGidId(ByVal rngs As Range) As Dictionary

     Dim dcy As New Dictionary
     Dim strId As String, strGid As String
     Dim r1 As Range

     For Each r1 In rngs

          strGid = r1.Offset(0, 1).Value 'gid
          strId = r1.Value 'id

          If strGid = "" Then GoTo 100 '排除空白

          If Not dcy.Exists(strGid) Then
               dcy.Add strGid, strId
          Else
               dcy(strGid) = dcy(strGid) & "@" & strId
          End If
100

     Next
    
     Set GetDcyGidId = dcy
    
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-6-5 12:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

递归本身就是树形结构,不用递归何来树形?

TA的精华主题

TA的得分主题

发表于 2008-6-5 12:52 | 显示全部楼层
QUOTE:
以下是引用彭希仁在2008-6-5 12:10:29的发言:

递归本身就是树形结构,不用递归何来树形?

呵呵!帖子的主题可就是递归,竟不知道递归为何物???

讲讲:递归是调用它本身过程的处理,类似 类!可否明白了?

TA的精华主题

TA的得分主题

发表于 2008-6-5 14:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

支持一下,好算法

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-6-5 14:55 | 显示全部楼层

原工程是用 vb+mdb 作的 ,excel文件只是为了便于说明!

算法思路基本一致,不过我不喜欢递归,特别是记录太大,堆是无法控制的。

不好意思,我的意思是说你不喜欢用递归,但要做好树形结构最好递归,特别是记录集太大.而我们只需动态的查询某一个分枝,就能体现递归的优越性.要不然目录可就不好动态生成了.

TA的精华主题

TA的得分主题

发表于 2008-6-6 11:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

递归的本质就是一种循环,他的缺陷在于每递归一次,就会将代码的副本加载到内存,如果一个变量为4字节,10次就是4*10。如果无法判断递归的极限,就象座着没底的轿。

至于树形结构,也没必要非得用递归,当然那种方法好,就仁者见仁,智者见智了!

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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