【问题标题】:Excel VBA Macro Run time 53 file not foundExcel VBA 宏运行时 53 文件未找到
【发布时间】:2020-07-29 23:48:38
【问题描述】:

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

运行时错误 53 找不到文件

但如果我保持光标,它会正确选择我的位置路径 "命名文件夹 & Curname As 文件夹 & Newname"

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

【问题讨论】:

  • 路径和文件名之间有路径分隔符吗?另外,通常的做法是使用.Value 而不是.Text
  • 在 Name 命令之前,使用 Dir 检查文件是否存在:Dir(mfolder &amp; CurName)。如果文件不存在,它将返回一个空字符串。这样,您可以弹出一个消息框或写入日志文件以确定错误的文件名。

标签: excel vba file file-not-found filesystemobject


【解决方案1】:

根据经验,我总是使用 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

希望对你有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多