RaoVat24h
Office Word

Sử dụng VBA FileSystemObject (FSO) trong Excel – Tổng quan & ví dụ dễ dàng

Advertisement

Khi chúng ta sử dụng VBA trong Excel, phần lớn là để tự động hóa các tác vụ của chúng ta.
Điều này cũng có nghĩa là hầu hết thời gian, chúng tôi làm việc với các ô và phạm vi , trang tính , sổ làm việc và các đối tượng khác là một phần của ứng dụng Excel.
Nhưng VBA mạnh hơn rất nhiều và cũng có thể được sử dụng để làm việc với các công cụ bên ngoài Excel.
Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách sử dụng VBA FileSystemObject (FSO) để làm việc với các tệp và thư mục trên hệ thống hoặc ổ đĩa mạng của bạn.

VBA FileSystemObject (FSO) là gì?

FileSystemObject (FSO) cho phép bạn truy cập vào hệ thống tệp của máy tính. Sử dụng nó, bạn có thể truy cập và sửa đổi các tập tin / thư mục / thư mục trong hệ thống máy tính của bạn.
Ví dụ, dưới đây là một số điều bạn có thể làm bằng cách sử dụng FileSystemObject trong Excel VBA:
  • Kiểm tra xem tệp hoặc thư mục có tồn tại không.
  • Tạo hoặc đổi tên các thư mục / tập tin.
  • Nhận danh sách tất cả tên tệp (hoặc tên thư mục con) trong một thư mục.
  • Sao chép tệp từ một thư mục này sang thư mục khác.
Tôi hy vọng bạn có được ý tưởng.
Tôi sẽ trình bày tất cả các ví dụ trên (cộng thêm) sau trong hướng dẫn này.
Trong khi một số điều được đề cập ở trên cũng có thể được thực hiện bằng cách sử dụng các hàm VBA truyền thống (như hàm DIR ) và các phương thức, điều đó sẽ dẫn đến các mã dài hơn và phức tạp hơn. FileSystemObject làm cho nó dễ dàng để làm việc với các tập tin và thư mục trong khi giữ mã sạch sẽ và ngắn.
Lưu ý: FSO chỉ có thể được sử dụng trong Excel 2000 và các phiên bản mới hơn.

Bạn có thể truy cập tất cả các đối tượng nào thông qua FileSystemObject?

Như tôi đã đề cập ở trên, bạn có thể truy cập và sửa đổi các tệp và thư mục bằng cách sử dụng FileSystemObject trong VBA.
Dưới đây là bảng hiển thị các đối tượng quan trọng nhất mà bạn có thể truy cập và sửa đổi bằng FSO:
Vật Sự miêu tả
Lái xe Drive Object cho phép bạn nhận thông tin về ổ đĩa như cho dù nó tồn tại hay không, đó là tên đường dẫn, loại ổ đĩa (có thể tháo rời hoặc cố định), kích thước của nó, v.v.
Thư mục Đối tượng thư mục cho phép bạn tạo hoặc sửa đổi các thư mục trong hệ thống của bạn. Ví dụ, bạn có thể tạo, xóa, đổi tên, sao chép các thư mục bằng cách sử dụng đối tượng này.
Tập tin File Object cho phép bạn làm việc với các tập tin trong hệ thống của bạn. Ví dụ, bạn có thể tạo, mở, sao chép, di chuyển và xóa các tập tin bằng cách sử dụng đối tượng này.
TextStream Đối tượng TextStream cho phép bạn tạo hoặc đọc các tập tin văn bản.
Mỗi đối tượng trên có các phương thức mà bạn có thể sử dụng để làm việc với các phương thức này.
Để cung cấp cho bạn một ví dụ, nếu bạn muốn xóa một thư mục, bạn sẽ sử dụng phương thức DeleteFolder của đối tượng Folder. Tương tự, nếu bạn muốn sao chép một tệp, bạn sẽ sử dụng phương thức CopyFile của đối tượng Tệp.
Đừng lo lắng nếu điều này có vẻ áp đảo hoặc khó hiểu. Bạn sẽ có được một sự hiểu biết tốt hơn nhiều khi bạn đi qua các ví dụ mà tôi đã đề cập trong hướng dẫn này.
Chỉ với mục đích tham khảo, tôi đã trình bày tất cả các phương thức FileSystemObject (cho mỗi đối tượng) ở cuối hướng dẫn này .

