Tìm kiếm giá trị gần đúng (1 người xem)

Liên hệ QC

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

Tham gia
14/9/12
Bài viết
312
Được thích
68
Nghề nghiệp
VT
Bình thường thì người ta hay Find giá trị nào đó để Replace bằng giá trị khác. Nhưng do dữ liệu nhiều, khó kiểm soát, nhiều khi còn không nhìn ra mình sẽ thay thay thế cái gì bằng cái gì.
do đó em muốn: Cho trước giá trị sẽ thay thế và công việc là đi tìm giá trị gần đúng của giá trị đó. Liệu có khả thi không nhỉ. A/c trong GPE có cách gì hay không.
 

File đính kèm

tại C3 bạn dùng công thức =IF(ISERROR(TRIM(LEFT(B3,FIND("(",B3)-1))),B3,TRIM(LEFT(B3,FIND("(",B3)-1))). Còn phần tên viết liền thì mình không biết, chắc phải nhờ mấy anh VBA
 
Upvote 0
Bạn thử chạy macro này:
PHP:
Option Explicit
Sub TimVaThay()
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range, Rg0 As Range
 Dim MyAdd$
 Set Sh = ThisWorkbook.Worksheets("Sheet2")
 Set Rng = Sh.Range(Sh.[b3], Sh.[b4].End(xlDown))
 Sheet1.Select
 Set Rg0 = Range([b4], [b4].End(xlDown))
 Rg0.Offset(, 1).Resize(, Rg0.Rows.Count).ClearContents
 For Each Cls In Rg0
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            Cells(Cls.Row, "iU").End(xlToLeft).Offset(, 1).Value = sRng.Value
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
 Next Cls
End Sub
 
Upvote 0
Bình thường thì người ta hay Find giá trị nào đó để Replace bằng giá trị khác. Nhưng do dữ liệu nhiều, khó kiểm soát, nhiều khi còn không nhìn ra mình sẽ thay thay thế cái gì bằng cái gì.
do đó em muốn: Cho trước giá trị sẽ thay thế và công việc là đi tìm giá trị gần đúng của giá trị đó. Liệu có khả thi không nhỉ. A/c trong GPE có cách gì hay không.
Nếu dữ liệu và nhu cầu của bạn như thế thì nên chăng làm theo hướng này:
- Bỏ chuỗi trong cặp ngoặc "()"
- Tách các từ ra, căn cứ vào ký tự viết hoa.
Làm vậy thì khỏi cần danh sách chuỗi tìm kiếm và danh sách chuỗi thay thế.
 
Upvote 0
Bạn thử chạy macro này

OK đấy anh. Khi dữ liệu tầm 1000 dòng thì cái này có giá lắm, nhưng như trường hợp PhạmHuyềnNinh thì chưa tìm được (mà không hiểu sao dữ liễu từ bên trên gửi về hay bị trường hợp mất dấu trống thế)
Và có thể xếp chúng theo cột dọc được không + lọc loại bỏ trùng.
Mục đích của ý tưởng là đi tìm cái gợi ý cần thay thế cái gì. Cảm ơn anh nhiều.
 
Upvote 0
Bỏ chuỗi trong cặp ngoặc "()"
Cảm ơn anh gợi ý:
Nguyên nhân chính là do người nhập liệu, mỗi tháng nhập 1 kiểu, chưa thống nhất được. Tháng trước nhập thế nào, tháng sau chả nhớ nữa, nghĩ thế nào nhập vậy nên xảy ra tình trạng dữ liệu kiểu này anh ạ.
 
Upvote 0
(1) Khi dữ liệu tầm 1000 dòng thì cái này có giá lắm;

(2) Nhưng như trường hợp PhạmHuyềnNinh thì chưa tìm được (mà không hiểu sao dữ liễu từ bên trên gửi về hay bị trường hợp mất dấu trống thế)

