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
Thử xem sao.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
View attachment 275638
Vô tình hay cố ý?Thử xem sao.
nhấn vào mặt cười để xem kết quả ở C1:C..
Cảm ơn anh đã xem bài.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
Em chỉ chia sẻ cách nghĩ của mình chứ em không làm nhé: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 bạn đã chia sẻ.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
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
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)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
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
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ữagiú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
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ồiFor 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
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 í. hihiKhúc này chết dở rồi
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?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
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ôngLỡ 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
em đã làm theo hướng dẫn và đã làm được ạ, em cảm ơn anh nhiềuThử xem sao.
nhấn vào mặt cười để xem kết quả ở C1:C..