Kích hoạt FileSystemObject trong Excel VBA

FileSystemObject không có sẵn theo mặc định trong Excel VBA.
Vì chúng ta đang xử lý các tệp và thư mục nằm ngoài ứng dụng Excel, trước tiên chúng ta cần tạo một tham chiếu đến thư viện chứa các đối tượng này (ổ đĩa, tệp, thư mục).
Bây giờ có hai cách bạn có thể bắt đầu sử dụng FileSystemObject trong Excel VBA:
  1. Đặt tham chiếu đến Thư viện Thời gian chạy Microsoft Scripting (Scrrun.dll)
  2. Tạo một đối tượng để tham chiếu đến thư viện từ chính mã đó
Mặc dù cả hai phương thức này đều hoạt động (và tôi sẽ chỉ cho bạn cách thực hiện việc này tiếp theo), tôi khuyên bạn nên sử dụng phương pháp đầu tiên.
Lưu ý: Khi bạn bật FileSystemObject, bạn có thể truy cập tất cả các đối tượng trong đó. Điều này bao gồm FileSystemObject, Drive, Files, Folders, vv Tôi sẽ tập trung chủ yếu vào FileSystemObject trong hướng dẫn này.

Đặt tham chiếu đến thư viện thời gian chạy Microsoft Scripting

Khi bạn tạo một tham chiếu đến Thư viện Runtime Scripting, bạn cho phép Excel VBA truy cập vào tất cả các thuộc tính và phương thức của các tệp và thư mục. Một khi điều này được thực hiện, bạn có thể tham khảo các đối tượng tập tin / thư mục / ổ đĩa từ bên trong VBA Excel (giống như bạn có thể tham khảo các ô, trang tính hoặc sổ làm việc).
Dưới đây là các bước để tạo tham chiếu đến Thư viện Thời gian chạy Microsoft Scripting:
  1. Trong VB Editor, nhấp vào Tools.Công cụ trong Excel VB Editor Thanh công cụ
  2. Nhấp vào Tham khảo.Tham khảo Tùy chọn trong Excel VB Editor Thanh công cụ
  3. Trong hộp thoại Tham khảo mở ra, cuộn qua các tham chiếu có sẵn và kiểm tra tùy chọn ‘Microsoft Scripting Runtime’.Scrrun Microsoft Scripting Runtime Library tùy chọn kiểm tra
  4. Nhấp vào OK.
Các bước trên sẽ cho phép bạn tham khảo các đối tượng FSO từ Excel VBA.

Tạo một thể hiện của FileSystemObject trong mã

Khi bạn đã đặt tham chiếu đến thư viện ScriptS FileOystem, bạn cần phải tạo một cá thể của đối tượng FSO trong mã của bạn.
Một khi điều này được tạo ra, bạn có thể sử dụng nó trong VBA.
Dưới đây là mã sẽ đặt biến đối tượng MyFSO thành đối tượng FileSystemObject:
Sub CreatingFSO()
Dim MyFSO As FileSystemObject
Set MyFSO = New FileSystemObject
End Sub

Trong mã này, đầu tiên tôi đã khai báo biến MyFSO như là một đối tượng kiểu FileSystemObject. Điều này là có thể chỉ vì tôi đã tạo một tham chiếu đến Microsoft Scripting Runtime Library. Nếu tham chiếu không được tạo, điều này sẽ cho bạn một lỗi (vì Excel sẽ không nhận ra những gì FileSystemObject có nghĩa là).
Trong dòng thứ hai, hai điều xảy ra:
  1. Từ khóa MỚI tạo ra một thể hiện của FileSystemObject. Điều này có nghĩa rằng bây giờ tôi có thể sử dụng tất cả các phương pháp của FileSystemObject để làm việc với các tập tin và thư mục. Nếu bạn không tạo cá thể này, bạn sẽ không thể truy cập các phương thức của FSO.
  2. Từ khóa SET đặt đối tượng MyFSO thành thể hiện mới của FileSystemObject. Điều này cho phép tôi sử dụng đối tượng này để truy cập các tệp và thư mục. Ví dụ, nếu tôi cần tạo một thư mục, tôi có thể sử dụng phương thức MyFSO.CreateFolder.
