giúp em lọc những số còn liên lạc được với ạ

Liên hệ QC

thonguyen487912

Thành viên mới
Tham gia
5/5/22
Bài viết
7
Được thích
0
Giới tính
Nữ
Nghề nghiệp
Nhân viên văn phòng
giúp em lọc các số có mã là NOA ra riêng, những số còn lại xóa hết với ạ, em xin cảm ơn
1652066156251.png
 

File đính kèm

  • KBM.xlsx
    9.2 KB · Đọc: 21
Thử xem sao.
nhấn vào mặt cười để xem kết quả ở C1:C..
Vô tình hay cố ý?
file gốc: "0321546251 anh NOA"
file test: "0321546251 NOA"
file gốc có ký tự trước key text "NOA", file test không có
Khi chạy trên file gốc, kết quả SAI
 
Vô tình hay cố ý?
file gốc: "0321546251 anh NOA"
file test: "0321546251 NOA"
file gốc có ký tự trước key text "NOA", file test không có
Khi chạy trên file gốc, kết quả SAI
Cảm ơn anh đã xem bài.
1/Cái này tôi đã sửa lại dữ liệu gốc, bởi vì nghĩ chủ thớt có thể đã gõ nhầm (thêm chữ anh sau số ĐT) vả lại dữ liệu quá ít để lường các tình huống khác
2/ Tôi nghĩ là dữ liệu gốc có chữ anh sau số ĐT và trước "NOA" thì sửa lại code chắc cũng cho ra kết quả thôi.
Nếu có thể, Anh chia sẻ giải pháp của mình để mọi người (có tôi trong đó) được học tập.
 
Cảm ơn anh đã xem bài.
1/Cái này tôi đã sửa lại dữ liệu gốc, bởi vì nghĩ chủ thớt có thể đã gõ nhầm (thêm chữ anh sau số ĐT) vả lại dữ liệu quá ít để lường các tình huống khác
2/ Tôi nghĩ là dữ liệu gốc có chữ anh sau số ĐT và trước "NOA" thì sửa lại code chắc cũng cho ra kết quả thôi.
Nếu có thể, Anh chia sẻ giải pháp của mình để mọi người (có tôi trong đó) được học tập.
Em chỉ chia sẻ cách nghĩ của mình chứ em không làm nhé:
Có một bài nào đó bạn ấy có nói về tách dữ liệu giữa các dấu | với // , vì thế sẽ tách chuỗi này thành nhiều phần dựa vào các ký tự đó ( chuyển // thành "|" sau đó split "|"). Tức là trong mỗi chuỗi nhỏ này sẽ chứa 1 người kèm sđt. Nếu trong đó có sđt và có NOA thì lấy sđt đó, nếu không thì bỏ qua
 
Em chỉ chia sẻ cách nghĩ của mình chứ em không làm nhé:
Có một bài nào đó bạn ấy có nói về tách dữ liệu giữa các dấu | với // , vì thế sẽ tách chuỗi này thành nhiều phần dựa vào các ký tự đó ( chuyển // thành "|" sau đó split "|"). Tức là trong mỗi chuỗi nhỏ này sẽ chứa 1 người kèm sđt. Nếu trong đó có sđt và có NOA thì lấy sđt đó, nếu không thì bỏ qua
Cảm ơn bạn đã chia sẻ.
Tôi cũng đã làm cách đó nhưng không hiểu sao mặc dù đã for j = 0 to ubound(S) với S= split(arr(i,1),"//") rồi, nhưng nó chỉ ra S chuỗi phía sau //, làm mãi, làm mãi mà không được, mới phân tích Chuỗi mẹ (arr(i,1) và nhận thấy các Số ĐT cần rút ra đều nằm trước "NOA" (liền kề- hoặc cách 1 chuỗi con khác). Do vậy mới co code như trên. Tuy nhiên do có ít dữ liệu quá nên trường hợp trước NOA có ký tự text đã bị tôi xóa( như lý do đã nêu ở bài #4. Để xử lý trường hợp như file gốc (có ký tự Text trước "NOA" và sau Sô ĐT cần lấy tôi có sửa lại code thành:
Mã:
Option Explicit

