Excel精英培训网

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

[已解决]自动生成文件目录时,若地址字符大于255时出错

[复制链接]
发表于 2013-12-15 15:10 | 显示全部楼层 |阅读模式
本帖最后由 dshilunls 于 2013-12-16 11:36 编辑

各位老大:用EXCEL产生文件的目录清单,从网站中找了高手制作的EXCEL表格,附件是比较适合我需求的类型(我要选中文件夹内的所有文件及文件夹清单,但不要子文件夹内的内容),但使用中发现:文件地址字符大于255个时,该表格会出错。
请教各位老大,如何修改才能使目录产生不受地址字符数的影响(我可以不需要在目录表中产生文件链接)?
    多谢多谢!

出错时调试页面如下:(共2个模块)
第一个模块:A通用模块
Option Explicit
Public MyPath AsString
PublicFilesList() As String, PathsList() As String
Public FilesNumAs Long, PathsNum As Long
Public SubGetLists(MyPath, PathsList, PathsNum, FilesList, FilesNum)
'该通用程序可提取当前文件所在目录下的所有目录名和文件名
'并提取所有文件夹名称至PathsList()数组,所有文件名至FilesList()数组
    Dim MyName As String
    Dim i As Long, j As Long
   
    '确定文件夹及文件的数目
    MyName = Dir(MyPath, vbDirectory)   ' 找寻第一项。
    PathsNum = 0
    FilesNum = 0
    Do While MyName <> ""    ' 开始循环。
        ' 跳过当前的目录及上层目录。
        If MyName <> "." AndMyName <> ".." Then
            ' 使用位比较来确定 MyName 代表一目录。
            If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectoryThen
                PathsNum = PathsNum + 1
                ReDim Preserve PathsList(1 ToPathsNum)
                PathsList(PathsNum) = MyName
            Else
                FilesNum = FilesNum + 1
                ReDim Preserve FilesList(1 ToFilesNum)
                FilesList(FilesNum) = MyName
            End If
        End If
        MyName = Dir    ' 查找下一个目录。
    Loop
  
