2015-07-14 37 views
6

Tôi cần lấy tên của tất cả các tệp Excel trong một thư mục và sau đó thực hiện thay đổi cho mỗi tệp. Tôi đã nhận được phần "thay đổi" được sắp xếp. Có cách nào để lấy danh sách các tệp .xlsx trong một thư mục không, ví dụ D:\Personal và lưu trữ nó trong một Chuỗi Chuỗi.Lấy danh sách các tệp Excel trong một thư mục bằng cách sử dụng VBA

sau đó tôi cần phải lặp qua danh sách các tập tin và chạy macro trên mỗi file mà tôi figured tôi có thể làm bằng:

Filepath = "D:\Personal\" 
For Each i in FileArray 
    Workbooks.Open(Filepath+i) 
Next 

tôi đã có một cái nhìn tại this, tuy nhiên, tôi wasn' t có thể mở các tập tin vì nó lưu trữ các tên ở định dạng Variant.

Tóm lại, làm cách nào tôi có thể sử dụng VBA để lấy danh sách tên tệp Excel trong một thư mục cụ thể?

+0

Bạn có cần các tệp được liệt kê ở địa điểm khác không? Hay bạn chỉ muốn làm công cụ trong các tập tin mà không cần liệt kê chúng? – Raystafarian

+0

Chỉ muốn thực hiện các công cụ trong các tệp –

+0

Điều ngược lại với những gì câu hỏi của bạn đọc. Bạn muốn tên của các tập tin, không chỉ để làm công cụ cho các tập tin. – Raystafarian

Trả lời

7

Ok tốt điều này có thể làm việc cho bạn, một chức năng mà phải mất một con đường và trả về một mảng tên tệp trong thư mục. Bạn có thể sử dụng câu lệnh if để chỉ nhận các tệp excel khi lặp qua mảng.

Function listfiles(ByVal sPath As String) 

    Dim vaArray  As Variant 
    Dim i   As Integer 
    Dim oFile  As Object 
    Dim oFSO  As Object 
    Dim oFolder  As Object 
    Dim oFiles  As Object 

    Set oFSO = CreateObject("Scripting.FileSystemObject") 
    Set oFolder = oFSO.GetFolder(sPath) 
    Set oFiles = oFolder.Files 

    ReDim vaArray(1 To oFiles.Count) 
    i = 1 
    For Each oFile In oFiles 
     vaArray(i) = oFile.Name 
     i = i + 1 
    Next 

    listfiles = vaArray 

End Function 

Sẽ tốt hơn nếu chúng tôi chỉ truy cập tệp trong đối tượng tệp theo số chỉ mục nhưng dường như bị hỏng trong VBA vì bất kỳ lý do gì (lỗi?).

+0

Công trình này! Vấn đề duy nhất là nó là một mảng biến thể và tôi cần chúng như một chuỗi nhưng typecast không hoạt động đúng. Tôi cần phải mở mỗi người sau đó. –

+0

Một chuỗi của nó chứa trong một biến thể, nó không phải là một vấn đề để sử dụng nơi mà bạn có thể sử dụng một chuỗi. Bạn có chắc chắn nó không phải cái gì khác gây ra lỗi của bạn? bạn có thể đăng mã vi phạm không? Ngoài ra tôi không sử dụng mảng cho danh sách các tên tập tin để mở sau này, tôi sử dụng một tập hợp các tập tin, mà có thể làm việc cho bạn quá. – Coder375

+0

Tôi đã tìm thấy sự cố của mình. Tôi đã iterating thông qua các tập tin bằng cách sử dụng 'Đối với mỗi tôi trong oFiles Workbook.Open (oFiles (i))' Chỉ cần phải thay đổi đó để tôi. Lỗi của tôi! Cảm ơn đã giúp đỡ! –

2
Dim iIndex as Integer 
Dim ws As Excel.Worksheet 
Dim wb  As Workbook 
Dim strPath As String 
Dim strFile As String 

strPath = "D:\Personal\" 
strFile = Dir(strPath & "*.xlsx") 

Do While strFile <> "" 
    Set wb = Workbooks.Open(Filename:=strPath & strFile) 

    For iIndex = 1 To wb.Worksheets.count 
     Set ws = wb.Worksheets(iIndex) 

     'Do something here. 

    Next iIndex 

strFile = Dir 
Loop 
+0

@Omar Cảm ơn bạn đã chỉnh sửa. – MatthewD

+0

Không phải là nó '&' để nối chuỗi trong VBA? như trong 'Filepath & i' hoặc thậm chí là' Filepath & CStr (i) '. –

+0

Đó là. Điều đó xuất hiện từ mã của anh ta. Tôi nghĩ rằng + cũng sẽ làm việc. – MatthewD

10

Bạn có thể sử dụng hàm Dir được tích hợp sẵn hoặc FileSystemObject.

Đối với một danh sách đơn giản các tập tin, lệnh dir là khá dễ dàng để sử dụng. Nó cũng hỗ trợ các ký tự đại diện, rất hữu ích nếu bạn không muốn mọi tệp. Bí quyết để sử dụng nó là để hiểu cách gọi nó với một tham số khác với cuộc gọi mà không có một tham số.

Public Sub ListFilesDir(ByVal sPath As String, Optional ByVal sFilter As String) 

    Dim sFile As String 

    If Right(sPath, 1) <> "\" Then 
     sPath = sPath & "\" 
    End If 

    If sFilter = "" Then 
     sFilter = "*.*" 
    End If 

    'call with path "initializes" the dir function and returns the first file 
    sFile = Dir(sPath & sFilter) 

    'call it again until there are no more files 
    Do Until sFile = "" 

     Debug.Print sFile 
     'subsequent calls without param return next file 
     sFile = Dir 

    Loop 

End Sub 

Nếu bạn muốn intellisense và nhiều khả năng vượt ra ngoài nhận tên tệp, tôi sẽ đề xuất FileSystemObject. Bạn có thể thêm một tham chiếu đến để "Windows Script Host Object Model" (hoặc "Windows Scripting Runtime") và tuyên bố đối tượng của bạn như sau:

Public Sub ListFilesFSO(ByVal sPath As String) 

    Dim oFSO As FileSystemObject 
    Dim oFolder As Folder 
    Dim oFile As File 

    Set oFSO = New FileSystemObject 
    Set oFolder = oFSO.GetFolder(sPath) 
    For Each oFile In oFolder.Files 
     Debug.Print oFile.Name 
    Next 'oFile 

    Set oFile = Nothing 
    Set oFolder = Nothing 
    Set oFSO = Nothing 

End Sub 
+0

Tôi vẫn nhận được chúng ở định dạng Biến thể và tôi nhận được tất cả các tệp và không chỉ các tệp Excel. –

+0

Viết câu lệnh if để kiểm tra tên tệp ... Nếu LCase (Phải (sPath, 5)) = ".xlsx" Sau đó hoặc bạn có thể muốn xem thuộc tính File.Type. –

+0

Khai báo các biến của bạn dưới dạng loại chính xác và chúng sẽ không phải là biến thể. –

Các vấn đề liên quan