Sub TachSoDienThoai()
Dim i&, j&, Lr, R&, k&, t&
Dim Arr(), KQ(), SoDT
Dim Ws As Worksheet
Application.ScreenUpdating = False

Set Ws = Sheet1
Lr = Ws.Cells(Rows.Count, "A").End(xlUp).Row
Arr = Ws.Range("A1:A" & Lr).Value
R = UBound(Arr)
ReDim KQ(1 To R, 1 To 1)
For i = 1 To R
        SoDT = Split(Arr(i, 1), " ")
            For k = 0 To UBound(SoDT)
                If SoDT(k) = "NOA" Then
                    If IsNumeric(SoDT(k - 1)) Then
                        t = k - 1
                    Else
                        t = k - 2
                    End If
                        If Len(KQ(i, 1)) = 0 Then
                            KQ(i, 1) = SoDT(t)
                        Else
                            KQ(i, 1) = KQ(i, 1) & "; " & SoDT(t)
                        End If
                End If
            Next k
Next i
Ws.Range("C1").Resize(R, 1) = KQ
Application.ScreenUpdating = True
MsgBox "Done"
End Sub
Nhân đây cũng xin hỏi các anh chị em thành viên đi qua xem bài là code này có vấn đề gì không? cả về mặt giải thuật cũng như cấu trúc(dài, ngắn, rườm rà...), cũng như tốc độ xử lý nếu dữ liệu nhiều.
Trân trọng.
 
Tôi cũng đã làm cách đó nhưng không hiểu sao mặc dù đã for j = 0 to ubound(S) với S= split(arr(i,1),"//") rồi, nhưng nó chỉ ra S chuỗi phía sau //, làm mãi, làm mãi mà không được
Lỡ tham gia rồi nên em cũng viết một UDF luôn, code chỉ xác định trong chuỗi split chỉ có 1 sđt, nếu có 2 số thì chỉ lấy số đầu tiên bắt được (theo dữ liệu thì chỉ có một số thôi)
Mã:
Option Explicit

Public Function TachSDT_NOA(ByVal Str As String, Optional Deli As String = ";")
Dim Tmp As Variant, subTmp As Variant, I As Long, J As Long, uB As Long, S As String
Str = Replace(Str, "//", "|")
Tmp = Split(Str, "|")
uB = UBound(Tmp)
For I = 0 To uB
    S = Tmp(I)
    If InStr(1, S, "NOA", vbBinaryCompare) Then 'NOA bat buoc viet hoa
        subTmp = Split(S)
        For J = 0 To UBound(subTmp)
            Select Case Len(subTmp(J))
                Case 10, 11: If IsNumeric(subTmp(J)) Then Exit For 'sdt 10 sô, hoac 84xx..
                Case 12: If Left(subTmp(J), 1) = "+" Then Exit For ' sdt +84xxx...
            End Select
        Next
        If J <= UBound(subTmp) Then
            If TachSDT_NOA = "" Then
                TachSDT_NOA = subTmp(J)
            Else
                TachSDT_NOA = TachSDT_NOA & ";" & subTmp(J)
            End If
        End If
    End If
Next
End Function
 
giúp em lọc các số có mã là NOA ra riêng, những số còn lại xóa hết với ạ, em xin cảm ơn
Góp vui thêm 1 cách nữa. Không biết có bị lỗi gì không với dữ liệu nhiều hay không nữa
Mã:
Option Explicit

