我创建了一个代码,将文件夹中的所有文件名都放入工作表中。用它来检查文件名的准确性(请参见下图)。
当我单击目标文件夹的宏文件名时,将出现在系统报告下。然后,我使用一些公式将文件名与“实际名称”列进行匹配,并将其指示给用户。
我的代码存在一个问题,即尽管目标文件夹中的文件名和文件顺序相同,工作表中显示的文件名的顺序却每天都在变化。
我该如何解决这个问题?
Sub GetFiles_Name()
Dim x As String, y As Variant
x = "D:\Reports\*"
y = GetFileList(x)
Select Case IsArray(y)
Case True
MsgBox UBound(y)
Sheets("Cost").Range("H6:H11").Select
Selection.ClearContents
For i = LBound(y) To UBound(y)
Sheets("Cost").Cells(i, 8).Rows("6").Value = y
Next i
Case False
MsgBox "No Matching Files Found!"
End Select
End Sub
Function GetFileList(FileSpec As String) As Variant
Dim FileArray() As Variant
Dim FileCount As Integer
Dim FileName As String
On Error GoTo NoFilesFound
FileCount = 0
FileName = Dir(FileSpec)
If FileName = "" Then GoTo NoFilesFound
Do While FileName <> ""
FileCount = FileCount + 1
ReDim Preserve FileArray(1 To FileCount)
FileArray(FileCount) = FileName
FileName = Dir()
Loop
GetFileList = FileArray
Exit Function
NoFilesFound:
GetFileList = False
End Function
答案 0 :(得分:2)
我可以看到您的Sub GetFiles_Name()
有几个问题:
变量y
是一个数组,但是您正在使用它,就像它在此行上是一个变量一样:
Sheets("Cost").Cells(i, 8).Rows("6").Value = y
执行此操作时,VBA将采用y
数组的第一个元素,并在每列中使用它。您的代码在显示图片时实际上是否曾经起作用过?
通过写入Sheets("Cost").Range("H6:H11").ClearContents
,您假设文件将始终为6(从6到11)。真的是这样吗?我宁愿使用更灵活的方法(这里假设H5
对应于您的Actual Names
标题列):
Dim lastRow As Integer: lastRow = Sheets("Cost").Range("G5").End(xlDown).Row
Sheets("Cost").Range("H6:H" & lastRow).ClearContents
还要注意,您不需要先.Select
然后清除Selection
。您可以直接在范围上.ClearContents
,而无需选择。
最后,为了不依赖于System Reports
列文件的顺序,应查找每个文件,如果匹配,则将其写在靠近它的位置。看起来像这样:
For i = LBound(y) To UBound(y)
Set matched = Range("G6:G" & lastRow).Find(y(i), LookAt:=xlWhole) '<-- I assume "G" is the column with the file names moving in order
If Not matched Is Nothing Then '<-- if I found the file in the list
matched.Offset(0, 1) = y(i) '<-- put the file name in the adjacent column H
End If
Next i