Tìm kiếm qua nhiều sổ làm việc (Microsoft Excel)
Amit có một thư mục chứa hàng trăm sổ làm việc Excel. Anh ta cần tìm kiếm trong tất cả các sổ làm việc để tìm một số văn bản cụ thể và tự hỏi liệu có cách nào để tìm kiếm qua tất cả các sổ làm việc và xác định tên của các sổ làm việc chứa văn bản mong muốn, cùng với các ô trong sổ làm việc chứa văn bản đó.
Tìm sổ làm việc nào chứa văn bản mong muốn tương đối dễ dàng. Tất cả những gì bạn cần làm là sử dụng khả năng Tìm kiếm của Windows để tìm kiếm các tệp, trong một thư mục duy nhất, có chứa văn bản mong muốn. Mặc dù nó sẽ không cho bạn biết vị trí ô, nhưng nó sẽ hiển thị danh sách các tệp.
Tất nhiên, bạn có thể sử dụng macro để thực hiện việc tìm kiếm bạn. (Luôn luôn là một ý tưởng hay khi sử dụng macro để thực hiện công việc kéo dài, tẻ nhạt mà nếu không sẽ được thực hiện theo cách thủ công.) Phần sau sẽ xem qua tất cả các sổ làm việc trong một thư mục và tìm kiếm những gì bạn muốn định vị. Nó sẽ mở bất kỳ tệp nào kết thúc bằng xls * (dấu hoa thị ở cuối có nghĩa là nó sẽ tìm kiếm các tệp xls, xlsx và xlsm).
Sub SearchFolders() Dim fso As Object Dim fld As Object Dim strSearch As String Dim strPath As String Dim strFile As String Dim wOut As Worksheet Dim wbk As Workbook Dim wks As Worksheet Dim lRow As Long Dim rFound As Range Dim strFirstAddress As String On Error GoTo ErrHandler Application.ScreenUpdating = False 'Change as desired strPath = "c:\MyFolder" strSearch = "Specific text" Set wOut = Worksheets.Add lRow = 1 With wOut .Cells(lRow, 1) = "Workbook" .Cells(lRow, 2) = "Worksheet" .Cells(lRow, 3) = "Cell" .Cells(lRow, 4) = "Text in Cell" Set fso = CreateObject("Scripting.FileSystemObject") Set fld = fso.GetFolder(strPath) strFile = Dir(strPath & "\.xls") Do While strFile <> "" For Each wks In wbk.Worksheets Set rFound = wks.UsedRange.Find(strSearch) If Not rFound Is Nothing Then strFirstAddress = rFound.Address End If Do If rFound Is Nothing Then Exit Do Else lRow = lRow + 1 .Cells(lRow, 1) = wbk.Name .Cells(lRow, 2) = wks.Name .Cells(lRow, 3) = rFound.Address .Cells(lRow, 4) = rFound.Value End If Set rFound = wks.Cells.FindNext(After:=rFound) Loop While strFirstAddress <> rFound.Address Next wbk.Close (False) strFile = Dir Loop .Columns("A:D").EntireColumn.AutoFit End With MsgBox "Done" ExitHandler: Set wOut = Nothing Set wks = Nothing Set wbk = Nothing Set fld = Nothing Set fso = Nothing Application.ScreenUpdating = True Exit Sub ErrHandler: MsgBox Err.Description, vbExclamation Resume ExitHandler End Sub
Để tùy chỉnh quy trình cho nhu cầu của bạn, hãy thay đổi biến strPath để phản ánh đường dẫn đến thư mục bạn muốn xử lý và thay đổi strSearch để phản ánh văn bản mà bạn đang tìm kiếm. Macro tạo một trang tính mới và đặt các “lần truy cập” vào mỗi hàng. Cột A chứa tên sổ làm việc, cột B là tên trang tính, cột C là địa chỉ ô và cột D là nội dung của ô đó.
Rõ ràng, bất kỳ macro nào như thế này mất khá nhiều thời gian để chạy. Bạn có thể rút ngắn thời gian phần nào bằng cách giảm số lượng tệp cần tìm kiếm. Cách tốt nhất để thực hiện việc này là sử dụng phương pháp Tìm kiếm của Windows (được mô tả ở phần đầu của mẹo này) để xác định các sổ làm việc chứa văn bản mong muốn. Di chuyển các sổ làm việc đó vào thư mục riêng của chúng và sau đó thực hiện tìm kiếm macro trên thư mụ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 (5598) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003.