ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 怎样将指定路径的最末一级文件夹的全路径名录入数组

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-9 22:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
as42065300 发表于 2016-9-9 21:06
最后字典里装入的数组 brr  ,别搞错了。
这2个循环可以优化成一个自己搞下把

有时间的话,还请你帮我优化一下,因为数组和Dir的联合使用,我还一时吃不消,烦请你帮我搞定,让我慢慢消化、理解并以此为此在现阶段好模仿着使用。

TA的精华主题

TA的得分主题

发表于 2016-9-9 22:46 | 显示全部楼层
帮你优化了。不过我很少写递归代码可能不严谨你自己测试,我这边测试没问题
自己感觉怎么好用好理解就怎么用把。
  1. Private arr()
  2. Private i%
  3. Private Ts
  4. Sub FilPaht()
  5. Dim my$, mypaths$
  6. my = ThisWorkbook.PatH & ""  '我这里是指定的当前工作簿的路径。
  7. i = 1
  8. Erase arr: Ts = ""
  9. Qu my, 0
  10. Sheet1.Range("a1").Resize(UBound(arr)) = Application.WorksheetFunction.Transpose(arr)
  11. End Sub
  12. Private Sub Qu(my$, j%)
  13. Dim mypaths$, Mys$
  14. Mys = Dir(my, vbDirectory)
  15. Do While Mys <> ""
  16. If Mys <> "." And Mys <> ".." And Mys <> ThisWorkbook.Name Then
  17.     j = j + 1
  18.     ReDim Preserve arr(1 To j)
  19.     arr(j) = my & Mys & ""
  20. End If
  21.     Mys = Dir
  22. Loop
  23. If IsArray(Ts) = False Then Ts = arr: Erase arr: j = 0
  24. If i > UBound(Ts) Then Exit Sub
  25. my = Ts(i)
  26. If my <> "" Then
  27.     i = i + 1
  28.     Qu my, j
  29. Else
  30.     Exit Sub
  31. End If
  32. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-10 18:43 | 显示全部楼层
还是有个问题,这段代码的运行平台是:powerpoint,而非excel,所以中间数据的储存放在excel表格中这个思路可能行不通。
你前面的代码,我只做极少的修改,就运行的非常稳定。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-10 18:47 | 显示全部楼层
这句必须改动为其他的数组储存这个值:Sheet1.Range("a1").Resize(UBound(arr))

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-10 18:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
my 这个变量是否申明为pulic呢?因为你的两个过程都调用这个变量
我没有测试,但我感觉到这个肯定有问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-11 19:49 | 显示全部楼层
本帖最后由 weiyingde 于 2016-9-11 20:31 编辑
as42065300 发表于 2016-9-9 22:46
帮你优化了。不过我很少写递归代码可能不严谨你自己测试,我这边测试没问题
自己感觉怎么好用好理解就怎么 ...


昨天喝醉了,看了你帖子之后,未加深究,为感受奇妙,遗憾。
今天再把的代码融入的程序之中,不知什么原因,还是没有结果,而且还没你原先的代码来得快。
这段代码的运行平台是ppt。
整个过程如下:
Sub 随机插入视频()
Dim my$, mypaths$, brr()
my = "H:\Ofenused\精选音频\视频\"  
i = 1
Erase arr: Ts = ""
Qu my, 0
sj = Int(Rnd * UBound(arr))
ReDim brr(LBound(arr) To UBound(arr))
brr(sj) = Left(arr(sj), Len(arr(sj)) - 1)
For Each shp In ActivePresentation.SlideShowWindow.View.Slide.Shapes
    If shp.Type = 16 Then shp.Delete
Next
Set shp = Nothing
Set shps = ActivePresentation.SlideShowWindow.View.Slide.Shapes
With shps.AddMediaObject2(FileName:=brr(sj), Left:=l, Top:=t, Width:=w, Height:=h)
     Randomize
           .AutoShapeType = Choose(Int(Rnd * 9) + 1, 6, 9, 10, 132, 13, 28, 94, 95, 96)
        With .ThreeD
          If sj Mod 2 = 1 Then
          .SetThreeDFormat msoThreeD & (Int(Rnd * 20) + 1)
          Else
          .BevelTopType = 3
          .BevelTopDepth = 10
          .BevelBottomType = 3
          .BevelBottomDepth = 6
         End If
        End With
     End With
End Sub
Private Sub Qu(my$, j%)
Dim mypaths$, Mys$
Mys = Dir(my, vbDirectory)
Do While Mys <> ""
If Mys <> "." And Mys <> ".." And Mys <> ActivePresentation.Name Then
    j = j + 1
    ReDim Preserve arr(1 To j)
    arr(j) = my & Mys & "\"
End If
    Mys = Dir
Loop
If IsArray(Ts) = False Then Ts = arr: Erase arr: j = 0
If i > UBound(Ts) Then Exit Sub
my = Ts(i)
If my <> "" Then
    i = i + 1
    Qu my, j
Else
    Exit Sub
End If
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-11 19:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 weiyingde 于 2016-9-11 20:32 编辑

