首页 > 解决方案 > Excel VBA 宏运行时 53 文件未找到

问题描述

我创建了一个宏来重命名文件,但收到此错误:

运行时错误 53 找不到文件

但是,如果我保持光标,它会正确选择我的位置路径“名称文件夹和 Curname 作为文件夹和新名称”

Sub getname()
    Dim folder As String
    mfolder = Sheets("Sheet1").Cells(1, 2).Value
    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim i As Integer
    i = 3
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(mfolder)
    For Each objFile In objFolder.Files
        Sheets("Sheet1").Cells(i, 1).Value = objFile.Name
        i = i + 1
    Next objFile
End Sub
Sub reName()
    Dim mfolder As String
    Dim CurName As String
    Dim NewName As String
    Dim i As Integer
    i = 3
    mfolder = Sheets("Sheet1").Cells(1, 2).Value
    Do While Sheets("Sheet1").Cells(i, 1).Text <> "" And Sheets("Sheet1").Cells(i, 2).Text <> ""
       CurName = Sheets("Sheet1").Cells(i, 1).Text
       NewName = Sheets("Sheet1").Cells(i, 2).Text
       Name mfolder & CurName As mfolder & NewName
       i = i + 1
    Loop
    MsgBox ("Complete")
End Sub

标签: excelvbafilefile-not-foundfilesystemobject

解决方案


根据经验,我总是使用 Microsoft 脚本运行时的早期绑定。这使您可以在使用外部参考时获得智能感知和其他好处。

工具 >> 参考资料

在此处输入图像描述

添加后,您可以按如下方式导入对象引用。

dim fso as filesystemobject
set fso = new filesystemobject

这允许你做这样的事情。

dim fldr as fldr
set fldr = fso.getfolder("c:\test_folder")

并遍历文件

dim fl as file
for each fl in fldr.files
    do something
next fl

在 VBA 中使用新参考时,它总是有助于我个人查看可用的选项。

(当你像你一样使用后期装订时,你没有这种奢侈)

在此处输入图像描述

主要是重命名文件

fldr.move("C:\test_folder2")

在我看来,您应该存储文件的路径

objFile.path不是objFile.Name

这将存储类似C:\test\test.text

所以修复获取文件列表

Function list_files():

' log all files

Dim fso As filesystemobject
Set fso = New filesystemobject
Dim fldr As fldr
Set fldr = fso.getfolder("c:\test_folder")
Dim fl as file
Dim ws As Worksheet
Set ws = Worksheets("sheet1")
Dim i As Integer
i = 2

    For Each fl In fldr.Files
        ws.Cells(i, 1) = fl.Path
    Next fl

End Function

并重命名

Function rename_files():

' log all files

Dim fso As filesystemobject
Set fso = New filesystemobject
Dim fl As file
Dim ws As Worksheet
Set ws = Worksheets("sheet1")
Dim lr As Integer

lr = ws.Cells(Rows.Count, 1).End(xlUp).Row

    For x = 2 To lr
        If ws.Cells(x, 2) <> "" Then
            Set fl = fso.getfile(ws.Cells(x, 1))
            fl.Move (ws.Cells(x, 2))
        End If
    Next x

End Function

还有一点需要注意的是,在遍历单元格时,最好的做法是使用类似的东西。

dim ws as worksheet
set ws = worksheets("Sheet1") ' get the worksheet

dim lr as integer  ' create lr interger reference
lr = ws.cells(rows.count,1).end(xlup).row

for x = 2 to lr
    'do something
next x

让我们分解这里发生的事情。

ws.cells(rows.count,1).end(xlup).row

ws 在工作表中

cells 在细胞中

rows.count 获取最后一行

1 在第一列

所以....

ws.cells(rows.count,1)正在引用第 1 列中的所有单元格

然后....

.end(xlup) 向上到数据开始的地方(或空行结束)

row 记录行号

然后,当您执行 for 循环时,您不会检查空单元格,因为您已经知道它在哪里。

for x = 2 to lr 'the last row in the data with data in it.
    if ws.cells(x,2) <> "" then
        'do something because column 1 and 2 both have no value in the cell
    end if
next x

希望这有所帮助


推荐阅读