Nếu bạn muốn, bạn cũng có thể kết hợp hai câu lệnh trên thành một như sau:
Sub CreatingFSO()
Dim MyFSO As New FileSystemObject
End Sub

Một lợi ích lớn của việc sử dụng phương thức này (để thiết lập tham chiếu đến Microsoft Scripting Runtime Library) là khi bạn sử dụng các đối tượng FSO trong mã của bạn, bạn sẽ có thể sử dụng tính năng IntelliSense cho thấy các phương thức và thuộc tính liên kết với một đối tượng (như được hiển thị bên dưới).
Intellisense trong FileSystemObject trong Excel VBA
Điều này là không thể khi bạn tạo tham chiếu từ bên trong mã (được trình bày tiếp theo).

Tạo một đối tượng từ mã

Một cách khác để tạo một tham chiếu đến FSO là thực hiện nó từ mã. Trong phương thức này, bạn không cần tạo bất kỳ tham chiếu nào (như đã thực hiện trong phương thức trước).
Khi bạn đang viết mã, bạn có thể tạo một đối tượng từ bên trong mã và tham khảo Scripting.FileSystemObject.
Đoạn mã dưới đây tạo một đối tượng FSO và sau đó tạo một kiểu FileSystemObject
Sub FSODemo()
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
End Sub
Trong khi điều này có vẻ thuận tiện hơn, một nhược điểm lớn của việc sử dụng phương pháp này là nó sẽ không hiển thị một IntelliSense khi bạn làm việc với các đối tượng trong FSO. Đối với tôi, đây là một tiêu cực lớn và tôi luôn khuyên bạn nên sử dụng phương pháp trước đây để kích hoạt FSO (đó là bằng cách đặt tham chiếu đến ‘Thời gian chạy Microsoft Scripting’)

Ví dụ về VBA FileSystemObject

Bây giờ chúng ta hãy đi sâu vào và xem xét một số ví dụ thực tế về việc sử dụng FileSystemObject trong Excel.

Ví dụ 1: Kiểm tra xem Tệp hoặc Thư mục có tồn tại không

Mã sau sẽ kiểm tra xem thư mục có tên ‘Kiểm tra’ tồn tại hay không (ở vị trí đã chỉ định).
Nếu thư mục tồn tại, điều kiện IF là Đúng và nó hiển thị một thông báo – ‘Thư mục tồn tại’ trong một hộp thư . Và nếu nó không tồn tại, nó sẽ hiển thị một thông điệp – Thư mục không tồn tại ‘.
Sub CheckFolderExist()
Dim MyFSO As FileSystemObject
Set MyFSO = New FileSystemObject
If MyFSO.FolderExists("C:UserssumitDesktopTest") Then
MsgBox "The Folder Exists"
Else
MsgBox "The Folder Does Not Exist"
End If
End Sub

Ví dụ 2: Tạo thư mục mới ở vị trí được chỉ định

Đoạn mã dưới đây sẽ tạo một thư mục có tên ‘Test’ trong ổ C của hệ thống của tôi (bạn sẽ phải chỉ định đường dẫn trên hệ thống của mình nơi bạn muốn tạo thư mục).
Sub CreateFolder()
Dim MyFSO As FileSystemObject
Set MyFSO = New FileSystemObject
MyFSO.CreateFolder ("C:UserssumitDesktopTest")
End Sub

Sub CreateFolder()
Dim MyFSO As FileSystemObject
Set MyFSO = New FileSystemObject
If MyFSO.FolderExists("C:UserssumitDesktopTest") Then
MsgBox "The Folder Already Exist"
Else
MyFSO.CreateFolder ("C:UserssumitDesktopTest")
End If
End Sub

Ví dụ 3: Nhận danh sách tất cả các tệp trong một thư mục

Sub GetFileNames()
Dim MyFSO As FileSystemObject
Dim MyFile As File
Dim MyFolder As Folder

Set MyFSO = New Scripting.FileSystemObject
Set MyFolder = MyFSO.GetFolder("C:UserssumitDesktopTest")

For Each MyFile In MyFolder.Files
Debug.Print MyFile.Name
Next MyFile

End Sub

Ví dụ 4: Lấy danh sách tất cả các thư mục con trong một thư mục

Mã dưới đây sẽ cung cấp tên của tất cả các thư mục con trong thư mục được chỉ định. Logic là chính xác giống như được trình bày trong ví dụ trên. Thay vì các tệp, trong mã này, chúng tôi đã sử dụng các thư mục con.
Sub GetSubFolderNames()
Dim MyFSO As FileSystemObject
Dim MyFile As File
Dim MyFolder As Folder
Dim MySubFolder As Folder

Set MyFSO = New Scripting.FileSystemObject
Set MyFolder = MyFSO.GetFolder("C:UserssumitDesktopTest")

For Each MySubFolder In MyFolder.SubFolders
Debug.Print MySubFolder.Name
Next MySubFolder

End Sub

Ví dụ 5: Sao chép tệp từ một địa điểm sang địa điểm khác

Đoạn mã dưới đây sẽ sao chép tệp từ thư mục ‘Nguồn’ và sao chép nó vào thư mục ‘Đích’.
Sub CopyFile()
Dim MyFSO As FileSystemObject
Dim SourceFile As String
Dim DestinationFolder As String
Set MyFSO = New Scripting.FileSystemObject

SourceFile = "C:UserssumitDesktopSourceSampleFile.xlsx"
DestinationFolder = "C:UserssumitDesktopDestination"

MyFSO.CopyFile Source:=SourceFile, Destination:=DestinationFolder & "SampleFileCopy.xlsx"

End Sub

Ví dụ 6: Sao chép tất cả các tệp từ một thư mục sang thư mục khác

Mã dưới đây sẽ sao chép tất cả các tệp từ thư mục Nguồn vào thư mục đích.
Sub CopyFile()
Dim MyFSO As FileSystemObject
Dim SourceFile As String
Dim DestinationFolder As String
Set MyFSO = New Scripting.FileSystemObject

SourceFile = "C:UserssumitDesktopSourceSampleFile.xlsx"
DestinationFolder = "C:UserssumitDesktopDestination"

MyFSO.CopyFile Source:=SourceFile, Destination:=DestinationFolder & "SampleFileCopy.xlsx"

End Sub

Ví dụ 6: Sao chép tất cả các tệp từ một thư mục sang thư mục khác

Mã dưới đây sẽ sao chép tất cả các tệp từ thư mục Nguồn vào thư mục đích.
Sub CopyAllFiles()
Dim MyFSO As FileSystemObject
Dim MyFile As File
Dim SourceFolder As String
Dim DestinationFolder As String
Dim MyFolder As Folder
Dim MySubFolder As Folder

SourceFolder = "C:UserssumitDesktopSource"
DestinationFolder = "C:UserssumitDesktopDestination"

Set MyFSO = New Scripting.FileSystemObject
Set MyFolder = MyFSO.GetFolder(SourceFolder)

For Each MyFile In MyFolder.Files
MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _
Destination:=DestinationFolder & "" & MyFile.Name, Overwritefiles:=False
Next MyFile

End Sub
Đoạn mã trên sẽ sao chép tất cả các tệp từ thư mục Nguồn vào Thư mục đích.
Lưu ý rằng trong phương thức MyFSO.CopyFile, tôi đã xác định thuộc tính ‘Overwritefiles’ là False (điều này là True theo mặc định). Điều này đảm bảo rằng trong trường hợp bạn đã có tệp trong thư mục, nó không được sao chép (và bạn sẽ thấy một lỗi). Nếu bạn xóa ‘Ghi đè lên’ hoặc đặt thành True, trong trường hợp có các tệp trong thư mục đích có cùng tên, chúng sẽ bị ghi đè.
Mẹo chuyên nghiệp: Khi sao chép tệp, luôn có khả năng ghi đè tệp. Một ý tưởng hay, trong trường hợp này, là thêm dấu thời gian cùng với tên. Điều này sẽ đảm bảo rằng các tên luôn khác nhau và bạn có thể dễ dàng theo dõi các tệp được sao chép vào thời điểm nào.
Nếu bạn chỉ muốn sao chép các tệp của một tiện ích mở rộng nhất định, bạn có thể thực hiện điều đó bằng cách sử dụng câu lệnh IF Then để kiểm tra xem tiện ích có phải là xlsx hay không.
Sub CopyExcelFilesOnly()
Dim MyFSO As FileSystemObject
Dim MyFile As File
Dim SourceFolder As String
Dim DestinationFolder As String
Dim MyFolder As Folder
Dim MySubFolder As Folder

SourceFolder = "C:UserssumitDesktopSource"
DestinationFolder = "C:UserssumitDesktopDestination"

Set MyFSO = New Scripting.FileSystemObject
Set MyFolder = MyFSO.GetFolder(SourceFolder)

For Each MyFile In MyFolder.Files
If MyFSO.GetExtensionName(MyFile) = "xlsx" Then
MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _
Destination:=DestinationFolder & "" & MyFile.Name, Overwritefiles:=False
End If
Next MyFile

End Sub

Các phương thức FileSystemObject (FSO)

Dưới đây là các phương pháp mà bạn có thể sử dụng cho từng đối tượng. Đây chỉ là mục đích tham khảo và không lo lắng quá nhiều. Việc sử dụng một số trong số này đã được thể hiện trong các ví dụ được đề cập ở trên.
FSO Methods For Object Description
DriveExists Drive Checks whether the drive exists or not
GetDrive Drive Returns an instance of the drive object based on the specified path
GetDriveName Drive Reruns the drive name
BuildPath File/Folder Generate a path from an existing path and a name
CopyFile File/Folder Copies a file
GetAbsolutePathName File/Folder Return the canonical representation of the path
GetBaseName File/Folder Return base name from a path. For example, “D:TestFolderTestFile.xlsm” will return TextFile.xlsm
GetTempName File/Folder Generate name that can be used to name a temporary file
CopyFolder Folder Copies a folder from one location to other
CreateFolder Folder Creates a new folder
DeleteFolder Folder Deletes the specified folder
FolderExists Folder Checks whether the Folder exists or not
GetFolder Folder Returns an instance of the folder object based on the specified path
GetParentFolderName Folder Retruns the name of the parent folder based on the specified path
GetSpecialFolder Folder Get the location of various system folders.
MoveFolder Folder Moves a folder from one location to other
DeleteFile File Deletes a file
FileExists File Checks if a file exists or not
GetExtensionName File Returns the file extension
GetFile File Returns the instance of a file object based on the specified path
GetFileName File Returns the file name
GetFileVersion File Returns the file version
MoveFile File Moves a file
CreateTextFile File Creates a text file
GetStandardStream File Retrieve the standard input, output or error stream
OpenTextFile File Open a file as a TextStream





Rate this post

DienDan.Edu.Vn

DienDan.Edu.Vn Cám ơn bạn đã quan tâm và rất vui vì bài viết đã đem lại thông tin hữu ích cho bạn.
DienDan.Edu.Vn! là một website với tiêu chí chia sẻ thông tin,... Bạn có thể nhận xét, bổ sung hay yêu cầu hướng dẫn liên quan đến bài viết. Vậy nên đề nghị các bạn cũng không quảng cáo trong comment này ngoại trừ trong chính phần tên của bạn.
Cám ơn.

Đăng bình luận

(+84) (901) 369.468