End Sub
Public FunctionSplitPath(FullPath As String, ResultFlag As Integer) As String
'获取路径、文件名、扩展名
'ResultFlag=0  获取路径
'ResultFlag=1  获取文件名
'ResultFlag=2  获取扩展名
    Dim SplitPos As Integer, DotPos As Integer
   
    SplitPos = InStrRev(FullPath,"\")
    DotPos = InStrRev(FullPath, ".")
    Select Case ResultFlag
        Case 0
            SplitPath = Left(FullPath, SplitPos- 1)
        Case 1
            If DotPos = 0 Then DotPos =Len(FullPath) + 1
            SplitPath = Mid(FullPath, SplitPos+ 1, DotPos - SplitPos - 1)
        Case 2
            If DotPos = 0 Then DotPos =Len(FullPath)
            SplitPath = Mid(FullPath, DotPos)
        Case Else
            Err.Raise vbObjectError + 1,"SplitPath Function", "Invalid Parameter!"
    End Select
   
End Function


第二个模块:B自动生成表格
Option Explicit
Sub AutoWriteRecord()
    Dim ThisWorkbook As Workbook, ThisWorksheet As Worksheet
    Dim CreatingRange As Range, DataRange As Range, CreatingArray() As Variant
    Dim i As Long, j As Long, k As Long, TotalNum As Long
    Dim MyFormat As String
   
     '设置屏幕不可更新,该语句可节约部分程序运行的时间
    Application.ScreenUpdating = False
    '设置Excel中的公式计算为手动重算,因该工作簿数据计算较多,可节约大量的程序运行时间,经笔者测试大约节约100倍左右
    Application.Calculation = xlManual
   
    '从B2获取文件夹目录,若没有目录,则取当前活动工作薄所在目录,并写入到B2单元格
    Set ThisWorkbook = ActiveWorkbook
    Set ThisWorksheet = ThisWorkbook.Worksheets("一览表")
    If ThisWorksheet.Range("B2").Value <> "" Then
        MyPath = ThisWorksheet.Range("B2").Value
    Else
        MyPath = ThisWorkbook.Path
        ThisWorksheet.Range("B2").Value = MyPath
    End If
    If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"
   
    '调用子程,返回目录下的所有文件夹及文件列表
    Call GetLists(MyPath, PathsList, PathsNum, FilesList, FilesNum)
   
    '生成表格数据
    TotalNum = Application.WorksheetFunction.Max(PathsNum + FilesNum, 1)
    ReDim CreatingArray(1 To TotalNum, 1 To 4)
    Set CreatingRange = Range("A4").Resize(TotalNum, 4)
    Set DataRange = Application.Intersect(ThisWorksheet.Rows("4:1000"), ThisWorksheet.UsedRange)
    DataRange.ClearContents
    k = 0
    MyFormat = ThisWorksheet.Range("E2").Value
    Select Case MyFormat
        Case "所有项目"
            For i = 1 To PathsNum
                k = k + 1
                CreatingArray(k, 1) = k
                CreatingArray(k, 2) = "文件夹"
                CreatingArray(k, 3) = PathsList(i)
                CreatingArray(k, 4) = "=hyperlink(" & Chr(34) & MyPath & PathsList(i) & Chr(34) & _
                                                    "," & Chr(34) & "查看文件夹" & Chr(34) & ")"
            Next i
            For j = 1 To FilesNum
                k = k + 1
                CreatingArray(k, 1) = k
                CreatingArray(k, 2) = "文件"
                CreatingArray(k, 3) = FilesList(j)
                CreatingArray(k, 4) = "=hyperlink(" & Chr(34) & MyPath & FilesList(j) & Chr(34) & _
                                                    "," & Chr(34) & "查看文件" & Chr(34) & ")"
            Next j
        Case "文件夹"
            For i = 1 To PathsNum
                k = k + 1
                CreatingArray(k, 1) = k
                CreatingArray(k, 2) = "文件夹"
                CreatingArray(k, 3) = PathsList(i)
                CreatingArray(k, 4) = "=hyperlink(" & Chr(34) & MyPath & PathsList(i) & Chr(34) & _
                                                    "," & Chr(34) & "查看文件夹" & Chr(34) & ")"
            Next i
        Case "文件"
            For j = 1 To FilesNum
                k = k + 1
                CreatingArray(k, 1) = k
                CreatingArray(k, 2) = "文件"
                CreatingArray(k, 3) = FilesList(j)
                CreatingArray(k, 4) = "=hyperlink(" & Chr(34) & MyPath & FilesList(j) & Chr(34) & _
                                                    "," & Chr(34) & "查看文件" & Chr(34) & ")"
            Next j
        Case Else
            For j = 1 To FilesNum
                If MyFormat = Right(FilesList(j), Len(MyFormat)) Then
                    k = k + 1
                    CreatingArray(k, 1) = k
                    CreatingArray(k, 2) = "文件"
                    CreatingArray(k, 3) = Left(FilesList(j), Len(FilesList(j)) - Len(MyFormat))
                    CreatingArray(k, 4) = "=hyperlink(" & Chr(34) & MyPath & FilesList(j) & Chr(34) & _
                                                    "," & Chr(34) & "查看文件" & Chr(34) & ")"
                End If
            Next j
        End Select
    CreatingRange = CreatingArray
    '设置“屏幕更新”可用及“公式计算”选项为自动重算
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic
   
End Sub
Sub AutoCreatList()
    Dim ThisWorkbook As Workbook, ThisWorksheet As Worksheet
    Dim FileForm As String
    Dim i As Integer, j As Integer, k As Integer
   
     '设置屏幕不可更新,该语句可节约部分程序运行的时间
    Application.ScreenUpdating = False
    '设置Excel中的公式计算为手动重算,因该工作簿数据计算较多,可节约大量的程序运行时间,经笔者测试大约节约100倍左右
    Application.Calculation = xlManual
   
    '从B2获取文件夹目录,若没有目录,则取当前活动工作薄所在目录,并写入到B2单元格
    Set ThisWorkbook = ActiveWorkbook
    Set ThisWorksheet = ThisWorkbook.Worksheets("一览表")
    If ThisWorksheet.Range("B2").Value <> "" Then
        MyPath = ThisWorksheet.Range("B2").Value
    Else
        MyPath = ThisWorkbook.Path
        ThisWorksheet.Range("B2").Value = MyPath
    End If
    If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"
   
    '调用子程,返回目录下的所有文件夹及文件列表
    Call GetLists(MyPath, PathsList, PathsNum, FilesList, FilesNum)
    FileForm = "所有项目,文件夹,文件"
    k = 0
    For i = 1 To UBound(FilesList)
        For j = i To UBound(FilesList)
            If SplitPath(FilesList(i), 2) = SplitPath(FilesList(j), 2) Then k = k + 1
            If k = 2 Then GoTo 100
        Next j
       If k = 1 Then FileForm = FileForm & "," & SplitPath(FilesList(i), 2)
100:
    k = 0
    Next i
   
    With ThisWorksheet.Range("E2").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=FileForm
    End With
   
   
    '设置“屏幕更新”可用及“公式计算”选项为自动重算
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic
End Sub
最佳答案
2013-12-16 21:47
本帖最后由 爱疯 于 2013-12-16 22:36 编辑

http://www.excelpx.com/thread-315632-1-1.html

不知道行不行

通用统计表.rar

30.56 KB, 下载次数: 9

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-12-15 22:31 来自手机 | 显示全部楼层
手机看不了附件。猜

让shell 函数执行dos命令,比如

dir>c:\a.txt

回复

使用道具 举报

 楼主| 发表于 2013-12-16 11:18 | 显示全部楼层
爱疯 发表于 2013-12-15 22:31
手机看不了附件。猜

让shell 函数执行dos命令,比如

爱疯版主:帮忙在电脑上看看吧。感觉这目录统计表做得蛮好的,但就是链接地址大于255后就出错。我可以不需要链接文件。但要在EXCEL工作表里解决,因为我还要用此统计表的数据链接给其他用。多谢了!
回复

使用道具 举报

发表于 2013-12-16 11:59 来自手机 | 显示全部楼层
链接地址大于255后就出错。

不明白这是什么意思,有出错的截图吗?

回复

使用道具 举报

 楼主| 发表于 2013-12-16 12:06 | 显示全部楼层
爱疯 发表于 2013-12-16 11:59
链接地址大于255后就出错。

不明白这是什么意思,有出错的截图吗?

因是在单位管理文件夹下工作,链接地址很长,
Z:\项目运作\2010-东莞-东莞松山湖阳光保险集团南方后援中心\子项01-1号办公楼,2号配套倒班宿舍,3号配套倒班宿舍,地下室一\00-成品归档及管理文件\03-施工图归档\00-全套最新施工图归档@实时更新@\02结施归档\结施 S1-01`1号办公楼结构设计总说明(一)'A1^V2.0134256789012@.dwg
如文件是放在红色文件夹下,就出错了。但若把文件名称减少几位,就可以。我试验了很多次,链接地址过长就会出错。
出错提示如下:

出错时的提示框

出错时的提示框
回复

使用道具 举报

 楼主| 发表于 2013-12-16 12:33 | 显示全部楼层
爱疯 发表于 2013-12-16 11:59
链接地址大于255后就出错。

不明白这是什么意思,有出错的截图吗?

爱疯版主:你可以把附件的文件解压后存在E盘下,就可以测试了。
当用下面地址时,就出错:
E:\直属部所共享区\时代建筑设计所\项目运作\2010-东莞-东莞阳光保险\子项01-1号办公楼,2号配套倒班宿舍,3号配套倒班宿舍,地下室一\00-成品归档\03-施工图归档\00-全套最新施工图归档@实时更新@\02结施归档
但用上一层地址就ok:
E:\直属部所共享区\时代建筑设计所\项目运作\2010-东莞-东莞阳光保险\子项01-1号办公楼,2号配套倒班宿舍,3号配套倒班宿舍,地下室一\00-成品归档\03-施工图归档\00-全套最新施工图归档@实时更新@\

我自己试了很久,原因应该就是文件存放地址过长后(不一定是255位,但应与字符过多有关),就出错。
苦恼啊。自己不会弄,只有请大侠帮忙了。

直属部所共享区.rar

152.52 KB, 下载次数: 4

试验文件

回复

使用道具 举报

发表于 2013-12-16 21:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 爱疯 于 2013-12-16 22:36 编辑

http://www.excelpx.com/thread-315632-1-1.html

不知道行不行
回复

使用道具 举报

 楼主| 发表于 2013-12-17 10:21 | 显示全部楼层
爱疯 发表于 2013-12-16 21:47
http://www.excelpx.com/thread-315632-1-1.html

不知道行不行

太感谢爱疯版主了!我试过了,完全满足我的使用要求!
解决我这大问题了

另提醒有同类需要(按指定路径查找文件及文件夹,自动生成excel文件目录)的兄弟们,
见本帖7楼爱疯版主提供的链接!
再次感谢爱疯版主!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 04:04 , Processed in 0.214288 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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