将文件名输入工作表中,方法与文件夹中的顺序相同

时间:2019-02-23 20:30:15

标签: excel vba

我创建了一个代码,将文件夹中的所有文件名都放入工作表中。用它来检查文件名的准确性(请参见下图)。

Excel Worksheet Screen Shot

当我单击目标文件夹的宏文件名时,将出现在系统报告下。然后,我使用一些公式将文件名与“实际名称”列进行匹配,并将其指示给用户。

我的代码存在一个问题,即尽管目标文件夹中的文件名和文件顺序相同,工作表中显示的文件名的顺序却每天都在变化。

我该如何解决这个问题?

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

1 个答案:

答案 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