Получить имя файла на листе так же, как порядок в папке - PullRequest
0 голосов
/ 23 февраля 2019

Я создал код, чтобы получить все имена файлов в папке на листе. Я использую его для проверки точности имен файлов (см. Диаграмму ниже).

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 голосов
/ 24 февраля 2019

Я вижу несколько проблем с вашим 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 header):

    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
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...