你的原始代码,在生成文件名是文件名后带了一个“\",我不得不做了改动,加了这一样几句
sj = Int(Rnd * UBound(arr))
ReDim brr(LBound(arr) To UBound(arr))
brr(sj) = Left(arr(sj), Len(arr(sj)) - 1)
没有弹出错误,而且显示正在插入视频,但就是不见插入的视频。不知是什么原因。
请大侠帮我一看:
(1)整个代码没有效果,原因何在?
(2)brr(sj) = Left(arr(sj), Len(arr(sj)) - 1) ,如果不用这句去掉“\”,该在你代码的什么地方修改
我尝试: arr(j) = my & Mys & "\"这句后的反斜杠,但是还是出问题。
请大侠帮我一看。

TA的精华主题

TA的得分主题

发表于 2016-9-11 21:40 | 显示全部楼层
本帖最后由 as42065300 于 2016-9-11 21:42 编辑

附件还没删直接给你吧!自己研究下.
解压后直接打开工作簿运行看结果懂了然后在像你的代码中套。
数组和递归过程都有。另外在递归过程中去掉了"\"这个符号
音视频.rar (21.97 KB, 下载次数: 7)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-11 21:46 | 显示全部楼层

你的这个,试试可行,只是arr(1 To 10000),你预设的上限1000,结果在随机的抽取的时候,却抽到了很多的空文件夹,因为该路径下只有6个文件夹,按照几率来说,抽到的几率就是6/10000,我把它去掉了,就没有结果。这个能设为arr ()  然后再通过redim preserve arr(1 to X)的形式设定吗?
请你帮我看一看

嵌入到程序中,整个过程是:
Sub 随机插入视频()
    Dim arr() As String, i&, k&
h = ActivePresentation.PageSetup.SlideHeight / 2
w = ActivePresentation.PageSetup.SlideWidth / 2
l = w / 4 + 10
t = h / 2
    arr(1) = "H:\Ofenused\精选音频\视频\" '请指定路径
    i = 1: k = 1
    Do While i <= k
        If arr(i) = "" Then Exit Do
        f = Dir(arr(i), vbDirectory)
        Do
            If InStr(f, ".") = 0 And f <> "" Then
                k = k + 1
                arr(k) = arr(i) & f & "\"
            End If
            f = Dir
        Loop Until f = ""
        i = i + 1
    Loop
zd = UBound(arr)
ipth = arr(Int(Rnd * zd))
MsgBox ipth
Set d = CreateObject("scripting.dictionary")
mn = Dir(ipth & "*.*")
  Do While mn <> ""
    d(ipth & mn) = ""
    mn = Dir
  Loop
k1 = d.keys
sj = Rnd * UBound(k1)
For Each shp In ActivePresentation.SlideShowWindow.View.Slide.Shapes
    If shp.Type = 16 Then shp.Delete
Next
Set shp = Nothing
Set shps = ActivePresentation.SlideShowWindow.View.Slide.Shapes
With shps.AddMediaObject2(FileName:=k1(sj), Left:=l, Top:=t, Width:=w, Height:=h)
     Randomize
           .AutoShapeType = Choose(Int(Rnd * 9) + 1, 6, 9, 10, 132, 13, 28, 94, 95, 96)
        With .ThreeD
          If sj Mod 2 = 1 Then
          .SetThreeDFormat msoThreeD & (Int(Rnd * 20) + 1)
          Else
          .BevelTopType = 3
          .BevelTopDepth = 10
          .BevelBottomType = 3
          .BevelBottomDepth = 6
         End If
        End With
     End With
End Sub

请帮我看看。

TA的精华主题

TA的得分主题

发表于 2016-9-11 21:47 | 显示全部楼层
Sub 视频文件()
    Dim cPath$, cFile$, Arr(), Brr(), Crr, i1%, i2%, m1%, m2%
    cPath = ActivePresentation.Path & "\"
    ReDim Arr(0 To 100), Brr(1 To 100)
    Arr(0) = cPath
    On Error Resume Next
    Do
        cFile = Dir(Arr(i1), 16)
        Do While cFile <> ""
            If cFile <> "." And cFile <> ".." Then
                m2 = GetAttr(Arr(i1) & cFile)
                If Err = 0 Then
                    If m2 = 16 Then
                        i2 = i2 + 1
                        If i2 > UBound(Arr) Then ReDim Preserve Arr(0 To UBound(Arr) + 100)
                        Arr(i2) = Arr(i1) & cFile & "\"
                    Else
                        Crr = Split(cFile, ".")
                        If "AVI,WMA,RMVB,RM,FLASH,MP4,MID,3GP" Like "*" & UCase(Crr(UBound(Crr))) & "*" Then
                            m1 = m1 + 1
                            If m1 > UBound(Brr) Then ReDim Preserve Brr(1 To UBound(Brr) + 100)
                            Brr(m1) = Arr(i1) & cFile
                        End If
                    End If
                Else
                    Err.Clear
                End If
            End If
            cFile = Dir
        Loop
        i1 = i1 + 1
    Loop Until i1 > i2
   
    '显示结果
    For i = 1 To m1
        Debug.Print Brr(i)
    Next
   
End Sub

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-6-3 07:44 , Processed in 0.039837 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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