Sub ABC()
Dim sArr(), Res(), i&, Tmp, Chuoi$, SDT$, ii&, iii&
With Sheet1
    sArr = .Range("A1:A" & .Range("A" & Rows.Count).End(3).Row).Value
    ReDim Res(1 To UBound(sArr), 1 To 1)
    For i = 1 To UBound(sArr)
        sArr(i, 1) = Replace(sArr(i, 1), "//", "|")
        Tmp = Split(sArr(i, 1), "|")
        For ii = 0 To UBound(Tmp)
            If InStr(1, Tmp(ii), "NOA") > 0 Then
                For iii = 1 To Len(Tmp(ii))
                    If IsNumeric(Mid(Tmp(ii), iii, 1)) = True Then
                        Chuoi = Chuoi & Mid(Tmp(ii), iii, 1)
                        If Len(Chuoi) = 10 Then Exit For
                    End If
                Next
               If Len(SDT) Then SDT = SDT & ";" & Chuoi Else SDT = Chuoi: Chuoi = Empty
            End If
        Next
        Res(i, 1) = SDT: SDT = Empty: Chuoi = Empty
    Next
.Range("E1").Resize(UBound(sArr), 1).Value = Res
End With
End Sub
 
Khúc này chết dở rồi :D
Hihi. Nhờ anh chỉ giúp. Suy nghĩ 1 mình không thể lường trước hết các trường hợp. Nhìn code của anh. Chợt phát hiện ra vụ +84. Lỡ đăng rồi đang chờ có người chỉ điểm. Anh đã là người đầu tiên í. hihi
 
Hihi. Nhờ anh chỉ giúp. Suy nghĩ 1 mình không thể lường trước hết các trường hợp. Nhìn code của anh. Chợt phát hiện ra vụ +84. Lỡ đăng rồi đang chờ có người chỉ điểm. Anh đã là người đầu tiên í. hihi
Bạn mid từng ký tự mà, nếu là số thì nối thành chuỗi. Vậy lỡ trước sđt có ông A tổ 1 ấp 2 thì làm sao?
code mình ở trên (#7) còn thiếu vụ replace các ký tự phân cách như phẩy, chấm thành space. Đôi khi có trường hợp "0123456789, gì gì đó" thì bị sai ngay
 
Lỡ tham gia rồi nên em cũng viết một UDF luôn, code chỉ xác định trong chuỗi split chỉ có 1 sđt, nếu có 2 số thì chỉ lấy số đầu tiên bắt được (theo dữ liệu thì chỉ có một số thôi)
Mã:
Option Explicit

Public Function TachSDT_NOA(ByVal Str As String, Optional Deli As String = ";")
Dim Tmp As Variant, subTmp As Variant, I As Long, J As Long, uB As Long, S As String
Str = Replace(Str, "//", "|")
Tmp = Split(Str, "|")
uB = UBound(Tmp)
For I = 0 To uB
    S = Tmp(I)
    If InStr(1, S, "NOA", vbBinaryCompare) Then 'NOA bat buoc viet hoa
        subTmp = Split(S)
        For J = 0 To UBound(subTmp)
            Select Case Len(subTmp(J))
                Case 10, 11: If IsNumeric(subTmp(J)) Then Exit For 'sdt 10 sô, hoac 84xx..
                Case 12: If Left(subTmp(J), 1) = "+" Then Exit For ' sdt +84xxx...
            End Select
        Next
        If J <= UBound(subTmp) Then
            If TachSDT_NOA = "" Then
                TachSDT_NOA = subTmp(J)
            Else
                TachSDT_NOA = TachSDT_NOA & ";" & subTmp(J)
            End If
        End If
    End If
Next
End Function
Cảm ơn anh rất rất nhiều ạ. Em đã làm theo cách hướng dẫn của anh và thành công
Bài đã được tự động gộp:

Thử xem sao.
nhấn vào mặt cười để xem kết quả ở C1:C..
em đã làm theo hướng dẫn và đã làm được ạ, em cảm ơn anh nhiều
 
Web KT

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

Back
Top Bottom