Tìm & thay thế hàng lọat! (1 người xem)

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

AnhThu-1976

Thành viên tích cực
Tham gia
17/10/14
Bài viết
1,076
Được thích
176
Em có 1 danh sách tìm và danh sách thay ở sheet 1, nếu em dùng tổ hợp "Ctrl+H" thì nó rất lâu, em nhờ các anh chị viết code để thay thế hàng lọat ở sheet 2
ví dụ: "trúc" thay thế "mai"
em cảm ơn
 

File đính kèm

Em có 1 danh sách tìm và danh sách thay ở sheet 1, nếu em dùng tổ hợp "Ctrl+H" thì nó rất lâu, em nhờ các anh chị viết code để thay thế hàng lọat ở sheet 2
ví dụ: "trúc" thay thế "mai"
em cảm ơn

===============================================
Bạn không nói rõ là có muốn tìm và thay thể cả chữ (Whole word match) hay không hay 1 phần của chữ (Partial match) hay phân biệt chữ hoa, chữ thường (Case Sensitive) nên mình trả lời chung chung thế này:

Version 1: thay tất:
File: Tim&ThayThe_.xls
PHP:
Sub
 Macro1()
Dim i As Integer
Dim FindStr As String
Dim RepStr As String
For i = 2 To 7
    FindStr = Sheet1.Range("A" & i).Value
    RepStr = Sheet1.Range("B" & i).Value
        ActiveWorkbook.Sheets(2).Cells.Replace What:=FindStr, Replacement:=RepStr
Next i
End Sub

Version 2: thay cả chữ (whole word match)
File: Tim&ThayThe_ (1).xls

PHP:
Sub Macro1()
Dim i As Integer
Dim FindStr As String
Dim RepStr As String
Dim followingChar As String
Dim pos As Integer
' Lặp từ dòng 2 đến 7 của Sheet 1 để lấy dữ liệu cần tìm kiếm và thay thế

For i = 2 To 7
    FindStr = Sheet1.Range("A" & i).Value
    RepStr = Sheet1.Range("B" & i).Value

    ' Check mỗi cell trong khoảng đã dùng ( chạy nhanh hơn so với ActiveWorkbook.Sheets(2).Cells )
    For Each cell In ActiveWorkbook.Sheets(2).UsedRange.Cells
        
        ' Bỏ qua cell rỗng, chỉ cell nào chứa dữ liệu mới check
        If Not IsEmpty(cell) Then
            ' tìm vị trí của từ cần thay thế trong nội dung của cell
            pos = InStr(1, cell.Value, FindStr)
            Select Case pos
            ' không tìm thấy - > không làm gì cả

            Case 0
            ' nếu vị trí = 1 - > từ cần tìm để thay ở ngay đầu tiên

            Case 1
                ' xem sau từ đó là kí tự gì

                followingChar = Mid(cell.Value, Len(cell.Value) + 1, 1)
                ' nếu kí tự đó là dấu cách " ", dấu phẩy " " hoặc kí tự rỗng "", ... cái này bạn tự check thêm nha

                If followingChar = " " Or followingChar = "," Or followingChar = "" Then
                    ' thì thay thế 

                    cell.Replace What:=FindStr, Replacement:=RepStr
                End If
            ' nếu vị trí tìm thấy lớn hơn 1, thi ta phải check kí tự liền trước và kí tự liền sau của từ cần tìm ... tương tự như trên.

            Case Else
                followingChar = Mid(cell.Value, pos - 1, 1)
                If followingChar = " " Then
                    followingChar = Mid(cell.Value, pos + Len(cell.Value), 1)
                    If followingChar = " " Or followingChar = "," Or followingChar = "" Then
                        cell.Replace What:=FindStr, Replacement:=RepStr 
                   End If 
               End If 
           End Select
        End If 
   Next cell
Next i
End Sub

Version 3: tương tự như version 2 nhưng ngắn hơn:

PHP:
Sub macro3()
Dim i As Integer
Dim FindStr As String
Dim RepStr As String
Dim pos As IntegerFor i = 2 To 7
    FindStr = Sheet1.Range("A" & i).Value 
   RepStr = Sheet1.Range("B" & i).Value
    For Each cell In ActiveWorkbook.Sheets(2).UsedRange.Cells
        If Not IsEmpty(cell) Then
            If ExactWordInString(cell.Value, FindStr) Then
                cell.Replace What:=FindStr, Replacement:=RepStr 
           End If 
       End If
    Next cell
Next i
End Sub
Function ExactWordInString(Text As String, Word As String) As Boolean
     ExactWordInString = " " & UCase(Text) & " " Like "*[!A-Z]" & UCase(Word) & "[!A-Z]*"
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
===============================================
PHP:
Sub
 Macro1()
Dim i As Integer
Dim FindStr As String
Dim RepStr As String
For i = 2 To 7
    FindStr = Sheet1.Range("A" & i).Value
    RepStr = Sheet1.Range("B" & i).Value
        ActiveWorkbook.Sheets(2).Cells.Replace What:=FindStr, Replacement:=RepStr
Next i
End Sub
Bài này không đơn giản đâu. Coi chừng thay từ "thanh" thành từ "them"
 
Upvote 0
Cảm ơn bác, chủ topic không nói rõ là match kiểu gì, đã update thêm version 2 match whole word.
Mình có thử với code này thấy cũng được đó nhưng chưa biết chủ topic có xài được không
PHP:
Sub Tim_ThayThe()
Dim nguon(), i&
With Sheet1
   nguon = .Range("A2", .[B65536].End(3)).Value
End With
With Sheet2.UsedRange
   For i = 1 To UBound(nguon)
      .Replace nguon(i, 1), nguon(i, 2), 1
      .Replace " " & nguon(i, 1), " " & nguon(i, 2), 2
   Next
End With
End Sub
 
Upvote 0
Chủ thớt:
Tìm và thay thế hàng loạt bằng code không đơn giản như bạn nghĩ. Nếu có chỗ thực ra không muốn sửa thì sao?
Khi làm việc này với dữ liệu, người ta thường tìm cách giữ lại cái gì đó để sửa chữa chỗ sai. Một trong những cách dễ nhất là:
- chép lại sheet.
- trong sheet chép lại, highlight những chỗ sẽ được thay thế.
- sửa, thay thế trong sheet nguyên bản.
Sau này, duyệt lại nếu có chỗ không vừa ý thì còn cái sheet cóp lại để sửa chữa.
 
Upvote 0
Em cảm ơn các anh/chị nhiệt tình giúp đỡ và góp ý
Do em cũng chưa rành hết về Ctrl+H nên đã làm tốn công sức của các Anh/Chị
Ý em muốn là không phân biệt chữ hoa chữ thường
thay thế "ngày mai" thành "ngày trúc" ( chỉ thay chữ "mai" thành chữ "trúc" ...
Các code trên đã đáp ứng yêu cầu của em.
Chúc các Anh/Chị một ngày làm việc vui vẻ!
 
Upvote 0

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

Back
Top Bottom