(3) Và có thể xếp chúng theo cột dọc được không + lọc loại bỏ trùng.
(1) Bạn lấy cái này xài đỡ:
PHP:
Option Explicit
Sub TimVaThay()
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range, Rg0 As Range
 Dim MyAdd$
 
 Set Sh = ThisWorkbook.Worksheets("Sheet2")
 Set Rng = Sh.Range(Sh.[b3], Sh.[b4].End(xlDown))
 Sheet1.Select
 Columns("D:D").ClearContents
 [d3].Value = "GPE.COM"
 For Each Cls In Range([b4], [b4].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            [D9999].End(xlUp).Offset(1).Value = sRng.Value
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
 Next Cls
End Sub

(2) Dựa vô tính chất về độ dài tối đa của 1 từ Việt nam mà fát hiện các từ dính nhau đó.
Máy chắc khó giúp nhau chuyện này;!$@!!
(3) Lọc trùng & xếp bạn có thể thao tác bằng tay, tạm thời là thế. --=0
 
Upvote 0
Bình thường thì người ta hay Find giá trị nào đó để Replace bằng giá trị khác. Nhưng do dữ liệu nhiều, khó kiểm soát, nhiều khi còn không nhìn ra mình sẽ thay thay thế cái gì bằng cái gì.
do đó em muốn: Cho trước giá trị sẽ thay thế và công việc là đi tìm giá trị gần đúng của giá trị đó. Liệu có khả thi không nhỉ. A/c trong GPE có cách gì hay không.

Theo mình bạn có thể dùng công thức như vầy trong sheet 2
 

File đính kèm

Upvote 0
Theo mình bạn có thể dùng công thức như vầy trong sheet 2

Cảm ơn bạn. Thực chất là mình có kết quả rồi, mình muốn đi tìm cái tạo ra kết quả đó hoặc cái gần giống nó. Mục đích nhằm gợi ý cho mình biết có những gì hiện tại đang khác với cái kết quả đó để biết mà sửa vậy. Ở đây là tìm những cái tên sai so với tên mẫu. Chúc bạn buổi tối vui vẻ.
 
Upvote 0
Regex là cách tìm gần đúng. Cổ máy Regex làm việc rất hiệu quả.
Nên tìm hiểu xem có áp dụng được không.
 
Upvote 0
Regex là cách tìm gần đúng. Cổ máy Regex làm việc rất hiệu quả.
Nên tìm hiểu xem có áp dụng được không.

Ngoài cách dùng regex, em nghĩ chủ topic cũng nên tham khảo qua levenshtein distance / edit distance để tìm ra những tên gần đúng
 
Upvote 0
file excel kèm theo bài viết này sử dụng thuật toán edit distance (lehvenstein distance) để tính toán xem mỗi tên ở cột B gần giống với tên nào ở cột C nhất và ghi kết quả này ra cột D, cột E là cột để kiểm tra độ giống nhau theo % (cột E dùng để kiểm tra lại chắc chắn không mắc sai lầm gì khi thực hiện việc so sánh).

Việc còn lại là viết 1 đoán VBA để thay thế tên ở cột B với tên ở cột D


Chúc thành công.
 

File đính kèm

Upvote 0
file excel kèm theo bài viết này sử dụng thuật toán edit distance (lehvenstein distance) để tính toán xem mỗi tên ở cột B gần giống với tên nào ở cột C nhất và ghi kết quả này ra cột D, cột E là cột để kiểm tra độ giống nhau theo % (cột E dùng để kiểm tra lại chắc chắn không mắc sai lầm gì khi thực hiện việc so sánh).

Việc còn lại là viết 1 đoán VBA để thay thế tên ở cột B với tên ở cột D


Chúc thành công.
Mình chưa biết đến điều này, mình sẽ tìm hiểu về nó. Cảm ơn bạn nhiều
 
Upvote 0
Kính chào Anh Chị diễn đàn GPE !
Đợt này cty đang kiểm kê tài sản nên Kính nhờ các Anh Chị trợ giúp code như yêu cầu của File đính kèm em với.

Em Cám ơn !
 

File đính kèm

Upvote 0
Kính chào Anh Chị diễn đàn GPE !
Đợt này cty đang kiểm kê tài sản nên Kính nhờ các Anh Chị trợ giúp code như yêu cầu của File đính kèm em với.

Em Cám ơn !
Mã:
Sub GPE()
  Dim dArr As Variant, Arr As Variant, S As Variant
  Dim i As Long, k1 As Long, k2 As Long
  Dim Hcm, Board, Bar, Des, tmp
  With Sheets("Sheet2")
    Hcm = .Range("C5").Value
    Board = .Range("D5").Value
    Bar = .Range("E5").Value
    Des = .Range("F5").Value
   
    i = .Range("C" & Rows.Count).End(xlUp).Row
    If i > 5 Then .Range("C6:F" & i).ClearContents
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i < 6 Then Exit Sub
    dArr = .Range("A6:A" & i).Value
    ReDim Arr(1 To UBound(dArr), 1 To 4)
    For i = 1 To UBound(dArr)
      If InStr(dArr(i, 1), Hcm) Then
        tmp = Split(dArr(i, 1), "(")(0)
        k1 = k1 + 1
        Arr(k1, 1) = tmp
      End If
      If InStr(dArr(i, 1), Board) Then
        If k2 < k1 Then
          k2 = k1
        Else
          k2 = k2 + 1
          k1 = k2
          Arr(k1, 1) = tmp
        End If
        Arr(k2, 2) = Replace(dArr(i, 1), Board, "")
      End If
      If InStr(dArr(i, 1), Bar) Then
        Arr(k2, 3) = Replace(dArr(i, 1), Bar, "")
      End If
      If InStr(dArr(i, 1), Des) Then
        S = Split(dArr(i, 1), ",")
        Arr(k2, 4) = Trim(S(UBound(S)))
      End If
    Next i
    If k2 Then .Range("C6").Resize(k2, 4) = Arr
  End With
End Sub
 
Upvote 0

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

Back
Top Bottom