Quản lý nội dung thư mục, liệt kê chọn lọc bằng Excel (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

thanhnhanubnd

Thành viên hoạt động
Tham gia
12/9/08
Bài viết
180
Được thích
29
Nghề nghiệp
Xay dung
Xin chào các bạn, vừa qua tôi được sự giúp đở của bạn Voda nay đã thực hiện được việc quản lý thư mục bằng Excel.

Tôi là thành viên mới của GPE nên có nhiều bở ngở và kiến thức Excel còn ít, việc bạn Voda nhiệt tình giúp đở đó là nghĩa cử rất cao đẹp, xin chân thành cám ơn bạn.

Hôm nay, tôi chợt nghĩ ra 1 ý trong việc quản lý thư mục bằng Excel, ta không chỉ liệt kê tất cả theo hướng dẫn của bạn Voda mà còn chọn lọc dữ liệu liệt kê theo ý mình.

Mình đã làm 1 file Excel với những yêu cầu, mong các bạn xem và chỉ giúp.

Chân thành cám ơn, xin chào !!!
 

File đính kèm

Mình đã thử kết hợp với file Sealand 4 của bạn Sealandnhưng không được, các bạn giúp với.


Tập tin đính kèm
xls.gif
sealand4.xls (30.5 KB, 1 lần tải)
 
Lần chỉnh sửa cuối:
Mình gửi lại bạn kiểm tra xem đúng chưa? (Bạn lưu ý định dạng ngayd tháng phải đồng nhất)
 

File đính kèm

Lần chỉnh sửa cuối:
Mình thử rồi, rỏ ràng việc nhập dữ liệu vào các ô của mình không hay.

Nhờ bạn sử dụng lại file mình gửi, ở sheet quyet dinh .

Tạo dùng mình 4 nút bấm asign với 4 Macro có thể liệt kê theo 4 kiểu :

- Theo nội dung tên văn bản ( cột C).
- Theo ngày bất kỳ( Cột B)
- Theo Tháng bất kỳ ( Cột B)
- Theo tên người ký ( cột D).

Việc nhập dữ liệu để trích thì làm như bạn làm khi trích tên, cách này hay hơn cách nhập tên hay dữ liệu vào 1 ô nào đó.

Chào bạn!!
 
Mình sửa lại theo ý bạn có vấn đề gì báo lại nhé.
 

File đính kèm

Mình đang có vấn đề xin hướng dẫn :

Mình thử tạo 1 thư mục Test với khoảng 3000 file Word,mỗi file khoảng 20K, Tổng dung lượng khoảng 58MB.

Khi liệt kê bằng Getdoc_Pro thì mình mất khoảng 5 phút, xin hỏi có cách nào liệt kê nhanh hơn không. (Mình nghĩ là chậm do phải mở Word rồi đóng lại, có thể chỉ lấy tên mà không cần mở Word để cải thiện tốc độ).

Xin cám ơn!!!
 
Mình chưa xem được cụ thể cách làm của bạn, nhưng nếu chỉ lấy thông tin của file mà phải mở ra rồi đóng lại từng tập tin là không cần thiết. Bạn hoàn toàn có được thông tin qua đối tượng Scripting.FileSystemObject, bao gồm:
-Tên file
-Ngày lập.
-Ngày sửa cuối.
-Kích thước.
-Thư muc,ổ đĩa, đường dẫn...
-Ghi chú...
-User tạo file...
Trước đây tôi đã làm để tìm mở file, lấy dữ liệu rất nhanh (Nó không cần phải mở các file cần quản lý)
 
Lần chỉnh sửa cuối:
Mình không biết VBA, xin gửi Bạn code của bạn Voda :

Option Explicit
Sub GetDoc_Properties()
Dim FolderName As String, wbName As String
Dim rw As Integer
Dim lrow As Long, lrow2 As Long
Dim ObjWord As Object
Dim DoSubj As String, DoTit As String, DoAut As String
Dim sDate
On Error Resume Next
lrow = ActiveSheet.Range("B65000").End(xlUp).Row
ActiveSheet.Range("A9:G" & lrow + 9).ClearContents
FolderName = Cells(4, 5)
wbName = Dir(FolderName & "\" & "*.doc")
Application.ScreenUpdating = False
rw = 9
Set ObjWord = CreateObject("Word.Application")
While wbName <> ""
With ObjWord
.Visible = True
.Documents.Open (FolderName & "\" & wbName)
DoSubj = .ActiveDocument.BuiltinDocumentProperties(2)
DoTit = .ActiveDocument.BuiltinDocumentProperties(1)
DoAut = .ActiveDocument.BuiltinDocumentProperties(3)
.Documents(wbName).Close
End With
Cells(rw, 1) = rw - 8
Cells(rw, 2).Value = DateSerial(2008, Mid(wbName, 4, 2), Mid(wbName, 1, 2))
Cells(rw, 3).Value = Mid(wbName, 7, Len(wbName) - 10)
Cells(rw, 4).Value = DoSubj
sDate = Split(DoTit, " ")
Cells(rw, 6).Value = DateSerial(sDate(2), sDate(1), sDate(0))
Cells(rw, 5).Value = DoAut
Cells(rw, 7).Value = Cells(rw, 6).Value - Cells(rw, 2).Value
rw = rw + 1
wbName = Dir
Wend
Cells(5, 5) = rw - 9
ObjWord.Quit
lrow2 = Range("B65000").End(xlUp).Row
Range("B9:H" & lrow2).Select
Selection.Sort Key1:=Range("B9"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Cells(1, 1).Select
If rw = 9 Then
MsgBox "Duong dan hoac tap tin khong ton tai ", , "Thong bao"
End If
Application.ScreenUpdating = True

* Mục đích :
1. Liệt kê tên tất cả file Word có trong 1 đường dẫn bất kỳ ( dạng : ngày tháng tên văn bản; ví dụ : 02 03 Hop dong 1.doc).
2. Tách 04 ký tự đầu sang dạng ngày/tháng/năm để được thời gian tạo.
3. Lấy các thông tin Title, Object, Author của văn bản.
4. Sắp xếp văn bản dạng tăng theo ngày.

* Nếu bỏ dòng lệnnh :

"With ObjWord
.Visible = True
.Documents.Open (FolderName & "\" & wbName)
DoSubj = .ActiveDocument.BuiltinDocumentProperties(2)
DoTit = .ActiveDocument.BuiltinDocumentProperties(1)
DoAut = .ActiveDocument.BuiltinDocumentProperties(3)
.Documents(wbName).Close
End With
Thì sẽ không lấy được Title, Object, Author.. còn nếu để lại thì chạy quán chậm.
 
Lần chỉnh sửa cuối:
Đúng rồi, câu lệnh active nó yêu cầu phải kích hoat tệp tin lên do vậy nó khá lâu. Còn Scripting.FileSystemObject nó không mở file thì có thể nó nhanh hơn. Mặt khác Scripting.FileSystemObject còn có thể chỉnh sửa ghi chú đổi tên file, sao chép di chuyển file.
Nếu không làm được thì mình sẽ gửi tài liệu hướng dẫn sau
(Nói thực mình là Kế toán trưởng vừa chuyển đơn vị nên bàn giao lu bù bạn ạ)
 
Thú thật là mình bó tay, vì mình không biết VBA, Scripting.FileSystemObject cũng không biết luôn, bạn tranh thủ giúp dùm nhé.

Cám ơn nhiều.

Các bạn ơi giúp với, ngày mai diễn đàn tạm ngưng rồi!!!

 
Lần chỉnh sửa cuối:
Để nhanh bạn cho biết nội dung các cột lấy từ thông tin nào của file, như vâyj đỡ phải mổ xẻ code mà bạn chuyển cho (Nếu không kịp mình sẽ chuyển qua Email)
 
Mình gừi file yêu cầu, mong các bạn xem và giúp dùm.
 

File đính kèm

Nguyên văn bởi thanhnhanubnd
Mình thử tạo 1 thư mục Test với khoảng 3000 file Word,mỗi file khoảng 20K, Tổng dung lượng khoảng 58MB.
Khi liệt kê bằng Getdoc_Pro thì mình mất khoảng 5 phút, xin hỏi có cách nào liệt kê nhanh hơn không. (Mình nghĩ là chậm do phải mở Word rồi đóng lại, có thể chỉ lấy tên mà không cần mở Word để cải thiện tốc độ).
-Vấn đề tốc độ của excel quả thật là nan giải. Phải chăng đây là hạn chế của "công cụ tuyệt vời" của chúng ta! May mà bạn mới test với 3000 file. Nếu nhiều hơn nữa thì sao? Có lẽ phải biết chấp nhận những giới hạn.
-Mình đã thử dùng Scripting.FileSystemObject, duyệt file rất nhanh, nhưng không cho thông tin về Title, Author, Subject của file doc.
-Có lẽ sau đây cũng là một giải pháp:
-Bạn chép file dsofile.dll vào máy.
-Mở chương trình GetdocPro_dll.
-Bấm Alt+F11 để vào cửa sổ code.
-Vào Tools/References. Bấm Browse tìm đến file dsofile.dll chọn và bấm Open.
-Trong cửa sổ References sẽ có thêm dòng DS: OLE Document Properties 1.4 Object Library. Bạn đánh dấu chọn vào trước đó - OK đóng hộp thoại.
-chạy thử chương trình.
-Mình đã thử vơi 3000 file mất khoảng 20 - 25 giây.
Mã:
Private oFilePropReader As DSOleFile.PropertyReader
Private oDocProp As DSOleFile.DocumentProperties
Sub GetDoc_Properties()
Dim oCustProp As DSOleFile.CustomProperty
  Set oFilePropReader = New DSOleFile.PropertyReader
  Dim DoSubj As String, DoTit As String, DoAut As String
Dim FolderName As String, wbName As String
Dim rw As Integer
Dim lrow As Long, lrow2 As Long
Dim sDate
On Error Resume Next
lrow = ActiveSheet.Range("A65000").End(xlUp).Row
ActiveSheet.Range("A9:G" & lrow + 9).ClearContents
FolderName = Cells(4, 5)
wbName = Dir(FolderName & "\" & "*.doc")
Application.ScreenUpdating = False
rw = 9
While wbName <> ""
        sFile = FolderName & "\" & wbName
        Set oDocProp = oFilePropReader.GetDocumentProperties(sFile)
                 DoSubj = oDocProp.Subject
                DoTit = oDocProp.Title
                DoAut = oDocProp.Author
    Cells(rw, 1) = rw - 8
    Cells(rw, 2).Value = DateSerial(2008, Mid(wbName, 4, 2), Mid(wbName, 1, 2))
    Cells(rw, 3).Value = Mid(wbName, 7, Len(wbName) - 10)
    Cells(rw, 4).Value = DoSubj
    sDate = Split(DoTit, " ")
    Cells(rw, 6).Value = DateSerial(sDate(2), sDate(1), sDate(0))
    Cells(rw, 5).Value = DoAut
    Cells(rw, 7).Value = Cells(rw, 6).Value - Cells(rw, 2).Value
    rw = rw + 1
           wbName = Dir
Wend
      Cells(5, 5) = rw - 9
      lrow2 = Range("B65000").End(xlUp).Row
       Range("B9:H" & lrow2).Select
       Selection.Sort Key1:=Range("B9"), Order1:=xlDescending, Header:=xlNo, _
       OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
      DataOption1:=xlSortNormal
 Cells(1, 1).Select
If rw = 9 Then
     MsgBox "Duong dan hoac tap tin khong ton tai ", , "Thong bao"
End If
Application.ScreenUpdating = True
End Sub
Nếu các bạn muốn test cho vui, hãy dùng code dưới đây để tạo 3000 file doc trong C:\New_Folder:
Mã:
Option Explicit
Sub taoFileDoc()
Dim i As Long
Dim wordAppl As Object
Set wordAppl = CreateObject("Word.Application")
Application.ScreenUpdating = False
 If Dir("C:\New_Folder", vbDirectory) = "" Then MkDir ("C:\New_Folder")
With wordAppl
For i = 1 To 3000
 .Documents.Add
 .ActiveDocument.BuiltinDocumentProperties(1) = "02 03 2008"
 .ActiveDocument.BuiltinDocumentProperties(2) = "han"
 .ActiveDocument.BuiltinDocumentProperties(3) = "123"
 .ActiveDocument.SaveAs "C:\New_Folder\" & "30" & Space(1) & "01" & Space(1) & "tailieu" & i & ".doc"
.ActiveDocument.Close
Next
.Quit
End With
Application.ScreenUpdating = True
Set wordAppl = Nothing
End Sub
 

File đính kèm

Xin chào các bạn! Chúc mừng GPE đã hoạt động trở lại.

Nhờ sự giúp đở của các bạn ( đặc biệt là Voda và sealand) mình đã hiểu và làm được quản lý thư mục.

Giải pháp của voda thật hay và có hiệu quả, xin chỉ giúp :

1. File dsofile.dll có tác dụng gì vậy.
2. Có thể lập trình hay tạo 1 file bat nào đó cho Microsoft VBA tự động :
" -Vào Tools/References. Bấm Browse tìm đến file dsofile.dll chọn và bấm Open.
-Trong cửa sổ References sẽ có thêm dòng DS: OLE Document Properties 1.4 Object Library. Bạn đánh dấu chọn vào trước đó - OK đóng hộp thoại"


với mặc định là file dsofile.dll cùng chung thư mục với file Excel đang chạy.Xin cám ơn.
 
1. dsofile.dll là loại file thư viện liên kết động (Dynamic Link Library). Trong file chứa các thủ tục hay hàm hỗ trợ cho việc thực hiện một phần việc nào đó của chương trình. Để có thông tin đầy đủ, bạn đọc bài của bác Phan Tự Hướng theo đường dẫn sau: http://www.giaiphapexcel.com/forum/showthread.php?t=6815 hoặc tìm trên diễn đàn.
2.Dòng lệnh để đăng ký tự động file dll như sau:
-Shell "regsvr32 -s C:\dsofile.dll" hoặc
-ThisWorkbook.VBProject.References.AddFromFile "C:\dsofile.dll"
Nếu file cùng thư mục với file chương trình, ta thay đường dẫn bằng ThisWorkbook.Path
 
1. Khi gắn mã này vào Getdoc_pro cua ban thì nó sẽ nằm ở dòng nào, bạn trích dẫn dùm nhé!
Trích:
" 2.Dòng lệnh để đăng ký tự động file dll như sau:
-Shell "regsvr32 -s C:\dsofile.dll" hoặc
-ThisWorkbook.VBProject.References.AddFromFile "C:\dsofile.dll"
Nếu file cùng thư mục với file chương trình, ta thay đường dẫn bằng ThisWorkbook.Path"

2.Nhờ bạn viết dùm 1 đoạn mã với nội dung yêu cầu như sau :


Khi chạy macro sẽ tạo mới được 01 file Word, file word này sẽ được mặc định tạo lưu trong thư mục mà ta đã chọn (FolderName = Cells(4, 5)).

3. Xin hỏi thêm :

- Trong Getdoc_pro nếu ta chọn 1 đường dẫn mặc định thì sẽ thay đổi như thế nào.

- Có thể tạo 01 Macro dạng Browse... để lấy đường dẫn đưa vào ô FolderName = Cells(4, 5) mà không cần phải nhập thủ công.

4.Trong Getdoc_pro có cách nào khóa :

- Khoá Nội dung các hàng cột từ A1 : G8 chỉ cho thay đổi nội dung trong FolderName = Cells(4, 5)
- Khóa nút bấm cho Macro, làm thế nào để cố định nút này, (không thể xóa hay di chuyển, đổi tên...nói chung là lock)
 
Lần chỉnh sửa cuối:
Nguyên văn bởi thanhnhanubnd
1. Khi gắn mã này vào Getdoc_pro cua ban thì nó sẽ nằm ở dòng nào, bạn trích dẫn dùm nhé!Trích:
" 2.Dòng lệnh để đăng ký tự động file dll như sau:
-Shell "regsvr32 -s C:\dsofile.dll" hoặc
-ThisWorkbook.VBProject.References.AddFromFile "C:\dsofile.dll"
Nếu file cùng thư mục với file chương trình, ta thay đường dẫn bằng ThisWorkbook.Path"
2.Nhờ bạn viết dùm 1 đoạn mã với nội dung yêu cầu như sau :
Khi chạy macro sẽ tạo mới được 01 file Word, file word này sẽ được mặc định tạo lưu trong thư mục mà ta đã chọn (FolderName = Cells(4, 5)).
3. Xin hỏi thêm :
- Trong Getdoc_pro nếu ta chọn 1 đường dẫn mặc định thì sẽ thay đổi như thế nào.

- Có thể tạo 01 Macro dạng Browse... để lấy đường dẫn đưa vào ô FolderName = Cells(4, 5) mà không cần phải nhập thủ công.

4.Trong Getdoc_pro có cách nào khóa :
- Khoá Nội dung các hàng cột từ A1 : G8 chỉ cho thay đổi nội dung trong FolderName = Cells(4, 5)
- Khóa nút bấm cho Macro, làm thế nào để cố định nút này, (không thể xóa hay di chuyển, đổi tên...nói chung là lock)
Câu 1:
-Dòng lệnh này viết trong module và dùng sự kiện Workbook_Open để chạy nó. Tuy nhiên mình khuyên bạn nên làm thủ công. Vì việc đăng ký này chỉ cần làm 1 lần. Code thì chạy nhiều lần, những lần chạy sau sẽ gây lỗi. Cũng có thể giải quyết bằng cách code chạy xong lần đầu cho nó tự xóa. Làm thế file quá nặng nề ( vì vốn đã nhiều chương trình rồi)
Câu 2:
Bạn dùng code sau:
-Tên file là: MyFile.doc. (Bạn có thể đổi)
-File lưu cùng đường dẫn với file chương trình.
Mã:
Option Explicit
Sub taoFileDoc()
Dim i As Long
Dim wordAppl As Object
Set wordAppl = CreateObject("Word.Application")
Application.ScreenUpdating = False
With wordAppl
   .Documents.Add
   .ActiveDocument.SaveAs ThisWorkbook.Path & "\ " & " MyFile.doc"
  .ActiveDocument.Close
  .Quit
End With
Application.ScreenUpdating = True
Set wordAppl = Nothing
End Sub
Câu 3:
Mình đã làm cho bạn nút Browse chọn thư mục.
Câu 4:
Dùng chức năng Protection để khóa vùng.Trong hộp thoại Protect Sheet, bỏ chọn mục Edit objects. Các button trong vùng sẽ lock. Trong file đính kèm mình đã khóa cho bạn. Muốn chỉnh sửa, mở khóa không cần pw.
 

File đính kèm

Rat that cam on VODA , thấy tin của bạn rất vui, cám ơn bạn đã nhiệt tình giúp.
1. Rất cám ơn bạn.Thủ tìm cách tự động load dùm mình.Nếu tự động load thì sẽ rất hay.

2. Mình chưa thử nhưng mà ý mình là : sẽ tạo 1 file word lưu trong đường dẫn mặc định ( cell folder mình vừa quản lý), tên thì sẽ tuỳ ý

3.Nút Browse .. nếu nhần cancel thì sẽ báo lỗi.
( thay vì nhấn ok).

4. Mình chưa thử

Xin chân thành cam on.

4. Mai mình test thử

* Hỏi thêm :

5.G.etdoc_pro và lọc dữ liệu khoảnh 15 Macro, Mình tạo thử menu "Quan ly van ban" gồm cácnút bấm asign các macro này, hỏi :

Lúc tạo menu bằng :tools/ customize thì ok, nhưng làm sao để tự động load menu và toolbar này khi file excel Getpro_doc mở ra (Mình coi diễn đản thử tạo *.Xla mà không được, có cần phải tạo sheet MENU không?? chỉ giúp, mình ko rành VBA);

6. Khi quản lý 4000 file dugn lương file khoảng 2MB, Khi copy thêm sheet thì sẽ lên 4,5... MB có cách nào giảm bớt dung lượng ko.
 
Lần chỉnh sửa cuối:
3.Nút Browse .. nếu nhần cancel thì sẽ báo lỗi.( thay vì nhấn ok).
Bạn tìm và chỉnh code như sau:
Mã:
Sub BrowserFolder()
  [B]On Error Resume Next[/B]
  With Application.FileDialog(4)
            .Title = "Chon thu muc"
            .Show
            Cells(4, 5) = .SelectedItems(1)
           End With
 End Sub
 
1. Bạn có thể viết 01 file *.bat nào đó để nó tự động load dsofile.dll không ( để màu mè 1 tý)

2. Xin nói rỏ Yêu cầu của Macro tạo file WORD :
- Khi chạy macro sẽ tạo ra 01 file word mới ( không cần lưu).
(Mình đã dùng Hyperlink nhưng nó hiển thị ra bảng thông báo trước khi liên kết- mình muốn bỏ qua bước này).

3. Nút Browse.. thật tuyệt vời.ok

4. Nếu " Dùng chức năng Protection để khóa vùng.Trong hộp thoại Protect Sheet, bỏ chọn mục Edit objects. Các button trong vùng sẽ lock. Trong file đính kèm mình đã khóa cho bạn. Muốn chỉnh sửa, mở khóa không cần pw"
thì sẽ bị lỗi, không chạy Macro được nữa.
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom