image

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. Nó không chỉ có thể truy cập tệp, thư mục và tệp văn bản mà còn có thể tạo. 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 tệp. Nó có nghĩa là bạn có thể truy cập ổ đĩa pen, rom cd hoặc ổ đĩa mạng được kết nối hầu như không có.

Đây là những thao tác chúng ta có thể thực hiện bằng FileSystemObject trong VBA:

Để tạo, mở, đọc, ghi và xóa các tệp văn bản.

Để thêm, thay đổi và xóa các thư mục.

Lặp lại các tệp và thư mục.

Để sao chép và di chuyển tệp hoặc thư mục sang nơi khác.

Để kiểm tra xem một tệp hoặc thư mục có tồn tại ở vị trí hay không

Làm thế nào để truy cập 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ằng TextStream Object.

Có hai phương pháp để tạo FileSystemObject trong VBA:

1: Tạo đối tượng FSO bằng phương thức CreateObject:

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. Nó có nghĩa là, nếu bạn đang chia sẻ mã cho các hệ thống khác, mã này sẽ hoạt động hoàn toàn tốt. Nó sẽ không quan trọng bạn có phiên bản Microsoft Runtime Scripting nào.

Hạn chế duy nhất là bạn sẽ không thể xem intellisense do 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.

2: Tạo Đối tượng FSO bằng cách Thêm Tham chiếu vào Microsoft Runtime Scripting Bạn có thể tạo trực tiếp một FileSystemObject trong VBA bằng cách sử dụng từ khóa mới.

Đối với điều đó, 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 nó và nhấp vào OK.

image

Bây giờ bạn đã sẵn sàng để tạo và sử dụng đối tượng FSO.

Sub LearnFso()

Dim fso as new FileSystemObject

Debug.Print fso.GetBaseName("E:\MTR\Feb'18 MTR")

End Sub

Hoặc

Sub LearnFso()

Dim fso as FileSystemObject

Set fso = New FileSystemObject

Debug.Print fso.GetBaseName("E:\MTR\Feb'18 MTR")

End Sub

Cả hai sẽ hoạt động tốt.

Một ưu điểm chính của phương pháp này là bạn sẽ có thể nhìn thấy trí thông minh 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. Nó cũng sẽ cho biết loại biến nào nó sẽ chấp nhận và loại giá trị nào nó sẽ trả về.

image

Nếu bạn chia sẻ mã này với các hệ thống khác, bạn sẽ phải yêu cầu họ thêm tham chiếu đến Thời gian chạy kịch bản từ các công cụ, nếu không họ sẽ gặp lỗi biên dịch mà kiểu do người dùng xác định không được xác định. Vì vậy, nó giống như nhập các ngôn ngữ lập trình khác.

Lưu ý rằng FSO không phải là một từ khóa. Bạn có thể sử dụng nó như một tên biến. Nó chỉ là một quy ước để đặt tên hệ thống tệp là fso. Đó là lý do tại sao một số người nhầm lẫn nó là một từ khóa. 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à tôi đã đề cập trong khi giải thích chúng. Vì vậy, sử dụng theo nhu cầu của bạn. Trong bài viết này, tôi sẽ sử dụng phương pháp thứ hai để tạo FileSystemObject.

Bây giờ 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. Ý tôi là chúng ta hãy chuyển sang các ví dụ.

Ví dụ 1: Lấy tất cả thư mục con trong một thư mục được chỉ định 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 subfdr As Folder     ' Variable for the sub folders

Dim fdrpath As String 'to store path of base folder

'Intializing the objects

fdrpath = "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

'loop to get all the sub folders name in

For Each subfdr In fdr.SubFolders

Debug.Print subfdr.Name

Next subfdr

End Sub

Khi bạn chạy đoạn mã trên, đây là những gì bạn nhận được.

image

Vâng! Đó là thư mục tải xuống của tôi. Đừng tập trung vào điều đó.

Làm thế nào điều này hoạt động?

Hãy hiểu theo các bước:

1: Khai báo các biến mà chúng ta sẽ cần

