2016-05-06 5 views
0

Я использую Excel 2010Заполняем ячейки с именами файлов в папке, Excel

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

I.e. если путь к файлу: C: \ Users \ ИМЯ \ Documents \ путь_к_папка

и в путь_к_папке У меня есть несколько файлов определенного типа (File001.DAT ... File00N.DAT)

Как я могу заполнять все ячейки в пределах определенного столбца (и начиная с определенной строки) с именами файлов *. DAT?

Заранее спасибо.

Обновление: Я использовал командную строку для ввода имен файлов в текстовый файл. В командной строке я переходите к каталогу в вопрос:

CD/Каталог/О/Напильники

, а затем я написал файлы в текстовый файл следующим образом:

реж/б * .png > FIles.txt

флаг/b дает мне только имена. Затем я скопировал все имена и вложил их в Excel. Это не так здорово, как решение Брюса Уэйна, но на данный момент это то, что мне нужно.

+1

не думаю, что первенствует-формула будет сократить его для вас. Я думаю, что это прямо в домене VBA. –

+2

Используйте 'Dir': http://www.techonthenet.com/excel/formulas/dir.php –

+1

Посмотрите функцию' Dir' VBA - это может помочь вам начать свой путь .... http: // stackoverflow .com/q/10380312/1693085 и http://stackoverflow.com/a/10382861/1693085 –

ответ

2

Просто извлеките выход из команды DIR через стандартный выходной поток. Гораздо быстрее, чем Dir$() и нет необходимости в каких-либо петель !:

Sub Foo() 

Dim strFolderName As String 
Dim strFileType  As String 
Dim pasteRange  As Range 
Dim returnVals  As Variant 

'// set parameters, change as required 
strFolderName = "C:\Users\NAME\Documents\FolderPath\" 
strFileType = "*.DAT" 
Set pasteRange = Range("C5") 

'// retrieve output of DIR command from CMD.exe 
returnVals = Filter(Split(CreateObject("WScript.Shell").Exec("CMD /C DIR """ & strFolderName & _ 
       strFileType & """ /B /A:-D").StdOut.ReadAll, vbCrLf), ".") 

'// Display results in chosen column 
pasteRange.Resize(UBound(returnVals) + 1, 1).value = WorksheetFunction.Transpose(returnVals) 

End Sub 
+0

Мне нравится этот подход, я пытался его прочитать и выяснить каждую строку. Одна строка, которую я не понимаю (и, по общему признаку), не работает, находится под комментарием '// Отображение результатов в выбранном столбце. Я получаю ошибку Runtime' 13 'Несоответствие типа. Связано ли это с массивом, не совпадающим? @ macro-man –

+0

Вы помещаете результаты в один столбец? (является ли код _exactly_ тем же, что и выше, или вы что-то изменили?) –

+0

Я изменил путь к каталогу только в моем каталоге, то есть C: \ Users \ NAME \ Documents \ FolderPath \ Это все, что я изменил –

1

быстрый и простой способ, чтобы использовать цикл, который просто проверяет расширение каждого файла в каталоге:

Sub t() 
Dim MyObj As Object, MySource As Object, file As Variant 
Dim i& 

file = Dir("C:\Users\me\Desktop\") 
i = 1 
While (file <> "") 
    Debug.Print Right(file, 3) 
     If Right(file, 3) = "dat" Then 
     Cells(i, 1).Value = "found " & file 
     i = i + 1 
     End If 
    file = Dir 
    Wend 
End Sub 

Просто отрегулируйте Cells(i,1) по мере необходимости.

+0

Попытка этого, спасибо! В настоящее время я сделал следующее: перейдите к рассматриваемой директории с помощью CMD и CD. То есть CD/Locaton/To/Directory, тогда я написал файлы в файл Txt, например: dir/b * .png> FIles.txt Затем я скопировал все имена в списке и вложил их в Excel. –

1

Другой способ - хотя функция EnumerateFiles в основном такая же, как BruceWaynes.

Sub PopulateSheet() 

    Dim lRow As Long 
    Dim colFiles As Collection 
    Dim vFile As Variant 

    With ThisWorkbook.Worksheets("Sheet1") 

     'This will find the last row in column A, but 
     'can use a static number or any other method to return a row number. 
     lRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 
     Set colFiles = New Collection 

     'Remember to put the final \ in the file path. 
     EnumerateFiles "C:\Users\NAME\Documents\FolderPath\", _ 
      "*.DAT", colFiles 

     For Each vFile In colFiles 
      .Cells(lRow, 1) = Mid(vFile, InStrRev(vFile, "\") + 1) 
      lRow = lRow + 1 
     Next vFile 

    End With 

End Sub 

'//Places all file names with FileSpec extension into a collection. 
Sub EnumerateFiles(ByVal sDirectory As String, _ 
    ByVal sFileSpec As String, _ 
    ByRef cCollection As Collection) 

    Dim sTemp As String 

    sTemp = Dir$(sDirectory & sFileSpec) 
    Do While Len(sTemp) > 0 
     cCollection.Add sDirectory & sTemp 
     sTemp = Dir$ 
    Loop 
End Sub 
+0

Этот код работает очень хорошо. Я в настоящее время инвестирую время в это, пытаясь учиться на нем. Благодаря! Однако у меня есть два вопроса: сначала я начну с самого важного: как удалить расширение файла при генерации имен файлов? Я попытался удалить несколько факторов в коде безрезультатно. Что касается второго вопроса, я попытаюсь создать диалоговое окно файла, чтобы получить файлы независимо и, если не удастся, опубликует новый поток. –

+0

Btw, мне удалось найти, как удалить расширения файлов с помощью командной строки. Он выглядит следующим образом: dir/b/O: N * .DAT> flist.txt для% i in (* .DAT) do @echo% ~ ni >> fileNames.txt –

+0

Два способа, я могу придумать, чтобы удалить расширение: 'mid (vfile, instrrev (vFile," \ ") + 1, instrrev (vfile,". ") - instrrev (vfile," \ ") - 1)' или использовать отдельную функцию: 'Public Function GetBaseName (ByVal strFullName As String) As String: Dim oFSO As Object: Установить oFSO = CreateObject (" Scripting.FileSystemObject "): GetBaseName = oFSO.GetBaseName (strFullName): End Function' –

Смежные вопросы