一分钟就能搞定1000+文件重命名 OK!

VBA 文件批量重命名:告别重复劳动!

本篇知识点:Name 语句、数组GetOpenFilename 等。

小白:阿夏,好难啊,求助!准备想走的时候,老板给了一千多份工作簿让我按序号重命名,哇,这得改到什么时候啊,我今晚不能找你吃饭了……

d4d9374f-675d-45fc-92a5-f67566043df9

阿夏:你不也是刚学了 VBA 吗,试着用 VBA 去做呗。

小白:对哦!……可是要怎么做呢?

1d9e0a4b-d4f7-4dc9-9541-7a023fe51d4f

第一步:了解 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

b86d19e9-0afa-49fb-b1b2-3895db5da491

第三步:批量获取文件名并存储到数组

阿夏:那怎么获取批量的文件名还记得吗?

小白:当然记得!

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

b6b8aab4-1521-40ca-ae4c-790b290b2322

45c364e3-8650-4b94-809d-dd15be1129c5

第四步:组合代码,实现批量重命名

小白:啊!我想到了,把这两个组合起来用,把修改的文件名放在 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

615954d9-042f-433d-9cb7-2d9bf32ea32a

4781350b-01ce-4f3e-9a0c-61bbb4aaf97f

优化文件选择

阿夏:不过 GetOpenFilename 的文件类型也可以设置一下。你需要修改的文件全是 Excel 表格,那就设置为只显示 .xlsx 文件,选取起来就很方便了。

(如果需要修改其他文件类型,也可以在这设置。)

f =Application.GetOpenFilename("Excel文件,*.xlsx", MultiSelect:=True)

小白:对哦!

更进一步的优化

阿夏:带着路径的文件名不方便看,尤其是路径长的时候。像现在需要提取的文件都在同一路径下,可以试着把文件夹路径提取出来,单拎文件名出来看,在操作重命名的时候再把文件路径加回去。这是我写的,可以参考下~

(代码过长就不贴出来了,有兴趣可以到文章末端下载源文件看)

▼运行演示

7d998a9e-be27-4bce-9eb0-44aa499898c3

小白:哇你还考虑了很多细节,下次换别的文件类型要重命名,我也不怕了哈哈哈(๑′ᴗ‵๑)

阿夏:主要实现的语句其实就是你想的那些,有时间的话还可以继续完善,还有很多种可以实现的方法呢……今晚能准时下班了吧?

小白:给我一分钟,马上过来!

4f684cbe-90de-4dc7-bb22-989ffb872687

“`

Leave a Reply

Your email address will not be published. Required fields are marked *