ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

各位版主:更新文件名

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-8-2 09:18 | 显示全部楼层 |阅读模式

我的文件夹里有许多以数字命名的WORD文件,如何编写VBA程序,使它改变文件名称为打开WORD后第一行的中文名称,如一个文件本来名称为“工作出勤表”,但它却以20050112表示?

hN0ux6Bt.rar (120.06 KB, 下载次数: 19)

[此贴子已经被作者于2005-8-8 16:07:24编辑过]

TA的精华主题

TA的得分主题

发表于 2005-8-8 15:45 | 显示全部楼层

重命名好办,问题是,你的第一行是一个段落(还是文档标题),如果段落的话,会不会有空行?另外,如果是行(相当于行号1的第一行,则可能会有文件名中的非法字符,如何处理)

另外,如果如你所说,都是工作出勤表,如何处理?

请上传一个代表性的附件,问题是好办的,只是需要楼主交待清楚。

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-8-8 16:13 | 显示全部楼层

守柔:

你好,已上传附件,请帮忙看一下

第一行是文档标题,一般来说没有空格,如果文件名中有非法字符,去掉非法字符保存。如第一行相同的文档有好几个,可否取第二行为文件名?否则用相同的文件名,后面加序号。

如遇其他问题,可跳过这个文档的重命名,执行完程序后可以用手工更名!

TA的精华主题

TA的得分主题

发表于 2005-8-8 17:16 | 显示全部楼层

你的这些文档很不规范。

我粗粗做了一个,你在运行此代码前,请保存备份文件。

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-8-8 17:16:58 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '№ 0003^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Sub FileNewName() Dim FSO As Object, FDR As Object, F As Object, i As Variant, OldName As String, NewName As String Dim MyDoc As Object, MyFolder As String, A As Byte ' On Error Resume Next '忽略错误 MyFolder = "D:\2005881677775\8-8\"'此处修改你的文件夹名 Set FSO = CreateObject("Scripting.FileSystemObject") '创建计算机文件系统以向其访问 Set FDR = FSO.GetFolder(MyFolder) '指定其中访问的文件夹对象 Set F = FDR.Files '定义该文件夹中的所有文件集合 For Each i In F '在指定文件下的文件中循环 '创建一个后期绑定的DOC文件 Set MyDoc = CreateObject(MyFolder & i.Name) If Len(MyDoc.Paragraphs(1).Range.Text) = 1 Then NewName = Mid(MyDoc.Paragraphs(2).Range.Text, 1, Len(MyDoc.Paragraphs(2).Range.Text) - 2) Else NewName = Mid(MyDoc.Paragraphs(1).Range.Text, 1, Len(MyDoc.Paragraphs(1).Range.Text) - 2) End If '去除空格 NewName = VBA.Trim(NewName) MyDoc.Close False '关闭文件 '如果在文件夹中已存在该文件名,则加入当前时间秒数(以示区分) NewName = MyFolder & NewName If NewName = "" Then Else If Dir(NewName & ".Doc", vbDirectory) <> "" Then NewName = NewName & Timer NewName = NewName & ".Doc" '取得原有文件名 OldName = MyFolder & i.Name '取得新文件名 Name OldName As NewName End If Next i End Sub '----------------------

TA的精华主题

TA的得分主题

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

守柔:

上述代码基本上能满足我的要求,但有一个问题是:

当处理完一次后,即有重复的加上当前时间命名,没有重复的按正常命名后,它会再把没有重复的所有正常文件名加上当前的时间命名,然后又去掉时间,然后再加上时间,最后再去掉时间,但最后还是有部分本没有重复文件名的文件没有去掉时间。能否在处理完第一轮后就停止运行?

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-8-9 10:20 | 显示全部楼层

守柔:

您的代码基本上解决了我的问题,但还有一个小问题请教一下:

上述代码在处理完一次后,会把那些没有重复文件名的文件也在文件名后加上当前的时间,然后再去掉时间,然后再去掉时间保留真正的文件名,然后再在文件名后加上当前时间,然后再去掉时间,但最后仍有真正文件名不重复的部份文件名后保留时间。请问能否在第一次处理完后就停止运行?

TA的精华主题

TA的得分主题

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

守柔:

您好,上述代码基本上解决了问题,非常感谢你的劳动!在此表示崇高的敬意!

但有一个小问题:在处理完第一次后,实现了重复的文件名加上当前的时间以示区别,正常的文件名不加时间。但会出现第二次处理,即把没有重复的所有文件名也加上当前时间,第三次把所有不重复的真正文件名去掉时间,第四次又加上当前时间,然后又去掉,这样浪费的时间较长,而且最后的结果是不重复的真正文件名仍有部分保留了时间。能否在处理完第一轮后就停止运行?

