excel - 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
解决方案
根据经验,我总是使用 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
希望这有所帮助
推荐阅读
- r - 在 R 条件下变异
- elasticsearch - 在弹性搜索中查询文本和关键字
- c# - Active Directory 中的用户不显示在我的 ASP.Net GridView 中?
- java - 如何在下午 4:00 运行 java
- java - 在运行时加载 apache 骆驼路由并添加到现有的 CamelContext
- python - 如何在 Python 中绘制日期时间类型及其对应值?
- python - 时间计算问题
- r - 将重复行转换为 Excel 或 R 中的新列?
- android - * 处的 kotlin 错误 - 不能使用提供的参数调用以下函数
- python - 带有变量的 Python matplotlib MathText