Q:如何实现根据列表内容查找文件夹中的照片,并将照片剪切或复制到另外的文件夹?如下图1所示,在列C中有一系列身份证号。
图1
在一个文件夹中(示例中为“照片库”),存放着以身份证号命名的照片,在其中查找上图1所示的工作表列C中的身份证号对应的照片并将其移动至另一文件夹中(示例中为“一班照片”),如下图2所示。
图2
如果文件夹中找不到照片,则在图1的工作表列D中标识“无”,否则标识有,结果如下图3所示,表明在文件夹“照片库”中只找到并复制了2张照片,其他照片没有找到。
图3
A:可以使用一段VBA代码实现。代码如下:
Sub CopyPic()
'声明变量
Dim strSourcePath As String
Dim strDesPath As String
Dim strFile As String
Dim iCount As Long
Dim strFilename() As String
Dim lngLastRow As Long
Dim i As Long
Dim bln As Boolean
'指定照片所在文件夹和要复制到的文件夹
'示例假设工作簿与文件夹在同一目录下
strSourcePath = ThisWorkbook.Path & "\照片库\"
strDesPath= ThisWorkbook.Path & "\一班照片\"
'获取文件
strFile =Dir(strSourcePath)
'获取工作表最后一行
lngLastRow= Worksheets("Sheet1").Range("C" &Rows.Count).End(xlUp).Row
'重定义动态数组
ReDim strFilename(0 To iCount)
If strFile<> "" Then
strFilename(iCount) = strFile
Else
Exit Sub
End If
'遍历照片所在文件并将所有照片名称存储在数组中
Do While strFile <> ""
iCount= iCount + 1
ReDim Preserve strFilename(0 To iCount)
strFile= Dir
strFilename(iCount) = strFile
Loop
'遍历工作表
For i = 2 To lngLastRow
bln = False
'遍历数组
For iCount = LBound(strFilename) To UBound(strFilename)
'查找照片名称
If Worksheets("Sheet1").Range("C" & i).Value =Left(strFilename(iCount), 18) Then
'如果找到将其复制到目标文件夹
FileCopy strSourcePath & strFilename(iCount), strDesPath &strFilename(iCount)
bln = True
End If
Next iCount
'根据照片是否找到填写列D相应单元格值
If bln Then
Worksheets("Sheet1").Range("D" & i).Value ="有"
Else
Worksheets("Sheet1").Range("D" & i).Value ="无"
End If
Next i
End Sub
代码先将照片所在的文件夹中的所有照片名称存储在数组中,然后遍历工作表单元格,并将单元格中的值与数组中的值相比较,如果相同,则表明找到了照片,将其复制到指定的文件夹,并根据是否找到照片在相应的单元格中输入“有”“无”以提示查找的情况。
可以根据实际情况,修改代码中照片所在文件夹的路径和指定要复制的文件夹的路径,也可以将路径直接放置在工作表单元格中,并使用代码调用,这样更灵活。