Tìm kiếm chuỗi rất lớn trong Macro (Microsoft Excel)
Trong macro của mình, Ian cần xác định một chuỗi ngắn trong một chuỗi rất lớn. Chuỗi lớn về cơ bản là văn bản của toàn bộ tệp, đôi khi hơn 180.000 ký tự. Không Tìm kiếm () cũng không Tìm ()
hoạt động, trừ khi anh ta cắt chuỗi lớn thành các phần nhỏ hơn (ví dụ: dưới 32.000 ký tự) và lần lượt tìm kiếm từng phần. Vấn đề với việc mổ xẻ này là Ian không biết văn bản mục tiêu của anh ta có thể nằm ở đâu trong tệp, hoặc thậm chí liệu nó có nằm trong đó hay không, và rất có thể anh ta cắt văn bản mục tiêu của mình và không bao giờ có thể tìm thấy nó.
Có ba cách chung mà bạn có thể tìm kiếm phiên bản của một chuỗi trong một chuỗi khác trong VBA:
Phương thức tìm Phương thức tìm kiếm * Hàm InStr
Hai cách tiếp cận đầu tiên là những cách mà Ian đề cập cụ thể, vì vậy anh ấy biết cách sử dụng chúng. Chúng thực sự là các phương thức, được sử dụng với đối tượng WorksheetFunction. Về cơ bản, chúng được sử dụng để truy cập các hàm trang tính TÌM và TÌM KIẾM từ bên trong VBA.
Chúng không phải là thứ tốt nhất để tìm kiếm thông tin trong một chuỗi lớn, lớn.
Đối với điều đó, bạn nên sử dụng hàm InStr, một hàm có nguồn gốc từ VBA.
Điều này đặc biệt đúng nếu chuỗi lớn, lớn của bạn đang được kéo vào từ tệp văn bản và không thực sự nằm trong sổ làm việc.
Giả sử bạn có một tệp văn bản lớn mà bạn muốn tìm kiếm một giá trị văn bản cụ thể. Bạn có thể đọc toàn bộ tệp vào bộ nhớ cùng một lúc theo cách này:
Sub CheckFullFile() Dim sFullFile As String Dim sFindText As String Dim lFileSize As Long Dim lStart As Long Dim lLoc As Long Dim sMsg As String ' This is what you want to search for sFindText = "mytext" Open "c:\ReallyBigFile.txt" For Input As 1 lFileSize = Lof(1) sFullFile = Input(lFileSize, 1) Close 1 sFullFile = LCase(sFullFile) lStart = 0 lLoc = InStr(sFullFile, sFindText) While lLoc > 0 sMsg = sMsg & "Found at " & lLoc & vbCrLf lStart = lLoc + 1 lLoc = InStr(lStart, sFullFile, sFindText) Wend MsgBox sMsg End Sub
Macro mở tệp văn bản được chỉ định, nhồi toàn bộ nội dung tệp vào chuỗi sFullFile và hiển thị tất cả các phiên bản của biến sFindText trong văn bản đó. Lưu ý rằng nội dung tệp được chuyển đổi thành chữ thường. Điều này là cần thiết vì hàm InStr phân biệt chữ hoa chữ thường. Nếu bạn muốn tìm kiếm của mình phân biệt chữ hoa chữ thường, bạn không cần thực hiện chuyển đổi.
Giới hạn hiệu quả duy nhất đối với mã như thế này là dung lượng bộ nhớ bạn có trong hệ thống của mình. VBA có giới hạn độ dài chuỗi hiệu quả là khoảng hơn 2 tỷ ký tự, nhưng ít hệ thống có nhiều RAM như vậy. Tất nhiên, hầu hết các tệp văn bản bạn đang đọc cũng không đạt đến kích thước tệp đó. Thử nghiệm với các tệp dữ liệu thực tế của bạn sẽ cho bạn biết liệu phương pháp đọc-n-toàn-tập này có phù hợp với bạn hay không.
Nếu bạn có một tệp văn bản có các dòng văn bản riêng lẻ trong đó, thì có một cách hiệu quả hơn để xử lý tệp và tìm kiếm văn bản của bạn. (Các dòng riêng lẻ được kết thúc bằng ký tự xuống dòng và / hoặc nguồn cấp dữ liệu dòng.)
Sub CheckEachLine() Dim sRaw As String Dim sFindText As String Dim lFileSize As Long Dim lStart As Long Dim lLoc As Long Dim sMsg As String ' This is what you want to search for sFindText = "mytext" Open "c:\ReallyBigFile.txt" For Input As 1 Do Until Eof(1) Line Input #1, sRaw sRaw = LCase(sRaw) lStart = 0 lLoc = InStr(sTemp, sFindText) While lLoc > 0 sMsg = sMsg & "Found at " & lLoc & vbCrLf lStart = lLoc + 1 lLoc = InStr(lStart, sRaw, sFindText) Wend Loop Close 1 MsgBox sMsg End Sub
Với cách tiếp cận này, bạn không phải thực sự lo lắng về độ dài của tệp văn bản vì chỉ một dòng duy nhất tại một thời điểm được đọc vào bộ nhớ và xử lý.
Tôi chắc rằng bạn hiểu rõ — InStr là cách để đi khi bạn muốn làm việc với việc tìm kiếm thông tin trong các chuỗi nguồn lớn đáng kinh ngạc.
_Lưu ý: _
Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.
ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.
Mẹo này (13660) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365.