hoangminhtien
Thành viên gắn bó
- Tham gia
- 29/2/08
- Bài viết
- 1,660
- Được thích
- 2,190
- Nghề nghiệp
- Mechanical Engineering
Sub ShowFileList()
Sheet1.[E:E].ClearContents
folderspec = "C:\WINDOWS"
Dim fs, f, f1, fc, i
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(folderspec)
Set fc = f.Files
i = 1
For Each f1 In fc
Sheet1.Cells(i, 5) = f1.Name
i = i + 1
Next
End Sub
Thêm 1 link cho bạn tham khảo nè.Em có 1 folder chứa rất nhiều file. Em muốn lập 1 file excel để lấy tất cả tên các file này. Các bác xem ví dụ trong file đính kèm. Bác nào biết giúp em với nhé! Cám ơn các bác!
Gữi bạn code này:Em có 1 folder chứa rất nhiều file. Em muốn lập 1 file excel để lấy tất cả tên các file này. Các bác xem ví dụ trong file đính kèm. Bác nào biết giúp em với nhé! Cám ơn các bác!
Public Dic
Private Sub ListFilesInFolder(FolderName As String, InSub As Boolean)
Dim FileItem, SubFolder, FileName As String
On Error GoTo Thoat
With CreateObject("Scripting.FileSystemObject")
With .GetFolder(FolderName)
For Each FileItem In .Files
FileName = FolderName & "\" & FileItem.Name
Dic.Add FolderName & "\" & FileItem.Name, FileLen(FileName)
Next FileItem
If InSub Then
For Each SubFolder In .subFolders
ListFilesInFolder SubFolder.Path, True
Next SubFolder
End If
End With
End With
Thoat:
End Sub
Sub GetFileList()
Dim i As Long
Set Dic = Nothing
Set Dic = CreateObject("Scripting.Dictionary")
Range("A2:B60000").Clear
With Application.FileDialog(4)
.Show: .AllowMultiSelect = False
ListFilesInFolder .SelectedItems(1), True
End With
With Range("A2").Resize(Dic.Count)
.Value = WorksheetFunction.Transpose(Dic.Keys)
.Offset(, 1) = WorksheetFunction.Transpose(Dic.Items)
.Offset(, 1).NumberFormat = "#,##0 ""KB"""
End With
Columns("A:B").AutoFit
End Sub
Sub tenfile()
Dim dic As Object
Set dic = CreateObject("scripting.dictionary")
Fname = Dir(ThisWorkbook.Path & "\*.*")
Do While Fname <> ""
dic.Add Fname, ""
Fname = Dir
Loop
keys = Application.Transpose(dic.keys)
ten_file = Range([a2], [a65536].End(3)).Value
For j = 1 To UBound(ten_file, 1)
For i = 1 To UBound(keys)
If ten_file(j, 1) = keys(i, 1) Then MsgBox "Da tim thay file " & ten_file(j, 1)
Next
Next
[B2].Resize(i - 1, 1) = keys
End Sub
Em có 1 folder chứa rất nhiều file. Em muốn lập 1 file excel để lấy tất cả tên các file này. Các bác xem ví dụ trong file đính kèm. Bác nào biết giúp em với nhé! Cám ơn các bác!
Gữi bạn code này:
PHP:Public Dic Private Sub ListFilesInFolder(FolderName As String, InSub As Boolean) Dim FileItem, SubFolder, FileName As String On Error GoTo Thoat With CreateObject("Scripting.FileSystemObject") With .GetFolder(FolderName) For Each FileItem In .Files FileName = FolderName & "\" & FileItem.Name Dic.Add FolderName & "\" & FileItem.Name, FileLen(FileName) Next FileItem If InSub Then For Each SubFolder In .subFolders ListFilesInFolder SubFolder.Path, True Next SubFolder End If End With End With Thoat: End Sub
Đúng ra có thể dùng Application.FileSearch sẽ đơn giản hơn nhưng phải viết dài dòng thế vì để bạn có thể dùng nó trên Excel 2007 (FileSearch không dùng được trên Excel 2007)PHP:Sub GetFileList() Dim i As Long Set Dic = Nothing Set Dic = CreateObject("Scripting.Dictionary") Range("A2:B60000").Clear With Application.FileDialog(4) .Show: .AllowMultiSelect = False ListFilesInFolder .SelectedItems(1), True End With With Range("A2").Resize(Dic.Count) .Value = WorksheetFunction.Transpose(Dic.Keys) .Offset(, 1) = WorksheetFunction.Transpose(Dic.Items) .Offset(, 1).NumberFormat = "#,##0 ""KB""" End With Columns("A:B").AutoFit End Sub
Lưu ý:
- Code này có thể lấy list file trong mọi Folder
- Nếu bạn chỉ muốn lấy file tại folder mà bạn chọn (không lấy file trong folder con) tại tại đoạn code thứ hai, hãy sửa:
ListFilesInFolder .SelectedItems(1), True
thành:
ListFilesInFolder .SelectedItems(1), False
FileName = FolderName & "\" & FileItem.Name
Dic.Add FolderName & "" & FileItem.Name, FileLen(FileName)
Phải là
FileName = FolderName & "\" & FileItem.Name
Dic.Add FolderName & "[COLOR=#ff0000]\[/COLOR]" & FileItem.Name, FileLen(FileName)
Hoặc
FileName = FolderName & "\" & FileItem.Name
Dic.Add FileName, FileLen(FileName)
With Application.FileDialog(4)
.Show: .AllowMultiSelect = False
ListFilesInFolder .SelectedItems(1), True
End With
Code này tôi viết đã lâu (từ năm 2009), khi ấy chỉ mới tập tành VBA thôi nên có sơ suất 1 chút. Đã dùng Scripting.FileSystemObject mà lại đi xài hàm FileLen nên vẫn bị lỗi với tiếng Việt ---> Đúng ra vẫn có thể dùng Scripting.FileSystemObject để lấy file sizeNhưng thực ra code trên cũng không đúng. Nếu trong cửa sổ FileDialog ta chọn ổ C thì sau đó ta có các tập tin dạng "C:\\autoexec.bat"
Về code thì code không phục vụ tiếng Việt. Tức nếu chọn thư mục tiếng Việt thì sẽ không có file nào trả về (cả ở thư mục chính lẫn các thư mục con), còn nếu có thư mục con tiếng Việt thì sẽ mất tất cả các file ở thư mục đó và các thư mục con. Nếu tên các thư mục không là tiếng Việt thì cũng sẽ mất file tiếng Việt này, và tất cả các file sau (tiếng Việt hay không tiếng Việt - với On Error GoTo Thoat như hiện nay) hoặc tất cả các file tiếng Việt sau (với On Error Resume Next)
Bản thân tôi không dùng tên tập tin hay thư mục tiếng Việt nhưng nhiều khi điều đó không phụ thuộc vào chúng ta. Có những lúc ta lấy từ nguồn ngoài (vd. tải từ mạng về). Nếu ít tập tin thì cũng còn bỏ công ra để sửa lại tên nhưng nếu quá nhiều thì nhiều khi ta "phẩy tay"
Cũng nên lưu ý là không nên viết
Public Dic As Object
Private Sub ListFilesInFolder(fldName As String, InSub As Boolean)
Dim fleItem As Object, fldItem, fleName As String, fleSize As Double
On Error Resume Next
With CreateObject("Scripting.FileSystemObject")
With .GetFolder(fldName)
For Each fleItem In .Files
fleName = fleItem.Path
fleSize = fleItem.Size
Dic.Add fleName, fleSize
Next
If InSub Then
For Each fldItem In .SubFolders
ListFilesInFolder fldItem.Path, True
Next
End If
End With
End With
End Sub
Sub GetFileList()
Dim tmpArr1, tmpArr2, Arr(), fldName As String, lCount As Long, n As Long
Range("A2:B60000").Clear
Set Dic = CreateObject("Scripting.Dictionary")
On Error Resume Next
With Application.FileDialog(4)
.Show: .AllowMultiSelect = False
fldName = .SelectedItems(1)
If Len(fldName) Then ListFilesInFolder .SelectedItems(1), True
End With
On Error GoTo 0
lCount = Dic.Count
If lCount Then
tmpArr1 = Dic.Keys
tmpArr2 = Dic.Items
ReDim Arr(1 To lCount, 1 To 2)
For n = 1 To lCount
Arr(n, 1) = tmpArr1(n - 1)
Arr(n, 2) = tmpArr2(n - 1)
Next
With Range("A2").Resize(lCount, 2)
.Value = Arr
.Offset(, 1).Resize(, 1).NumberFormat = "#,##0 ""KB"""
End With
Columns("A:B").AutoFit
End If
End Sub
Dear anh!
- Anh cho em hỏi em muốn list danh sách như file của anh gửi nhưng thêm điều kiện là những file nào có tên tương ứng với tên file trong cột tên file mới hiện ra. Như vậy có làm được không ạ? Em cám ơn anh!
Sub GetFileList()
Dim tmpArr, Arr(), fldName As String, lCount As Long, n As Long
Dim libItem, libArr, tmp
Range("A2:B60000").Clear
Set Dic = CreateObject("Scripting.Dictionary")
On Error Resume Next
With Application.FileDialog(4)
.Show: .AllowMultiSelect = False
fldName = .SelectedItems(1)
If Len(fldName) Then ListFilesInFolder .SelectedItems(1), True
End With
On Error GoTo 0
lCount = Dic.Count
If lCount Then
tmpArr = Dic.Keys
ReDim Arr(1 To lCount, 1 To 2)
libArr = Range("C2:C7").Value
For Each libItem In libArr
If Len(CStr(libItem)) Then
tmp = Filter(tmpArr, libItem & ".xls", True, vbTextCompare)
If UBound(tmp) > -1 Then
n = n + 1
Arr(n, 1) = tmp(0)
Arr(n, 2) = Dic.Item(tmp(0))
End If
End If
Next
If n Then
With Range("A2").Resize(n, 2)
.Value = Arr
.Offset(, 1).Resize(, 1).NumberFormat = "#,##0 ""KB"""
End With
Columns("A:B").AutoFit
End If
End If
End Sub
Lâu quá trở lại vấn đề này. Nhờ NDU viết code mà khi nhấn thì browse và chỉ liệt kê những file xls cho mình chọn. Ưu tiên cho folder đang chứa file hiện hành. Trên GPE NDU có viết cho mình rồi mà tìm chưa thấy.
Cám ơn!
With Application.FileDialog(msoFileDialogFilePicker)
.Filters.Clear
.Filters.Add "Excel File", "*.xls"
.InitialFileName = ThisWorkbook.FullName
.Show
MsgBox .SelectedItems(1)
End With
Cũng dạng vậy.Chắc là dạng này chăng:
Nhưng đó là Dialog để duyệt file nhaPHP:With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "Excel File", "*.xls" .InitialFileName = ThisWorkbook.FullName .Show MsgBox .SelectedItems(1) End With
Cho phép chọn *.xls nghĩa là chọn nhiều file cùng lúc chăng?Cũng dạng vậy.
Yêu cầu là thế này:
- Muốn lấy dữ liệu từ 1 file abc.xls
- Thay vì chép file abc trên vào chung 1 folder, open và lấy dữ liệu thì mình dùng hộp thoại để mở folder (ưu tiên hiện hành) và cho phép chọn file *.xls.
Nhớ là code này có lâu rồi mà tìm chưa ra.
Cám ơn.
Không phải, mở hộp thoại ra và chỉ hiển thị những file .xls trong folder để mình chọn 1 file abc và lấy dữ liệu.Cho phép chọn *.xls nghĩa là chọn nhiều file cùng lúc chăng?
Nếu là vậy thì chỉ cần thêm đoạn .AllowMultiSelect = True trước thằng .Show là được rồi
Sub TaoArrData()
myPath = ThisWorkbook.Path
If bWorkbookIsOpen(wbName) Then
Windows(wbName).Activate
Else
Workbooks.Open Filename:=myPath & "\" & wbName
End If
Set TgtWb = ActiveWorkbook
...
Set SourceWb = ThisWorkbook
myPath = ThisWorkbook.Path
'mo file
With Application.FileDialog(msoFileDialogOpen)
.InitialFileName = myPath
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel files", "*.xls" & "*"
.Show
If .SelectedItems.Count = 0 Then
MsgBox "Ban chua chon file"
Exit Sub
End If
Fname = .SelectedItems(1)
End With
'**** Lay du lieu
Workbooks.Open Filename:=Fname
Set TgtWb = ActiveWorkbook
Anh ơi, nếu thế này khi có 1 tỉnh không có trong file mà nằm trước tỉnh có thì không lọc đúng. Như vậy anh ạTrường hợp của bạn, có thể sửa sub thứ 2 thành vầy:
Sub thứ nhất lấy tại bài 9 nhaPHP:Sub GetFileList() Dim tmpArr, Arr(), fldName As String, lCount As Long, n As Long Dim libItem, libArr, tmp Range("A2:B60000").Clear Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next With Application.FileDialog(4) .Show: .AllowMultiSelect = False fldName = .SelectedItems(1) If Len(fldName) Then ListFilesInFolder .SelectedItems(1), True End With On Error GoTo 0 lCount = Dic.Count If lCount Then tmpArr = Dic.Keys ReDim Arr(1 To lCount, 1 To 2) libArr = Range("C2:C7").Value For Each libItem In libArr If Len(CStr(libItem)) Then tmp = Filter(tmpArr, libItem & ".xls", True, vbTextCompare) If UBound(tmp) > -1 Then n = n + 1 Arr(n, 1) = tmp(0) Arr(n, 2) = Dic.Item(tmp(0)) End If End If Next If n Then With Range("A2").Resize(n, 2) .Value = Arr .Offset(, 1).Resize(, 1).NumberFormat = "#,##0 ""KB""" End With Columns("A:B").AutoFit End If End If End Sub
Ah... rắc rối nhỉAnh ơi, nếu thế này khi có 1 tỉnh không có trong file mà nằm trước tỉnh có thì không lọc đúng. Như vậy anh ạ
Sub GetFileList()
Dim tmpArr, Arr(), fldName As String, lCount As Long, n As Long
Dim libItem, libArr, tmp
Range("A2:B60000").Clear
Set Dic = CreateObject("Scripting.Dictionary")
On Error Resume Next
With Application.FileDialog(4)
.Show: .AllowMultiSelect = False
fldName = .SelectedItems(1)
If Len(fldName) Then ListFilesInFolder .SelectedItems(1), True
End With
On Error GoTo 0
lCount = Dic.Count
If lCount Then
tmpArr = Dic.Keys
ReDim Arr(1 To lCount, 1 To 2)
libArr = Range("C2:C7").Value
For n = 1 To UBound(libArr)
libItem = libArr(n, 1)
If Len(CStr(libItem)) Then
tmp = Filter(tmpArr, libItem & ".xls", True, vbTextCompare)
If UBound(tmp) > -1 Then
Arr(n, 1) = tmp(0)
Arr(n, 2) = Dic.Item(tmp(0))
End If
End If
Next
If n Then
With Range("A2").Resize(lCount, 2)
.Value = Arr
.Offset(, 1).Resize(, 1).NumberFormat = "#,##0 ""KB"""
End With
Columns("A:B").AutoFit
End If
End If
End Sub
Anh ơi, có 1 vấn đề nữa là mở rộng các tên để lọc file thì không chạy được ạ. Có xử lý được không ạ?
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2