Tìm Phần tử trong Chuỗi có chứa từ trong list

Liên hệ QC

mrtransumo

Thành viên mới
Tham gia
13/10/15
Bài viết
8
Được thích
0
Chào Các Anh Chị,

Hôm nay em có bài toán mà em chưa giải ra được, Nhờ anh chị giúp đỡ.
Cụ thể là: Em có
+ Sheet A: chứa 1 list chuỗi như (tôi chơi đá banh, tôi chơi cầu mây, tôi đi bơi, tôi đánh bóng chuyển,...)
+ Sheet B: chưa 1 list từ ( đá, đi,...)
Em muốn làm 1 cột phụ bên Sheet A: đếm xem ví dụ "tôi chơi đá banh" có chứa từ nào của list trong sheet B không, ví dụ có chứa từ đá, thì xuất ra là có chứ chẳng hạn,

Nếu làm ngược lại thì em làm được, nhưng với yêu cầu trên thì nhờ anh chị giúp đỡ.
Em xin cảm ơn ạ.
 

File đính kèm

  • vi du.xlsx
    9 KB · Đọc: 24
Mục đích là em muốn filter sheet A, dòng nào có chứa từ của sheet B ạ
 
Cảm ơn anh @phuocam . Em thấy nó chỉ đúng dòng đầy, mấy dòng say em kéo hết thì nó không chạy đúng nhỉ, cụ thể là dòng play soccer. Nhờ anh chỉ thêm hoặc gửi em file vidu được không ạ
 
Cảm ơn anh @phuocam . Em thấy nó chỉ đúng dòng đầy, mấy dòng say em kéo hết thì nó không chạy đúng nhỉ, cụ thể là dòng play soccer. Nhờ anh chỉ thêm hoặc gửi em file vidu được không ạ
Bài #3 có nói là công thức mảng, tức là bạn phải kết thúc bằng tổ hợp 3 phím Ctrl + Shift + Enter
 
À, nhấn Ctrl Shifl Enter. Cảm ơn Anh nhiều ạ
 
muốn khỏi bấm Ctrl + Shift + Enter thì dùng công thức này:
=SUM(INDEX(COUNTIF(B1;"*"&'Cần So Sánh'!$C$1:$C$2&"*");0))
 
Chào các anh Chị.

Mình cũng có một vấn đề tương tự như bạn chủ topic. Nhưng thay vào đó, vấn đề của mình là tiền công.
Mình có một danh sách tiền công. Làm sao điền tiền công vào cột tiền công bên sheet hangdat

Xin cảm ơn.
 

File đính kèm

  • vd.xls
    18 KB · Đọc: 19
