FileSystemObject được sử dụng để làm việc với các thư mục và tệp được kết nối với hệ thống. Chúng ta có thể sử dụng nó để truy cập các tệp, thư mục, ổ đĩa và các luồng văn bản.
Ngoài ra, FSO còn có thể sử dụng để tạo các tệp, thư mục. Các hoạt động này không giới hạn ở đĩa cứng của hệ thống mà là bất kỳ thiết bị nào được kết nối với file của bạn. Nghĩa là bạn có thể truy cập ổ đĩa pen, rom cd hoặc các ổ đĩa ảo được kết nối khác.
Đây là những thao tác chúng ta có thể thực hiện bằng FileSystemObject trong VBA:
Đối tượng hệ thống tệp là một phần của Microsoft Scripting Runtime Library. Để truy cập một FileSystemObject, chúng ta cần kết nối hoặc thêm một tham chiếu đến Microsoft Scripting Runtime Library hoặc Scrrun.dll.
Lưu ý: FileSystemObject không hỗ trợ hoạt động của các tệp nhị phân vì Scrrun.dll hỗ trợ tạo và thao tác các tệp bởi TextStream Object.
Với VBA, bạn có thể tăng ít nhất 200% năng suất và tiết kiệm thời gian làm việc một cách tối đa. Hơn thế nữa, khi tận dụng lợi thế của lập trình VBA để tự động hóa thao tác và nghiệp vụ trên Excel, bạn có thể tiết kiệm hàng giờ mệt mỏi vì làm báo cáo, quản lý dữ liệu.
Nếu bạn đang không biết học lập trình VBA trong Excel ở đâu, tham khảo ngay các khóa học của Gitiho ngay dưới đây:
Có hai phương pháp để tạo FileSystemObject trong VBA:
Sử dụng phương pháp này trước tiên chúng ta khai báo một kiểu đối tượng biến. Sau đó, đặt tham chiếu của đối tượng FSO cho biến đó bằng cách sử dụng CreateObject:
Sub LearnFso() 'Creating the object variable Dim fso As Object 'Create the FileSystemObject using Create Object Method Set fso = CreateObject("Scripting.FileSystemObject") Debug.Print fso.GetBaseName("E:\MTR\Feb'18 MTR") End Sub
Phương thức này là động và có thể chuyển nhượng. Nghĩa là, nếu bạn chia sẻ cho các hệ thống khác, đoạn code này sẽ hoạt động hoàn hảo, cho dù bạn đang sử dụng phiên bản Microsoft Runtime Scripting nào.
Hạn chế duy nhất là bạn sẽ không thể tận dụng những ưu điểm mà VBA cung cấp. Bạn sẽ phải phụ thuộc vào kiến thức của mình để sử dụng tất cả các thuộc tính và phương thức của FileSystemObject.
Bạn có thể trực tiếp tạo một FileSystemObject trong VBA bằng cách sử dụng từ khóa mới. Đối với cách này, bạn sẽ phải thêm tham chiếu đến Microsoft Scripting Runtime mới nhất trong hệ thống của mình.
Để thêm tham chiếu, hãy chuyển đến tùy chọn tham chiếu trong menu công cụ. Tại đây, hãy tìm dll Microsoft Scripting Runtime. Kiểm tra và nhấp vào OK.
Bây giờ bạn đã sẵn sàng để tạo và sử dụng FSO.
Sub LearnFso()
Dim fso as new FileSystemObject
Debug.Print fso.GetBaseName("E:\MTR\Feb'18 MTR")
End Sub
hoặc là
Sub LearnFso()
Dim fso as FileSystemObject
Set fso = New FileSystemObject
Debug.Print fso.GetBaseName("E:\MTR\Feb'18 MTR")
End Sub
Cả hai đoạn code này đều hoạt động tốt.
Ưu điểm chính của phương pháp này là bạn sẽ có thể tận dụng những ưu điểm của VBA. VBA sẽ hiển thị cho bạn tất cả các thuộc tính và phương thức của đối tượng FSO. Bạn cũng sẽ biết loại biến nào được chấp nhận và loại giá trị nào bị trả về.
Nếu bạn chia sẻ code này cho các hệ thống khác, bạn sẽ phải yêu cầu họ thêm tham chiếu đến Scripting Runtime từ tools của họ, nếu không sẽ gặp lỗi biên dịch bởi kiểu do người dùng xác định không được xác định.
Cả hai phương pháp tạo đối tượng FSO đều có những ưu điểm và nhược điểm mà chúng ta đã đề cập bên trên. Vì vậy, tùy theo mục đích sử dụng, bạn có thể cọn phương pháp phù hợp nhất.
Trong phần tiếp theo của bài viết này, chúng ta sẽ sử dụng phương pháp thứ hai để tạo FileSystemObject.
Chúng ta đã biết cách tạo FileSystemObject trong VBA, hãy sử dụng kiến thức này để thực hiện một số tác vụ có ý nghĩa. Hãy quan sát các ví dụ bên dưới.
Ví dụ đầu tiên chúng ta sẽ thấy là lấy tên thư mục con từ một thư mục cụ thể.
Sub LearnFso()
' decaring variables that we will need
Dim fso As FileSystemObject ' Variable for the FileSystemObject
Dim fdr As Folder ' Variable for the base folder Dim fdrpath As String 'to store path of base folder
Dim subfdr As Folder ' Variable for the sub folders 'Intializing the objects Set fdr = fso.GetFolder(fdrpath) 'Creating the folder object of given folder
fdrpath = "D:\Downloads" 'Declaring the folder Set fso = New FileSystemObject 'Creating the fso object End Sub
'loop to get all the sub folders name in For Each subfdr In fdr.SubFolders Debug.Print subfdr.Name Next subfdr
Khi bạn chạy đoạn mã trên, đây là những gì bạn nhận được.
Đoạn code này hoạt động như thế nào? Hãy tìm hiểu từng bước một nhé.
Bước 1. Khai báo các biến mà chúng ta cần
Dim fso As FileSystemObject ' Variable for the FileSystemObject
Dim fdr As Folder ' Variable for the base folder
Dim subfdr As Folder ' Variable for the sub folders
Đầu tiên, chúng ta đã khai báo tất cả các biến mà chúng ta sẽ cần trong ví dụ này. Biến đầu tiên tất nhiên là đối tượng fso as file sytem. Hai biến fdr và subfdr thuộc loại thư mục. Chúng ta sẽ sử dụng đối tượng fso để tạo đối tượng kiểu tệp thay vì tạo trực tiếp. Biến fdrpath is use được sử dụng để giữ đường dẫn của thư mục cơ sở mà chúng ta muốn lấy tất cả các thư mục con.
Bước 2. Khởi chạy các đối tượng
drpath = "D:\Downloads" 'Declaring the folder
Set fso = New FileSystemObject 'Creating the fso object
Set fdr = fso.GetFolder(fdrpath) 'Creating the folder object of given folder
Trong bước này, chúng tôi khởi tạo tất cả các đối tượng mà chúng tôi đã khai báo ngoại trừ subfdr. Lưu ý rằng chúng tôi đã intialize biến tệp fdr bằng phương thức getFolder của đối tượng fso.
Phương thức GetFolder () của FileSystemObject lấy đường dẫn của một thư mục hoặc thư mục dưới dạng chuỗi và trả về đối tượng loại tệp.
Bước 3. Vòng lặp để lấy tất cả tên thư mục con trong đối tượng thư mục
For Each subfdr In fdr.SubFolders
Debug.Print subfdr.Name
Next subfdr
Ở đây chúng tôi đã sử dụng vòng lặp for each để lặp qua từng thư mục con trong đối tượng tệp fdr. Chúng tôi đã sử dụng thuộc tính SubFolders của đối tượng tệp để lặp lại. Sau đó, sử dụng thuộc tính name để lấy tên của mỗi thư mục con.
Để có được tất cả các đường dẫn hoặc tên đủ điều kiện của tất cả các tệp trong một thư mục và đó là thư mục con, chúng ta cần thêm một vài dòng nữa bên trong đoạn code của ví dụ 1.
Sub LearnFso()
Dim fso As FileSystemObject
Dim fdr As Folder ' Variable for the base folder
Dim subfdr As Folder ' Variable for the sub folders Dim fdrpath As String 'to store path of base folder fdrpath = "D:\downloads"
Dim fl As File 'to store file object Set fso = New FileSystemObject For Each subfdr In fdr.SubFolders
Set fdr = fso.GetFolder(fdrpath) 'loop to get all the sub folders name in Next subfdr
For Each fl In subfdr.Files 'to loop throgh each file Debug.Print fl.Path 'getting file name Next fl End Sub
'to get the files of main folder For Each fl In fdr.Files Debug.Print fl.Path Next fl
Phương thức Folder.Files () là phương thức trả về các tệp trong một thư mục con. Phương thức File.Path () trả về địa chỉ đầy đủ của tệp.
Chúng ta có một vòng lặp bên trong để lặp qua tất cả các tệp trong thư mục con và thư mục chính.
Để lấy các tệp của thư mục chính, chúng ta sử dụng một vòng lặp khác.
Trong ví dụ trước, chúng ta đã học cách lấy đường dẫn tệp của các thư mục cụ thể trên cửa sổ. Trong ví dụ này, chúng ta sẽ tìm hiểu cách lưu các đường dẫn đó trong tệp CSV. Để làm như vậy, chúng ta chỉ cần thêm một vài dòng vào mã. Xem các dòng mã bên dưới.
Sub LearnFso()
Dim fso As FileSystemObject
Dim fdr As Folder ' Variable for the base folder
Dim subfdr As Folder ' Variable for the sub folders Dim fdrpath As String 'to store path of base folder Dim fileList As TextStream 'A textstream object
Dim fl As File 'to store file object fdrpath = "D:\downloads" Set fileList = fso.CreateTextFile(fdrpath & "\File List in This Folder.csv", True, False)
Set fso = New FileSystemObject Set fdr = fso.GetFolder(fdrpath) For Each fl In subfdr.Files 'to loop through each file
'loop to get all the sub folders name in For Each subfdr In fdr.SubFolders For Each fl In fdr.Files
fileList.Write fl.Path & "," Next fl Next subfdr 'to get the files of main folder End Sub
fileList.Write fl.Path & "," Next fl fileList.Close
Ở đây, chúng ta đã khai báo một đối tượng mới của kiểu FileStream có tên là fileList
Chúng ta cũng đã khởi tạo biến filelist với một đối tượng filestream bằng dòng bên dưới.
Set fileList = fso.CreateTextFile(fdrpath & "\File List in This Folder.csv", True, False)
Tiếp theo, sử dụng phương thức CreateTextFile của FSO để tạo đối tượng FileStream. Đối tượng này sẽ tạo ra một tệp văn bản.
Phương thức này chấp nhận tên của một tệp với một đường dẫn hoàn chỉnh. Biến đầu tiên đang làm như vậy.
Chúng ta sử dụng phần mở rộng .csv để tạo tệp csv. Biến thứ hai được sử dụng để cho phép ghi đè.
Đối số thứ ba là False để tuyên bố rằng nó không phải là tệp nhị phân.
Trong các vòng lặp, chúng ta thay thế debug.print bằng phương thức filelist.Write để ghi từng đường dẫn tệp trong tệp được tạo.
Hy vọng qua bài viết này, bạn đã có thể sử dụng tốt FileSystemObject trong VBA Excel. Đừng quên tham gia Gitiho ngay hôm nay nhé, chúng ta còn nhiều mẹo và thủ thuật tin học văn phòng hữu ích khác chờ được khám phá.
Khóa học phù hợp với bất kỳ ai đang muốn tìm hiểu lại Excel từ con số 0. Giáo án được Gitiho cùng giảng viên thiết kế phù hợp với công việc thực tế tại doanh nghiệp, bài tập thực hành xuyên suốt khóa kèm đáp án và hướng dẫn giải chi tiết. Tham khảo ngay bên dưới!