Ghép tên người và địa chỉ (1 người xem)

  • Thread starter Thread starter tungvu83
  • Ngày gửi Ngày gửi
Liên hệ QC

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

tungvu83

Thành viên mới
Tham gia
16/2/12
Bài viết
43
Được thích
0
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 đỡ!
 

File đính kèm

Lấy tiêu thức nào để ghép đây. Muốn gì đi nữa phải nói rõ mọi người mới giúp cho được.
 
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 đỡ!
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?
Nhưng mà dữ liệu cột A của bạn sao kỳ cục vậy... Tên người còn có cái "đuôi" phía sau như:
Nguyễn Thị Huyền Trang (Cột 19)
Nguyễn Thành Trung (Cột 13)
Nguyễn Tác Lâm (Cột 4)
Ngô Đình Thức (Cột 19)

Là ý nghĩa thế nào đây?
Ngoài ra cũng phải hỏi thêm: Những người cùng SBD nhưng khác địa chỉ thì ghép thế nào đây?
 
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
 
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
 
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.
 
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...)
 
Đừ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...)

1.- Nếu tôi khích bạn thì bạn có làm được không? 2.- 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
 
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
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ỗ
Hic...
Nói chung: Thích nghiên cứu VBA thì mời tham gia, không thì thôi ---> Miễn bàn!
 
Lần chỉnh sửa cuối:
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ả
 
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ả

Vậy thì bạn trả lời câu này trước: CÓ MUỐN GIẢI QUYẾT BÀI NÀY BẰNG PHƯƠNG PHÁP LẬP TRÌNH VBA KHÔNG?
Nếu bạn đồng ý, sẽ có rất nhiều thành viên giúp bạn
(Làm bằng công thức là.. THUA rồi đó)
 
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.
 

File đính kèm

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ợp
1. Một người có mổ số BB
2. Nếu có trên 5 người cùng số BB thì ...
 
Mình gởi bài chắng qua là muốn khởi động cho bài này thôi, mình cũng biết code còn thiếu nhiều thứ nhưng bản thân chưa thấy được. Nhưng nếu sai nhiều thì cũng sẽ mau tiến bộ vì mình đang vận động mà.
 
Nên viết thành 1 Function cho nó tiện bạn à!
Làm thí thí một cái Function xem, mắc cỡ quá ...!
=GPE(Bảng dữ liệu, BB)
-----------
Bỏ giùm mấy cái liên quan với Arr(), định làm Sub nên khai báo tùm lum, sau sửa thành Function nên ... dư.
Ẹc 2 cái!
 

File đính kèm

Lần chỉnh sửa cuối:
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ì ...
Mình cũng bị cái số 1.
Sửa lại thêm tí:
PHP:
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
 
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 ạ
 
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íc!
Hổng hiểu. Trong code có dính gì với chữ hoa hay chữ thường đâu "Chời".
Bạn đưa chừng 10 dòng dữ liệu giống thật của bạn mà bị sai lên đây xem.
 
Lần chỉnh sửa cuối:
Theo tôi các bạn nên làm theo hướng này:
- Tạo 1 hàm dùng để chuẩn hóa TÊN: Chuẩn hóa có nghĩa là không cho phép có bất cứ ký tự lạ nào (trừ a, b, c) trong chuổi ---> Khi phát hiện có ký tự lạ, lập từ xóa từ vị trí đó đến cuối chuổi... Các bạn có thể tạo 1 "thư viện" đánh dấu các ký tự lạ như *, ", /. \, &, ^ ... vân vân...
- Tạo 1 hàm tách tên hoạt động được với mảng
- Tạo hàm JoinText hoạt động được với mảng (hàm này tôi đã viết rồi)
-------------
Tóm lại:
- Các bạn không thể gôm chung mọi thứ vào 1 hàm, vì như thế là thiếu khoa học ---> 1 hàm khi đã tạo ra phải có ứng dụng vào việc khác nữa chứ
- Vậy để giải quyết bài này, tôi nghĩ phải viết ít nhất 4 hàm riêng biệt: 3 hàm tôi đề cập ở trên + 1 hàm lọc Unique cho SBD
 
Lần chỉnh sửa cuối:
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
 

File đính kèm

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
Hôm nay cũng rảnh, vậy bắt tay làm thử cái
--------------------
Bài này cần 1 số hàm hổ trợ như sau:
1> Chuẩn hóa TÊN
PHP:
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
biến aLib là thư viện, có thể thêm vào tùy ý
2> Hàm tách tên (đầu vào là 1 chuổi, kết quả là 1 chuổi)
PHP:
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
3> Hảm tách tên hoạt động trên Array (đầu vào là mảng, kết quả là mảng)
PHP:
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
4> Hảm đếm số chiều của mảng:
PHP:
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
5> Hàm lọc duy nhất (đầu vào là mảng, kết quả là mảng)
PHP:
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
Lưu ý: Với bType = True thì hàm này trả về 1 list các phần tử duy nhất, ngược lại, nó đếm số phần tử duy nhất
6> Hàm JoinText (đầu vào là mảng, kết quả là chuổi)
PHP:
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
---------------------
ÁP DỤNG:
- Tại F3, gõ công thức:
Mã:
=IF(ROWS($1:1)> UniqueList(0,$B$3:$B$24),"",INDEX(UniqueList(1,$B$3:$B$24),,ROWS($1:1)))
- Tại E3 gõ công thức:
Mã:
=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))
---------------------
Mọi thứ gần như đã làm hết rồi, phần còn lại như bạn đề xuất: "Nếu 1 SBD chỉ có 1 người thì tên để nguyên" ---> Cái này có thể dùng COUNTIF để kiểm tra và cho vào hàm IF mà lọc ---> Bạn tự làm nhé
 

File đính kèm

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
Xem thử lại file này, đã chỉnh lại một số sai sót.
Chỉ sử dụng khi có dấu - và dấu (
Nếu có các dấu khác thì phải chỉnh sửa nữa.
 

File đính kèm

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á
 
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á
Bạn xem 3 bài viết này là được:
Kiến thức cơ bản về Visual Basic for Applications (VBA)
Chập chững đến VBA!
Giới thiệu Cơ bản về vòng lặp For . . . next
Ngoài ra, có thể mua sách lập trình do GPE phát hành về đọc
Lên diễn đàn thường xuyên, hỏi đáp và trao đổi kinh nghiệm cũng là cách học rất tốt
Chúc bạn thành công
 
Em sẽ cố gắng ngâm cứu. Cảm ơn anh!
 

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

Back
Top Bottom