Dim fso As FileSystemObject ‘Biến cho FileSystemObject Dim fdr As Folder’ Biến cho thư mục cơ sở Dim subfdr As Folder ‘Biến cho các thư mục con Đầ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.

2: Giới thiệu các đối tượng

fdrpath = “D: \ Downloads” _ ‘Khai báo thư mục _Set fso = New FileSystemObject’ Tạo đối tượng fso Set fdr = fso.GetFolder (fdrpath) ‘Tạo đối tượng thư mục của thư mục nhất định Trong bước này, chúng tôi khởi tạo tất cả các đối tượng 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.

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 Trong fdr.SubFolders Debug.Print subfdr.Name Tiếp theo subfdr Ở đây chúng tôi đã sử dụng a for each loop để 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.

Chúng tôi sử dụng thuộc tính name để lấy tên của mỗi thư mục con. Và nó được thực hiện.

Ví dụ 2: Lấy tất cả đường dẫn tệp trong một thư mục và đó là các thư mục con Để lấy 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 trong ví dụ 1 mã.

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 fl As File    'to store file object

fdrpath = "D:\downloads"

Set fso = New FileSystemObject

Set fdr = fso.GetFolder(fdrpath)

'loop to get all the sub folders name in

For Each subfdr In fdr.SubFolders

For Each fl In subfdr.Files 'to loop throgh each file

Debug.Print fl.Path 'getting file name

Next fl

Next subfdr

'to get the files of main folder

For Each fl In fdr.Files

Debug.Print fl.Path

Next fl

End Sub

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. Mỗi 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 của thư mục chính và của nó. Để 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.

Ví dụ 3: Lưu tên tệp trong tệp CSV.

Trong ví dụ trước, chúng ta đã học cách in đường dẫn tệp của các thư mục cụ thể trên cửa sổ ngay lập tức. 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ã bu lông 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 fl As File    'to store file object

Dim fileList As TextStream 'A textstream object

fdrpath = "D:\downloads"

Set fso = New FileSystemObject

Set fdr = fso.GetFolder(fdrpath)

Set fileList = fso.CreateTextFile(fdrpath & "\File List in This Folder.csv", True, False)

'loop to get all the sub folders name in

For Each subfdr In fdr.SubFolders

For Each fl In subfdr.Files 'to loop through each file

fileList.Write fl.Path & ","

Next fl

Next subfdr

'to get the files of main folder

For Each fl In fdr.Files

fileList.Write fl.Path & ","

Next fl

fileList.Close

End Sub

Ở đâ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 tôi đã khởi tạo biến filelist với một đối tượng filestream bằng dòng bên dưới.

Đặt fileList = fso.CreateTextFile (fdrpath & “\ File List in This Folder.csv”, True, False) Chúng tôi sử dụng phương thức CreateTextFile của FSO để tạo một đối tượng FileStream.

Nó 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 có đường dẫn hoàn chỉnh. Biến đầu tiên đang làm như vậy. Chúng tôi 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à Sai để tuyên bố rằng nó không phải là một tệp nhị phân. Trong các vòng lặp, chúng tôi 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. Vì vậy, các bạn, đây là cách bạn có thể sử dụng FileSystemObject. FSO có thể được sử dụng cho nhiều việc khác mà chúng ta sẽ thảo luận trong các bài viết sắp tới. Nếu bạn có bất kỳ nghi ngờ nào về bài viết này của truy vấn liên quan đến FSO, hãy hỏi tôi trong phần bình luận bên dưới.

Bài viết liên quan:

Nó là một ngôn ngữ lập trình của Microsoft. Nó được sử dụng với các ứng dụng Microsoft Office như MSExcel, MS-Word và MS-Access trong khi các biến VBA là các từ khóa cụ thể.

Bạn muốn yêu cầu Excel không hiển thị cảnh báo này và xóa trang tính chết tiệt.

Bài viết phổ biến:

Chức năng Countif là cần thiết để chuẩn bị bảng điều khiển của bạn.