Nhờ các bác giúp, cách tìm 1 chuỗi text trong hàng loạt file .txt bằng VBA excel 2003 (1 người xem)

Liên hệ QC

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

minhnam1803

Thành viên mới
Tham gia
6/2/11
Bài viết
21
Được thích
0
Nhờ các bác chỉ giúp code VBD của excel 2003, cách tìm 1 chuỗi text trong hàng loạt file .txt, (phần duyệt file trong thư mục em đã tìm đuợc code trong diễn đàn GPE rồi), trả về kết quả là có đoạn text đó trong file hay không.

Em xin cám ơn truớc.

(Nếu em post ở đây không phù hợp, nhờ bác mod chuyển giùm!).
 
Nhờ các bác chỉ giúp code VBD của excel 2003, cách tìm 1 chuỗi text trong hàng loạt file .txt, (phần duyệt file trong thư mục em đã tìm đuợc code trong diễn đàn GPE rồi), trả về kết quả là có đoạn text đó trong file hay không.
.
Tôi chẳng biết code VBD là cái giống gì cả. VBA thì tôi làm được
Giả sự rằng ta có 1 file tên Test2.txt nằm trong ổ C. Vậy ta dùng code dưới đây để xem trong file Test2.txt ấy có 1 từ "NDU" hay không
Code như sau:
PHP:
Function SearchStrFormFile(ByVal FilePath As String, ByVal SearchStr As String)
  Dim sComm As String, tmpFile, Arr
  With CreateObject("Scripting.FileSystemObject")
    tmpFile = "C:\tmpfile"
    sComm = "FIND /C /I """ & SearchStr & """ " & FilePath & " >" & tmpFile
    CreateObject("Wscript.Shell").Run "cmd /c " & sComm, 0, True
    Arr = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf)
  End With
  SearchStrFormFile = Arr(1)
  Kill tmpFile
End Function
PHP:
Sub Test()
  Dim FilePath As String, SearchStr As String, Arr
  SearchStr = "NDU"
  FilePath = "C:\Test2.txt"
  Arr = Split(SearchStrFormFile(FilePath, SearchStr), ":")
  MsgBox Arr(UBound(Arr))
End Sub
Nếu kết quả của MsgBox là 1 số gì đó > 0 thì có nghĩa là đã tìm thấy (và ngược lại, MsgBox cho kết quả = 0 thì có nghĩa là không tìm thấy)
Code này có thể chạy trên Excel 2003 hoặc Excel 2007, thậm chí là trong VB6 (vì nó dùng DOS Command). Mặc khác code này chẳng những có thể tìm chuổi trong file TXT, thậm chí còn tìm được chuổi trong file Excel, Word... vân vân...
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã thử với file .txt thì Ok bác ạ. Tuy nhiên khi chuyển sang file .doc, .xls, hoặc html ... thì nó báo lỗi Run-time error "62": Input past end of file và nó dừng ở dòng Arr = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf) của Function SearchStrFormFile(ByVal FilePath As String, ByVal SearchStr As String)
Em đoán chắc là do đang ở phương thức .OpenTextFile(tmpFile nên nó mới báo lỗi thế???

Bác xem giúp lại cho em với nhé.

Cám ơn bác!
 
Upvote 0
Em đã thử với file .txt thì Ok bác ạ. Tuy nhiên khi chuyển sang file .doc, .xls, hoặc html ... thì nó báo lỗi Run-time error "62": Input past end of file và nó dừng ở dòng Arr = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf) của Function SearchStrFormFile(ByVal FilePath As String, ByVal SearchStr As String)
Em đoán chắc là do đang ở phương thức .OpenTextFile(tmpFile nên nó mới báo lỗi thế???

Bác xem giúp lại cho em với nhé.

Cám ơn bác!
Tôi đã thử nghiệm chắc chắn mới đưa code lên bạn à!
Bạn thử đưa 1 file .DOC lên đây xem (nhớ cho biết bạn muốn tìm từ khóa gì)
 
Upvote 0
Em up file word lên rồi.

Còn đây là đoạn code em sửa để chỉ đến file đó (vì file đó có chứa tiếng việt unicode, nên em chỉ tìm từ silicon, không có dấu):

Nhân tiện, bác thử giùm em luôn file html luôn nhé, em thử file đó mà không được.

Sub Test()
Dim FilePath As String, SearchStr As String, Arr
SearchStr = "silicon"
FilePath = "D:\Chong tham.doc"
Arr = Split(SearchStrFormFile(FilePath, SearchStr), ":")
MsgBox Arr(UBound(Arr))
End Sub
 

File đính kèm

Upvote 0
Em đã kiểm tra lại, hóa ra do dấu " " trong tên file. Em thử với 1 file txt khác, nhưng tên file có dấu " " ở trong, thì cũng báo lỗi 62 như trên. Khi khử hết " " thì Ok
Em thử tiếp với file html, nếu bỏ hết " " trong tên file, thì cũng Ok.

Bác kiểm chứng lại giùm em xem có đúng không ?

Một lần nữa, em cám ơn bác ndu96081631!
 
Lần chỉnh sửa cuối:
Upvote 0
Em up file word lên rồi.

Còn đây là đoạn code em sửa để chỉ đến file đó (vì file đó có chứa tiếng việt unicode, nên em chỉ tìm từ silicon, không có dấu):

Nhân tiện, bác thử giùm em luôn file html luôn nhé, em thử file đó mà không được.
ấy dza! Phát hiện 2 vấn đề nghiêm trọng:
- Thứ nhất: Đường dẫn có chứa khoảng trắng
- Thứ hai: nội dung file là tiếng Việt Unicode

Với lỗi thứ nhất, ta chỉnh lại code thành:
PHP:
Function SearchStrFormFile(ByVal FilePath As String, ByVal SearchStr As String)
  Dim sComm As String, tmpFile, Arr
  With CreateObject("Scripting.FileSystemObject")
    tmpFile = "C:\tmpfile"
    sComm = "FIND /C /I """ & SearchStr & """ """ & FilePath & """ >" & tmpFile
    CreateObject("Wscript.Shell").Run "cmd /c " & sComm, 0, True
    Arr = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf)
  End With
  SearchStrFormFile = Arr(1)
  Kill tmpFile
End Function
Còn với lỗi thứ hai thì tôi thật sự chẳng biết làm cách nào! Nếu nội dung là tiếng Việt không dấu hoặc tiếng Anh thì hoàn toàn không có vấn đề gì
(Giải pháp cuối cùng là mở file lên để tìm thì... bùn quá)
------------
Cần nói thêm rằng với file DOC nhưng được lưu ở dạng Plain text (hoặc được save as từ file TXT) thì code tìm được. Chẳng hạn như file DOC đính kèm dưới đây
(đương nhiên với file TXT chứa nội dung là tiếng Việt Unicode cũng không có vấn đề)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bác ndu96081631 cho em hỏi thêm 1 chút nữa.

Em thấy dùng cách search như bác chỉ, là OK, tuy nhiên tìm bằng cách này sẽ bị thao tác ghi file/ xóa file temp.
Function SearchStrFormFile(ByVal FilePath As String, ByVal SearchStr As String)
Dim sComm As String, tmpFile, Arr
With CreateObject
("Scripting.FileSystemObject")
tmpFile = "C:\tmpfile"
sComm = "FIND /C /I """ & SearchStr & """ """ & FilePath & """ >" & tmpFile
CreateObject
("Wscript.Shell").Run "cmd /c " & sComm, 0, True
Arr
= Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf)
End With
SearchStrFormFile
= Arr(1)
Kill tmpFile
End
Function

Bác có thể xem giúp em, cách nào mà đọc toàn bộ nội dung file vào 1 biến nào đó, rồi sau đó thực hiện việc so sánh chuỗi cần tìm trong biến số (chứa nội dung file đã đọc), bằng so sánh nhị phân chẳng hạn, thì có được không? Em suy đoán, nếu so sánh - tìm kiếm chuỗi trong bộ nhớ sẽ nhanh hơn thao tác thông qua ghi/ xóa file?

Em cám ơn bác nhiều!
 
Upvote 0
Bác cho em hỏi thêm 1 ý nữa, là có thể thiết lập các tham số để lấy danh sách file trong 1 thư mục theo 1 trật tự nhất định, ví dụ như theo tên file, kích cỡ file lớn/ bé, thời gian tạo file ... hay không?

Cách lấy file trong 1 thư mục, em dùng theo link này:


http://www.giaiphapexcel.com/forum/showthread.php?1541-Giúp-chuyển-mã-tên-file&p=9186#post9186


Em trích 1 đoạn code liên quan từ link trên:

Dim FSO As FileSystemObject
Set FSO = New FileSystemObject

'Create a variable to store the folder holding the files
Dim FilesDir As Folder
'Change the string here to look in a different folder (highly recommended :P)
Set FilesDir = FSO.GetFolder(thumuc)
 
Upvote 0
Bác cho em hỏi thêm 1 ý nữa, là có thể thiết lập các tham số để lấy danh sách file trong 1 thư mục theo 1 trật tự nhất định, ví dụ như theo tên file, kích cỡ file lớn/ bé, thời gian tạo file ... hay không?
Cách lấy file trong 1 thư mục, em dùng theo link này:
http://www.giaiphapexcel.com/forum/showthread.php?1541-Gi%C3%BAp-chuy%E1%BB%83n-m%C3%A3-t%C3%AAn-file&p=9186#post9186
Em trích 1 đoạn code liên quan từ link trên:
Trước đây tôi có viết 1 hàm lấy tên file trong thư mục như sau:
Mã:
Function GetListFile(ByVal Folder As String, ByVal Search As String, ByVal InSub As Boolean)
  Dim sComm As String, tmpFile
  On Error GoTo ExitSub
  If Right(Folder, 1) <> "\" Then Folder = Folder & "\"
  Folder = """" & Folder & """"
  With CreateObject("Scripting.FileSystemObject")
    tmpFile = .GetTempName
    [B]sComm = "DIR " & Folder & "*" & Search & "* [COLOR=red]/ON[/COLOR] /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile[/B]
    CreateObject("Wscript.Shell").Run "cmd /c " & sComm, 0, True
    GetListFile = Split(.OpenTextFile(tmpFile, 1).ReadAll, vbCrLf)
  End With
  Kill tmpFile
ExitSub:
End Function
Chú ý dòng lệnh tôi tô đậm, đặc biết chổ màu đỏ chính là Sort đây
/ON ---> Sort theo tên file ---> /O-N là Sort từ lớn đến nhỏ
/OE ---> Sort theo đuôi file ---> /O-E là Sort từ lớn đến nhỏ
/OD ---> Sort theo Data Time ---> /O-D là Sort từ lớn đến nhỏ
/OS ---> Sort theo kích thước file ---> /O-S là Sort từ lớn đến nhỏ
Riêng phần sort theo Date Time, code trên sẽ sort theo Date Modified (theo ngày chỉnh sửa cuối cùng). Nếu muốn sort theo Date Time nhưng lấy Date Create (ngày tạo) làm chuẩn thì thêm 1 tham số /TC nữa:
Mã:
[B]sComm = "DIR " & Folder & "*" & Search & "* [COLOR=red]/OD /TC[/COLOR] /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile[/B]
----------------
Code này cho tốc độ nhanh nhất trong các code tôi biết từ trước đến giờ
(Mà câu hỏi này của bạn đâu có liên quan đến chủ đề của topic, lý ra phải hỏi ở 1 topic khác chứ)
 
Lần chỉnh sửa cuối:
Upvote 0
Đang cần thì tìm được bài của thầy viết hay quá, thầy cho hỏi thêm chút nếu trong file mình có chữ:
Biển nhớ: 10 bài
Cát bụi: 9 bài bây giờ mình trích ra 10 bài và 9 bài thì với code này có làm được không?
 
Upvote 0
Web KT

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

Back
Top Bottom