VBA|批量重命名文件夹

论坛 期权论坛 期权     
螺仔Felix   2019-6-29 21:08   3326   0

↑ 又是这个丑丑的GIF
迟早我要重新做一个
然而最近没什么灵感
打杂小妹=机械重复
最近又编了个VBA
代码和大家共享一下吧
直接开始讲代码啦:



先给个架构
get_list、reset_table、select_file、get_files、rename_folder全部都是自定义的Sub过程(Sub)或者函数(Function)
这几个Sub过程/函数之间的关系如下:


第一步,运行get_list
get_list里面会调用reset_table、select_file、get_files
得出文件夹清单后,用户需要写好新的文件夹名称列表
第二步:运行rename_folder
即可按用户的要求重命名文件夹


Step 1: get_list
我们先看看get_list


【第2行】运行reset_table,把sheet初始化【第3~5行】定义变量,fso、thefolder为对象,path为字符型变量【第6~7行】注意,这两行二择其一即可。实际上我把第6行注释掉了)目的是要获得目标文件夹所在的路径(即,你要改哪里的文件夹),然后把这串地址赋值给path
所以,select_file这个东西运行完之后,是要有个结果输出的,即 要有返回值获取路径的方法有两种,一是让用户把完整路径复制进去(第6行),二是跳出对话框让用户选择(第7行)【第8行】初始化fsoObject个人觉得是个非常高深的东西,里面有非常多固有属性,有兴趣的话,建议自己去看看描述文档)
【第9行】初始化thefolder,指向目标路径下的所有文件夹【第10行】get_files是个带参数的过程,现在要运行它,然后thefolder就是参数【第11行】本过程结束

get_list里面调用了reset_table、select_file、get_files
reset_table代码如下:


初始化表格,清空内容,设置表头注意,根据第2行的代码,活动的工作表必须要叫做 sheet1,别随便乱改工作表的名字A列,存放完整地址,比如说
        D:\Display\文件夹 (1)B列,存放上级地址,即
        D:\DisplayC列,存放文件夹原来的名字,即
        文件夹 (1)D列,存放文件夹新的名字(也就是你想让文件夹叫啥)比如
        文件夹 A
A~C列,是通过运行宏自动生成的D列,是要由用户自己去填写的
后面输出列表的时候
注意内容要与表头匹配

下一个,select_file
代码如下:


注意
select_file是个函数(Function)
除了select_file之外,其他几个都是Sub过程
这里涉及到一个知识点:Sub过程不能有返回值,但是函数可以
(不要问我为什么,因为我也不知道)
【第2~3行】定义变量,其中strPath是字符型变量【第4行】显示选择文件夹对话框【第5行】路径初始化【第6~7行】假如fd.Show的值为-1,则用户已经选好了文件夹,所以把用户选择的这个文件夹的路径赋值给strPath【第8~9行】假如d.Show的值不是-1,则用户没有选择文件夹,终止这个函数,强制跳出【第10行】If语句结束【第11行】把fd清空
【第12行】返回strPath的值【第13行】本函数结束

get_files,如下:


这里用到了递归,可以遍历目标路径下的所有文件夹以及子文件夹
【第2~3行】定义变量【第4~9行】是一个完整的For循环
【第4行】对于ofolder里面的所有文件夹、以及子文件夹【第5行】逐一执行get_files这个过程(递归)【第6~8行】分别输出完整地址、上级地址以及文件夹名称;输出的位置,控制在A~C列,且在表头下方第一行开始(注意,这里输出的时候,要和reset_table里面表头的设置想匹配哟)
【第9行】对下一个文件夹重复执行第5~8行的语句【第10行】本过程结束

get_list的部分到此结束了
运行get_list之后
理应得到文件夹的列表
然后用户要在D列写上文件夹的新名称
然后运行rename_folder就可以改文件夹的名字了

Step 2: rename_folder
代码如下:


【第2~4行】定义变量,这里出现简写的定义语句,%表示短整型,另外还有&(长整型)、$(字符型)Dim count%  完整写法应该是:
Dim count as integer所以,第4行其实可以写成  Dim path$【第5行】初始化fso【第6行】数一下列表一共有多少行,即要重命名多少个文件夹【第7~12行】又是一个完整的For循环
【第7~8行】从第3行开始,把A列地址逐一赋值给path
(注意,Sheet的第1行我留空了,用来放两个按钮;第2行是表头;所以应该从第3行开始)
【第9行】让ofolder指向path所代表的文件夹【第10行】重命名文件夹,运用到Name这个过程要注意它所使用的两个参数Cells(i,1).Value 是一串完整的地址,比如说:
        D:\Display\文件夹 (1)然而,为了方便起见,D列里面,只写了文件夹的名称(比如,文件夹002)所以,在使用Name修改文件夹名称的时候,要把文件夹的上级地址加上,即
        D:\Display\文件夹 (2)
代入之后,即为        Name D:\Display\文件夹 (1) as D:\Display\文件夹 (2)
假如不把上级地址加上会如何?即
        Name D:\Display\文件夹 (1) as 文件夹 (2)
会如何?文件夹仍然会被重新命名,只是整个文件夹会挪到“我的文档”里面
【第11行】清空ofolder,以便下一次使用
【第12行】i累加1
【第13行】提示列表里面的文件夹已经全部重命名完毕了【第14行】本过程结束



光讲代码好像有点虚无缥缈
举个例子演示一下吧
上述的VB程序,完成的就是以下工作(从左到右)


具体操作如下:



注意,在第4步得到文件夹列表后,请不要随意地对列表进行排序哟!!!



Q:VBA贰号,是批量修改文件的名称。是否可以考虑,把VBA贰号,与本次的VBA叁号合并在一起?只读取一次,获得文件夹+文件的清单,and then一次过 rename?A:好像可以耶~~但是必须先改文件名称,因为这一步骤需要依靠所在文件夹名称。(这个道理,和必须先改底层文件夹名称是一样的)所以还要区分列表里面的文件&文件夹。我有空再想想……按这种思路的话,应该可以弄一个这样的宏:






本期内容到此结束
欢迎各路高手留言赐教&指正
大家有任何VBA需求都可以来找我


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP