THAO TÁC VỚI TẬP TIN DÙNG VBA HAY ĐỐI TƯỢNG FILESEARCH
(Lược dịch từ sách Excel 2000 Power Programming)
Rất nhiều ứng dụng bạn phát triển cho Excel phải làm việc với những file ở bên ngòai. Ví dụ bạn muốn liệt kê các file trong một thư mục, xóa file, đặt lại tên file,vv. Và dĩ nhiên là có thể nhập hay xuất dữ liệu.
VBA cung cấp cho các bạn nhiều hàm và statement (tạm dịch là phát biểu) giúp bạn thao tác với các tập tin lưu trên đĩa. Nếu bạn dùng Excel 2000 bạn có thể dùng đối tượng FileSearch , nó sẽ dễ dàng hơn khi bạn dùng VBA statement và hàm.
Các lệnh VBA bạn có thể dùng để làm việc với các File là:
Lệnh - Command
Mục đích - What it does
ChDir
Thay đổi thư mục hiện tại
CurDrive
Thay đổi ổ đỉa hiện tại
Dir
Trả về tên File hay tên thư mục khớp với ký tự đặc biệt hay thuộc tính của file
FileCopy
Sao chép một file
FileDateTime
Trả về ngày giờ cuối cùng mà file được sửa chữa
FileLen
Trả về kích thước của file (bytes)
GetAttr
Trả về ký tự đại diện cho thuộc tính của file
Kill
Xóa một file
MkDir
Tạo thư mục mới
Name
Đặt tên file hay thư mục
RmDir
Xóa một thư mục rỗng
SetAttr
Thay đổi thuộc tính của file
Vậy để xác định một file có tồn tại hay không ta có thể viết một hàm sau:
Function FileExists(fname) As Boolean
If Dir(fname)<>"" Then
FileExists=True
Else FileExists=False
End Function
fname: đường dẫn có cả tên file
Xin tham khảo bài các hàm tiện ích.
Sử dụng đối tượng FileSearch
Phương thức hay thuộc tính
Mục đích
FileName
Chỉ định tên file (các ký tự thay thế cũng được chấp nhận)
FoundFile
Trả về một đối tượng chứa các tên file được tìm thấy
LookIn
Thư mục cần tìm
SearchSubfolders
Trả về True nếu thư mục con được tìm
Execute
Thực hiện tìm kiếm
NewSearch
Reset lại đối tượng FileSearch
Các bạn hãy đưa đọan mã này vào trong module và thiết lập một nút lệnh trên worksheet của bạn, thiết lập Assign Macro cho nút lệnh là hàm ListFile
'32-bit API declarations
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Sub ListFiles()
Msg = "Select a location containing the files you want to list."
Directory = GetDirectory(Msg)
If Directory = "" Then Exit Sub
If Right(Directory, 1) <> "\" Then Directory = Directory & "\"
' Insert headers
r = 1
Cells.ClearContents
Cells(r, 1) = "FileName"
Cells(r, 2) = "Size"
Cells(r, 3) = "Date/Time"
Range("A1:C1").Font.Bold = True
r = r + 1
On Error Resume Next
With Application.FileSearch
.NewSearch
.LookIn = Directory
.Filename = "*.*"
.SearchSubFolders = False
.Execute
For i = 1 To .FoundFiles.Count
Cells(r, 1) = .FoundFiles(i)
Cells(r, 2) = FileLen(.FoundFiles(i))
Cells(r, 3) = FileDateTime(.FoundFiles(i))
r = r + 1
Next i
End With
End Sub
Function GetDirectory(Optional Msg) As String
Dim bInfo As BROWSEINFO
Dim path As String
Dim r As Long, x As Long, pos As Integer
' Root folder = Desktop
bInfo.pidlRoot = 0&
' Title in the dialog
If IsMissing(Msg) Then
bInfo.lpszTitle = "Select a folder."
Else
bInfo.lpszTitle = Msg
End If
' Type of directory to return
bInfo.ulFlags = &H1
' Display the dialog
x = SHBrowseForFolder(bInfo)
' Parse the result
path = Space$(512)
r = SHGetPathFromIDList(ByVal x, ByVal path)
If r Then
pos = InStr(path, Chr$(0))
GetDirectory = Left(path, pos - 1)
Else
GetDirectory = ""
End If
End Function
Bạn sẽ thấy sự tiện lợi của đối tượng FileSearch.
Chúc các bạn thành công.
Lê Văn Duyệt.