Tức là ghép toàn bộ những ai có cùng SBD lại thành 1 chuổi và chỉ lấy tên, đúng không?Làm thế nào để ghép được tên người và địa chỉ như file đính kèm. Xin mọi người giúp đỡ!
Bài của bạn cũng không phải thuộc dạng khó gì (chỉ là Unique và Join)... Có điều phải xử lý mấy thứ râu ria về việc dữ liệu không chuẩn cảm thấy mệt quáTức là ghép những người có cùng BB vào với nhau. Thường là xếp theo thứ tự luôn
Cái dở là thỉnh thoảng có những người có cái "đuôi" không mong muốn như bác ndu nói đấy ạ
Nhưng mục tiêu là chỉ cần tên người thôi, không cần cái đuôi đấy
Những người có chung BB thì thường là có cùng địa chỉ rồi (cùng phố)
Và nếu có thể thì các bác giúp luôn hộ em là nếu ai mà 1 mình 1 BB thì đánh cả họ và tên. Từ 2 người/BB trở lên (tối đa là 5 người/BB thôi) thì chỉ lấy mỗi tên
Bài của bạn cũng không phải thuộc dạng khó gì (chỉ là Unique và Join)... Có điều phải xử lý mấy thứ râu ria về việc dữ liệu không chuẩn cảm thấy mệt quá
Nói trước, bài này chỉ có thể dùng phương pháp lập trình VBA (liên quan đến nối chuổi không phải là thế mạnh của công thức)
Hic... Ai đang nghiên cứu VBA, bắt tay vào làm đi
Dữ liệu không có tổ chức!!! Vậy hô hào anh em bắt tay vào làm chi hả bạn. Bạn làm được tôi hoan nghênh 2 tay, 2 chân.
Đừng khích! Tôi đương nhiên làm được... nhưng mà:
- Thứ nhất: Tôi ghét cái vụ KHÍCH
- Thứ hai: Tôi ghét dữ liệu không chuẩn
Vậy thôi!
Còn những ai đang học VBA thì đây cũng xem như là 1 bài tập để dợt tay nghề ---> Vậy phải hô hào rồi
(càng khích càng.. cóc thèm làm...)
Bạn viết được 12 bài nhưng có thấy bài nào liên quan đến Excel đâu ---> Vậy thì vào đây ý kiến ý cò làm gì cho nó chật chỗTôi cũng không thích cái đề tài với dữ liệu không đâu vào đâu nên tôi không thích nghiên cứu
Trời ơi 2 bác giúp em cái chứ cứ đá qua đá lại thế này em chóng mặt quá.
Dữ liệu nó như vậy rồi nên em cũng không biết làm thế nào cả
Nên viết thành 1 Function cho nó tiện bạn à!Cách thì chắc chắn là có rồi. Mình là người tệ nhất vẫn có thể viết code cho bài này được mà. Nếu anh NDU mà viết thì code không dài lòng thòng như code của mình đâu.
Code của bạn chưa laọi trừ trường hợpCách thì chắc chắn là có rồi. Mình là người tệ nhất vẫn có thể viết code cho bài này được mà. Nếu anh NDU mà viết thì code không dài lòng thòng như code của mình đâu.
Làm thí thí một cái Function xem, mắc cỡ quá ...!Nên viết thành 1 Function cho nó tiện bạn à!
Mình cũng bị cái số 1.Code của bạn chưa laọi trừ trường hợp
1. Một người có mổ số BB
2. Nếu có trên 5 người cùng số BB thì ...
Public Function GPE(vung As Range, BB As Range) As String
Dim Rng(), I As Long, J As Long, K As Long, N As Long, Txt As String
Dim Ik As Long, Ij As Long, Tem As String, DC As String, Beta As Long
Rng = vung.Value
For I = 1 To UBound(Rng, 1)
If Rng(I, 2) = BB.Value Then
Beta = Beta + 1
DC = Rng(I, 3)
Txt = Application.WorksheetFunction.Trim(", " & Rng(I, 1))
For J = 1 To Len(Txt)
If Mid(Txt, J, 1) = "(" Or Mid(Txt, J, 1) = "-" Then
K = K + 1: N = J
End If
Next J
If K > 0 Then Txt = Left(Txt, N - 2)
For Ik = 1 To Len(Txt)
If Mid(Txt, Ik, 1) = " " Then Ij = Ik
Next Ik
If Ij > 0 Then
Tem = Tem & ", " & Mid(Txt, Ij + 1, 10)
Else
Tem = Tem & ", " & Txt
End If
End If
Next
If Beta > 1 Then
GPE = "Ô,bà (" & Mid(Tem, 3, 256) & ") - " & DC
Else
GPE = "Ô,bà " & Mid(Txt, 3, 256) & " - " & DC
End If
End Function
Híc!Em làm theo bác Ba Tê thì ứng dụng với tên người hay công ty có viết hoa ở cuối hay có ký tự "(" thì đúng. Nhưng tên thường thì không đúng. VD:
Uỷ ban mặt trận tổ quốc: thành tr
Hội cựu chiến binh: thành chiến
Nhưng như thế này là tốt lắm rồi ạ, những tên không đúng em đánh tay cũng được.
VBA quả là lợi hại. Em mới đọc thử một ít mà thấy hoa mắt quá. Em học KT không quen với lập trình.
Các bác đi trước chỉ cho em con đường nào để bắt đầu với ạ
Hôm nay cũng rảnh, vậy bắt tay làm thử cáiEm gửi file đính kèm một số tên bị lỗi
Còn tên người thì em thấy chuẩn luôn
Function StName(ByVal Text As String) As String
Dim aLib, libItem, pos As Long, tmpPos As Long
On Error Resume Next
aLib = Array("'", ":", ",", ".", "/", ">", "<", "(", ")", "-")
pos = Len(Text)
For Each libItem In aLib
If InStr(1, Text, CStr(libItem)) Then
tmpPos = InStr(1, Text, CStr(libItem))
If pos > tmpPos Then pos = tmpPos
End If
Next
If pos Then StName = Trim(Left(Text, pos + (tmpPos > 0)))
End Function
Function NameSplit(ByVal FullName As String, ByVal lType As Long) As String
Dim tmpArr, Arr(), Item1 As String, Item2 As String, Item3 As String, i As Long, n As Long
On Error Resume Next
FullName = Trim(FullName)
If Len(FullName) Then
tmpArr = Split(FullName, " ")
Item3 = tmpArr(UBound(tmpArr))
Item1 = tmpArr(0)
Select Case lType
Case 1: NameSplit = IIf(UBound(tmpArr) > 0, Item1, "")
Case 2
If UBound(tmpArr) > 1 Then
For i = 1 To UBound(tmpArr) - 1
If Len(Trim(CStr(tmpArr(i)))) > 0 Then
n = n + 1
ReDim Preserve Arr(1 To n)
Arr(n) = Trim(CStr(tmpArr(i)))
End If
Next
If n Then NameSplit = Join(Arr, " ")
End If
Case 3: NameSplit = Item3
End Select
End If
End Function
Function ArrNameSplit(ByVal sArray, ByVal lType As Long)
Dim tmpArr, Arr(), lDim As Long, i As Long, j As Long, tmp As String
On Error Resume Next
tmpArr = sArray
If TypeName(tmpArr) <> "Variant()" Then
ArrNameSplit = NameSplit(StName(tmpArr), lType)
Else
lDim = Dimensions(tmpArr)
If lDim < 3 Then
If lDim = 1 Then
For i = LBound(tmpArr) To UBound(tmpArr)
tmp = StName(tmpArr(i))
tmpArr(i) = NameSplit(tmp, lType)
Next
Else
For i = LBound(tmpArr, 1) To UBound(tmpArr, 1)
For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
tmp = StName(tmpArr(i, j))
tmpArr(i, j) = NameSplit(tmp, lType)
Next
Next
End If
End If
ArrNameSplit = tmpArr
End If
End Function
Function Dimensions(ByVal sArray) As Long
Dim chkDim As Long, lDim As Long, tmpArr
On Error Resume Next
tmpArr = sArray
If IsArray(tmpArr) Then
Do While Err.Number = 0
lDim = lDim + 1
chkDim = LBound(tmpArr, lDim)
Loop
Dimensions = lDim - 1
End If
End Function
Function UniqueList(ByVal bType As Boolean, ParamArray sArray())
Dim Item, tmpArr, SubArr
On Error Resume Next
With CreateObject("Scripting.Dictionary")
For Each SubArr In sArray
tmpArr = SubArr
If TypeName(tmpArr) <> "Variant()" Then
If tmpArr <> "" Then .Add tmpArr, ""
Else
For Each Item In tmpArr
If Item <> "" Then
If Not .Exists(Item) Then .Add Item, ""
End If
Next
End If
Next
UniqueList = IIf(bType, .Keys, .Count)
End With
End Function
Function JoinText(ByVal Sep As String, ByVal IgnoreBlanks As Boolean, ParamArray sArray()) As String
Dim tmpArr, SubArr, Arr(), Item, n As Long
On Error Resume Next
For Each SubArr In sArray
tmpArr = SubArr
If TypeName(tmpArr) <> "Variant()" Then
If IgnoreBlanks = False Or Len(Trim(CStr(tmpArr))) > 0 Then
n = n + 1
ReDim Preserve Arr(1 To n)
Arr(n) = CStr(tmpArr)
End If
Else
For Each Item In tmpArr
If IgnoreBlanks = False Or Len(Trim(CStr(Item))) > 0 Then
n = n + 1
ReDim Preserve Arr(1 To n)
Arr(n) = CStr(Item)
End If
Next
End If
Next
If n Then JoinText = Join(Arr, Sep)
End Function
=IF(ROWS($1:1)> UniqueList(0,$B$3:$B$24),"",INDEX(UniqueList(1,$B$3:$B$24),,ROWS($1:1)))
=IF($F3="","","Ô,bà (" & JoinText(", ", TRUE, IF($B$3:$B$24=F3,ArrNameSplit($A$3:$A$24,3),"")) & ") - "&VLOOKUP($F3,$B$3:$C$24,2,0))
Xem thử lại file này, đã chỉnh lại một số sai sót.Em gửi file đính kèm một số tên bị lỗi
Còn tên người thì em thấy chuẩn luôn
Bạn xem 3 bài viết này là được:Tuyệt vời! Em thấy kết cái anh VBA này rồi.
Các bác đi trước cho em một vài kinh nghiệm để bắt đầu nghiên cứu từ đâu với ạ
Mới đầu đọc thấy rộng quá