Mình cũng có một vấn đề tương tự như bạn chủ topic. Nhưng thay vào đó, vấn đề của mình là tiền công.
Mình có một danh sách tiền công. Làm sao điền tiền công vào cột tiền công bên sheet hangdat
Bạn chạy thử macro sau:
PHP:
Sub TinhTienCongTheoMa()
 Dim Cls As Range, Sh As Worksheet, Rng As Range, sRng As Range
 Dim MyAdd As String

 Sheets("Tien Cong").Select
 Set Sh = ThisWorkbook.Worksheets("HangDat")
 Set Rng = Sh.Range(Sh.[a1], Sh.[a1].End(xlDown))
 For Each Cls In Range([A2], [A2].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            With sRng.Offset(, 1)
                .Value = .Value + Cls.Offset(, 1).Value
                .Offset(, 1).Value = .Offset(, 1).Value + 1
            End With
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    Else
        Cls.Interior.ColorIndex = 38        '   * *     '
    End If
 Next Cls
 Sh.Select
End Sub
 
Thử:
=LOOKUP(2,1/ISNUMBER(SEARCH('tien cong'!$A$2:$A$5,hangdat!A2)),'tien cong'!$B$2:$B$5)
 
Bạn chạy thử macro sau:
PHP:
Sub TinhTienCongTheoMa()
 Dim Cls As Range, Sh As Worksheet, Rng As Range, sRng As Range
 Dim MyAdd As String

 Sheets("Tien Cong").Select
 Set Sh = ThisWorkbook.Worksheets("HangDat")
 Set Rng = Sh.Range(Sh.[a1], Sh.[a1].End(xlDown))
 For Each Cls In Range([A2], [A2].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            With sRng.Offset(, 1)
                .Value = .Value + Cls.Offset(, 1).Value
                .Offset(, 1).Value = .Offset(, 1).Value + 1
            End With
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    Else
        Cls.Interior.ColorIndex = 38        '   * *     '
    End If
 Next Cls
 Sh.Select
End Sub
Ồ ồ, cảm ơn bạn nhiều. :rolleyes:
 
À, mình có áp vô thử nghiệm dài thì có vài chổ bị sai kết quả, mình có tô màu vàng. Cho mình hỏi là nó bị sai ở vấn đề nào ạ.
Thử:
=LOOKUP(2,1/ISNUMBER(SEARCH('tien cong'!$A$2:$A$5,hangdat!A2)),'tien cong'!$B$2:$B$5)
Bạn vui lòng có thể giải thích bằng lời công thức trên được không ạ? Cảm ơn, mình đọc ko hiểu gì hết :p, ví dụ chổ này: SEARCH('tien cong'!$A$2:$A$5,hangdat!A2). Tách riêng nó ra thì nó ko ra kết quả gì cả. Còn tại sao lại dùng lookup 2?
 

File đính kèm

  • vd3.xlsx
    156 KB · Đọc: 5
Bạn chạy thử macro sau:
PHP:
Sub TinhTienCongTheoMa()
 Dim Cls As Range, Sh As Worksheet, Rng As Range, sRng As Range
 Dim MyAdd As String

 Sheets("Tien Cong").Select
 Set Sh = ThisWorkbook.Worksheets("HangDat")
 Set Rng = Sh.Range(Sh.[a1], Sh.[a1].End(xlDown))
 For Each Cls In Range([A2], [A2].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            With sRng.Offset(, 1)
                .Value = .Value + Cls.Offset(, 1).Value
                .Offset(, 1).Value = .Offset(, 1).Value + 1
            End With
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    Else
        Cls.Interior.ColorIndex = 38        '   * *     '
    End If
 Next Cls
 Sh.Select
End Sub
Mình có dùng macro của bạn trên một bảng lớn hơn thì có vài chổ bị sai. Bạn xem giúp mình nó sai ở đâu với ạ.
 

File đính kèm

  • vd4.xlsx
    164.9 KB · Đọc: 3
Sai do thế này đây:
Trong Excel cho xài kí tự đại diện ("*" & "?")
Để tránh sai sót này thì mã cần có độ dài như nhau;
Ví dụ mã gây sai trong đếm sẽ là bộ đôi CDLT214B & CDLT214
Để khử sai ta có cách CDLT214B & CDLT214_
 
Sai do thế này đây:
Trong Excel cho xài kí tự đại diện ("*" & "?")
Để tránh sai sót này thì mã cần có độ dài như nhau;
Ví dụ mã gây sai trong đếm sẽ là bộ đôi CDLT214B & CDLT214
Để khử sai ta có cách CDLT214B & CDLT214_
Vậy mình sẽ làm như thế nào bạn. Mình gà macro, với phần tử chuỗi lắm lắm.:p
 
Xương sống của vấn đề sẽ là độ dài của mã sẽ fải như nhau; Anh nào ngắn thì thêm đấu gạch dưới cho đủ (so với anh đang dài nhất)
& như vậy trong trang tính dữ liệu ta cũng xài các mã theo cung cách này.
Có nghĩa là trong trang dữ liệu, ta không xài : " 1 vòng vàng CDLT214, 24 cara, . . . " nữa; mà là
"1 vòng vàng CDLT214_, 24 cara, . . . "
 
Bạn thử xem cái này thử:
PHP:
Sub TimTiencong()
    Dim Dic As Object, Ma As String, MaTK  As String
    Dim sArr, dArr, Arr, tArr, Tmp, I As Long, J As Long, R As Long
Set Dic = CreateObject("Scripting.Dictionary")
Arr = Array(",", "(", ")", ":", ";")
With Sheets("tien cong")
    tArr = .Range("A2", .Range("A" & Rows.Count).End(3)).Resize(, 2).Value
End With
For I = 1 To UBound(tArr)
    Ma = Application.Trim(tArr(I, 1))
    Dic.Item(Ma) = I
Next I
With Sheets("hangdat")
    sArr = .Range("A2", .Range("A" & Rows.Count).End(3)).Resize(, 2).Value
    ReDim dArr(1 To UBound(sArr), 1 To 1)
    For I = 1 To UBound(sArr)
        For J = 0 To UBound(Arr)
            sArr(I, 1) = Replace(sArr(I, 1), Arr(J), " ")
        Next J
        Tmp = Split(Application.Trim(sArr(I, 1)), " ")
        For J = 0 To UBound(Tmp)
            MaTK = Tmp(J)
            R = Dic.Item(MaTK)
            If R Then
                dArr(I, 1) = Replace(tArr(R, 2), ",", "")
                Exit For
            End If
        Next J
    Next I
    .Range("B2").Resize(UBound(sArr)).ClearContents
    .Range("B2").Resize(I - 1, 1) = dArr
End With
Set Dic = Nothing
End Sub
 

File đính kèm

  • vd41.xls
    586.5 KB · Đọc: 15
Web KT

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

Back
Top Bottom