VBA 文件批量重命名:告别重复劳动!
本篇知识点:Name 语句、数组、GetOpenFilename 等。
小白:阿夏,好难啊,求助!准备想走的时候,老板给了一千多份工作簿让我按序号重命名,哇,这得改到什么时候啊,我今晚不能找你吃饭了……

阿夏:你不也是刚学了 VBA 吗,试着用 VBA 去做呗。
小白:对哦!……可是要怎么做呢?

第一步:了解 Name 语句
阿夏:我们拆解一下步骤,先不要想这么难的……假设只是需要修改一个文件名,就以修改工作簿1为例。
小白:噢!我记得的,可以用 Name 语句。
Name oldpathname as newpathname
Name "C:\Users\Admin\Desktop\新建文件夹\工作簿1.xlsx" As "C:\Users\Admin\Desktop\新建文件夹\入库表0001.xlsx"
第二步:动态获取旧文件名
阿夏:试着获取 old pathname,而不是直接复制文件路径?
小白:唔……用 GetOpenFilename,还是 FileDialog 呢?
小白:GetOpenFilename 只是返回选择的文件的完整路径和文件名到程序,不实质打开文件,不能选择文件夹,而 FileDialog 可以实质操作文件。一个文件,先用 GetOpenFilename 试试,不实质操作文件的话能加快程序运行速度。
Sub t()
Dim f
f = Application.GetOpenFilename()
If f <> 0 Then
Name f As "C:\Users\Admin\Desktop\新建文件夹\入库表0001.xlsx"
'如没有选择文件夹即f=0,则不执行重命名语句
End If
End Sub

第三步:批量获取文件名并存储到数组
阿夏:那怎么获取批量的文件名还记得吗?
小白:当然记得!
Sub getfilesname()
Dim f, k As Integer
'f是装载文件路径的变量,如多选则为数组,此处暂不定义其数据类型
f = Application.GetOpenFilename(, MultiSelect:=True)
'MultiSelect设置为True,可多选文件
If TypeName(f) = "Boolean" Then
MsgBox "没有选择文件,已退出程序。"
Exit Sub
End If
'如果没有选取文件,f的值会变成布尔型False,则退出程序
For k = 1 To UBound(f)
Cells(k, 1) = f(k)
'把获取的文件名及路径放在A列
Next k
End Sub


第四步:组合代码,实现批量重命名
小白:啊!我想到了,把这两个组合起来用,把修改的文件名放在 B 列,然后 name A as B。得把文件路径放在数组里,会运行得快一些。
Sub rename()
Dim arr_A, arr_B, k As Integer
arr_A = Range([A1], [A65556].End(xlUp))
arr_B = Range([B1], [B65556].End(xlUp))
'把A列旧文件名和B列新文件名分别放入数组
'数值是竖着一列放的,所以是二维数组
For k = 1 To UBound(arr_B)
Name arr_A(k, 1) As arr_B(k, 1)
'循环,逐个文件更名
Next k
End Sub


优化文件选择
阿夏:不过 GetOpenFilename 的文件类型也可以设置一下。你需要修改的文件全是 Excel 表格,那就设置为只显示 .xlsx 文件,选取起来就很方便了。
(如果需要修改其他文件类型,也可以在这设置。)
f =Application.GetOpenFilename("Excel文件,*.xlsx", MultiSelect:=True)
小白:对哦!
更进一步的优化
阿夏:带着路径的文件名不方便看,尤其是路径长的时候。像现在需要提取的文件都在同一路径下,可以试着把文件夹路径提取出来,单拎文件名出来看,在操作重命名的时候再把文件路径加回去。这是我写的,可以参考下~
(代码过长就不贴出来了,有兴趣可以到文章末端下载源文件看)
▼运行演示

小白:哇你还考虑了很多细节,下次换别的文件类型要重命名,我也不怕了哈哈哈(๑′ᴗ‵๑)
阿夏:主要实现的语句其实就是你想的那些,有时间的话还可以继续完善,还有很多种可以实现的方法呢……今晚能准时下班了吧?
小白:给我一分钟,马上过来!

“`