[此贴子已经被作者于2005-8-9 10:33:20编辑过]

TA的精华主题

TA的得分主题

发表于 2005-8-10 09:28 | 显示全部楼层

请参运行以下二个代码,推荐使用第二个代码:

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-8-10 09:28:06 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '№ 0004^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Sub FileNewName() Dim FSO As Object, FDR As Object, F As Object, i As Variant, OldName As String, NewName As String Dim MyDoc As Object, MyFolder As String, A As Byte On Error Resume Next '忽略错误 MyFolder = "D:\2005881677775\8-8\" '此处修改你的文件夹名 Set FSO = CreateObject("Scripting.FileSystemObject") '创建计算机文件系统以向其访问 Set FDR = FSO.GetFolder(MyFolder) '指定其中访问的文件夹对象 Set F = FDR.Files '定义该文件夹中的所有文件集合 For Each i In F '在指定文件下的文件中循环 '创建一个后期绑定的DOC文件 Set MyDoc = CreateObject(MyFolder & i.Name) NewName = "" For A = 1 To 10 If Len(MyDoc.Paragraphs(A).Range.Text) > 1 Then Exit For Next If MyDoc.Paragraphs(A).Range.Information(wdWithInTable) Then NewName = Mid(MyDoc.Paragraphs(A).Range.Text, 1, Len(MyDoc.Paragraphs(A).Range.Text) - 2) Else NewName = Mid(MyDoc.Paragraphs(A).Range.Text, 1, Len(MyDoc.Paragraphs(A).Range.Text) - 1) End If MyDoc.Close False '关闭文件 Set MyDoc = Nothing NewName = VBA.Trim(NewName) NewName = MyFolder & NewName If Dir(NewName & ".Doc", vbDirectory) <> "" Then NewName = NewName & Timer End If NewName = NewName & ".Doc" '取得原有文件名 OldName = MyFolder & i.Name '取得新文件名 Name OldName As NewName Next i End Sub '---------------------- Sub Example2() '此代码功能为列出重命令指定文件夹中所有选取的WORD文件 Dim MyDialog As FileDialog, vrtSelectedItem As Variant, A As Byte, MyDoc As Document Dim OldName As String, NewName As String, MyRange As Range On Error Resume Next '忽略错误 '定义一个文件夹选取对话框 Set MyDialog = Application.FileDialog(msoFileDialogFilePicker) With MyDialog .Filters.Clear '清除所有文件筛选器中的项目 .Filters.Add "所有 WORD 文件", "*.doc", 1 '增加筛选器的项目为所有WORD文件 .AllowMultiSelect = True '允许多项选择 If .Show = -1 Then '确定 For Each vrtSelectedItem In .SelectedItems '在所有选取项目中循环 Set MyDoc = Documents.Open(FileName:=vrtSelectedItem, Visible:=False) OldName = vrtSelectedItem '取得原文件名 Debug.Print OldName For A = 1 To 10 '循环 Set MyRange = MyDoc.Paragraphs(A).Range If Len(MyRange.Text) > 1 Then Exit For '如果该段落文本长度大小于(非空白段落),则退出循环 Next If MyRange.Information(wdWithInTable) Then '如果在表格中,则去除最后两个字符 NewName = Mid(MyRange.Text, 1, Len(MyRange.Text) - 2) Else '如果为正常段落不在表格中,则去除最后一个段落标记 NewName = Mid(MyRange.Text, 1, Len(MyRange.Text) - 1) End If MyDoc.Close False '关闭文件 '去除空格 NewName = VBA.Trim(NewName) '重新定义新的文件名 NewName = .InitialFileName & NewName '如果已经存在该文件名,则加上时间数,加以区别 If Dir(NewName & ".Doc", vbDirectory) <> "" Then NewName = NewName & Timer '重命名该文件 Name OldName As NewName & ".Doc" Next End If End With End Sub '----------------------

[此贴子已经被作者于2005-8-10 9:29:50编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-8-10 12:37 | 显示全部楼层

守柔

Sub Example2() '此代码功能为列出重命令指定文件夹中所有选取的WORD文件 Dim MyDialog As FileDialog, vrtSelectedItem As Variant, A As Byte, MyDoc As Documents

运行到这句时提示“用户定义类型未定义”,然后运行就中断了

请问应该如何改?

TA的精华主题

TA的得分主题

发表于 2005-8-10 12:42 | 显示全部楼层
可能是你的版本问题,此代码适宜于OFFICE XP及以上版本。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 13:02 , Processed in 0.049143 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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