【发布时间】:2016-05-16 16:09:49
【问题描述】:
我在 A 列中有一个列表,其中包含指向共享网络驱动器上的 PDF 文件的文件名超链接,该驱动器经常被过滤和排序。我想在选定的过滤范围上运行宏,不包括表中的隐藏行。宏会将这些文件复制到新位置,并根据工作表中的数据重命名它们。
A 列包含包含扩展名的超链接文件名(例如,单元格“A3”包含“15-P980_Vendor_15169_.pdf”) B 列和 E 列包含基于从文件名中提取文本的公式的文本。下划线是分隔符。 (C 列和 D 列被隐藏,未使用)。因此,单元格“B3”包含“15-P980”,单元格“E3”包含来自 A 列中文件名的“供应商”。
尝试重命名所选范围行中每行中的文件 Cell(, 5) + "_" + Cell(, 2) 中的内容。
我选择的范围为 =$A$3:$E$6。
我收到一个需要对象的错误。我在编写For Each 部分时遇到问题。特别是获取文件路径,即sourcePath =。我想我必须获取 A 列中的超链接地址,然后从中提取文件路径,但不知道如何编码。任何帮助将不胜感激。
Sub CopyFile()
ThisWorkbook.ActiveSheet.Unprotect
On Error GoTo errHndl
Dim xTitleId As String
Dim sourcePath As String, destPath As String
Dim sourceFile As String, destFile As String, sourceExtension As String
Dim rng As Range, cell As Range, row As Range
destPath = "C:\Users\\Desktop\Test\dst"
sourceFile = ""
destFile = ""
xTitleId = "Copy/Rename Files"
Set rng = ThisWorkbook.ActiveSheet.Application.Selection
Set rng = ThisWorkbook.ActiveSheet.Application.InputBox("Range", xTitleId, rng.Rows, Type:=8)
Set addr = rng.Cells(, 1)
For Each row In rng.Rows
sourcePath = addr.Hyperlinks(1).Address
sourceExtension = Split(row.Cells(, 1), ".")(1)
sourceFile = sourcePath + row.Cells(, 1)
destFile = destPath + row.Cells(, 5) + "_" + row.Cells(, 2) + "." + sourceExtension
File.Copy sourceFile, destFile, False
Next row
MsgBox "Operation was successful.", vbOKOnly + vbInformation, "Done"
Exit Sub
errHndl:
MsgBox "Error happened while working on: " + vbCrLf + _
sourceFile + vbCrLf + vbCrLf + "Error " + _
Str(Err.Number) + ": " + Err.Description, vbCritical + vbOKOnly, "Error"
End Sub
【问题讨论】:
-
引发“需要对象”错误,因为您试图在 InputBox 方法中将
rng设置为文本值。 -
您能否提供一些额外的指导。我将
Type:=2更改为 8。仍然出现错误。您能否提供有关从超链接中提取文件路径的帮助?我有点卡住了...... -
输入框的作用是什么?像
For Each myLink in rng.Hyperlinks这样的东西怎么样? -
另外,您是否可以包含每列的样本?
-
我添加了测试工作簿的链接和它的图像。谢谢