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.