Tách tên và nối chuỗi theo điều kiện (1 người xem)

Liên hệ QC

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

File đính kèm

Upvote 0
Cảm ơn bạn kết quả đúng với ý mong muốn của mình lắm.
Nhưng hiện giờ mình đang gặp vấn đề này làm phiền bạn thêm lần nữa: ý là nếu mình lấy kết quả tên không thôi thì chiếu lên biêu đồ mọi người sẽ không biết người tên đó mã số nào nên mình phải sửa lại kết quả minh họa như file đình kèm.
Bạn xử lý giúp mình theo file đính kèm với bạn nhé!
Trân trọng cảm ơn!
 

File đính kèm

Upvote 0
Cảm ơn bạn kết quả đúng với ý mong muốn của mình lắm.
Nhưng hiện giờ mình đang gặp vấn đề này làm phiền bạn thêm lần nữa: ý là nếu mình lấy kết quả tên không thôi thì chiếu lên biêu đồ mọi người sẽ không biết người tên đó mã số nào nên mình phải sửa lại kết quả minh họa như file đình kèm.
Bạn xử lý giúp mình theo file đính kèm với bạn nhé!
Trân trọng cảm ơn!
Thêm chỗ màu đỏ:
Mã:
Public Function GhepTen(MaSV As Range, HoTen As Range, MaGhep As String) As String
Dim i As Long, j As Long, Tam
Tam = Split(MaGhep, " & ")
For i = 0 To UBound(Tam)
    For j = 1 To MaSV.Rows.Count
        If Tam(i) Like MaSV(j, 1).Value Then
            GhepTen = GhepTen & " & " [COLOR=#ff0000][B]& MaSV(j, 1) & " "[/B][/COLOR] & Ten(HoTen(j, 1))
            Exit For
        End If
    Next j
Next i
If Len(GhepTen) Then GhepTen = Mid(GhepTen, 4)
End Function
 
Upvote 0

File đính kèm

Upvote 0
Cảm ơn bạn kết quả đúng với ý mong muốn của mình lắm.
Nhưng hiện giờ mình đang gặp vấn đề này làm phiền bạn thêm lần nữa: ý là nếu mình lấy kết quả tên không thôi thì chiếu lên biêu đồ mọi người sẽ không biết người tên đó mã số nào nên mình phải sửa lại kết quả minh họa như file đình kèm.
Bạn xử lý giúp mình theo file đính kèm với bạn nhé!
Trân trọng cảm ơn!

Bài này nếu làm cho đàng hoàng thì phải tách nó ra thành 3 bài toán:
1> Bài toán tách tên có khả năng cho phép biến đầu vào là 1 mảng (lấy đại code tách tên nào đó và sửa thành hàm mảng)
2> Bài toán nối chuỗi theo điều kiện (hàm JoinText đã đang trên diễn đàn)
3> Hàm Split chuỗi thành mảng (quá dễ, dùng hàm Split trong VBA để xử)
----------------
Làm như vậy thì mức độ ứng dụng mới cao (có khả năng áp dụng cho nhiều trường hợp khác). Bởi nếu viết code chỉ để áp dụng cho riêng bài này đúng là quá dễ nhưng chẳng ngon lành gì (viết xong rồi... bỏ)
 
Lần chỉnh sửa cuối:
Upvote 0
Thêm chỗ màu đỏ:
Mã:
Public Function GhepTen(MaSV As Range, HoTen As Range, MaGhep As String) As String
Dim i As Long, j As Long, Tam
Tam = Split(MaGhep, " & ")
For i = 0 To UBound(Tam)
    For j = 1 To MaSV.Rows.Count
        If Tam(i) Like MaSV(j, 1).Value Then
            GhepTen = GhepTen & " & " [COLOR=#ff0000][B]& MaSV(j, 1) & " "[/B][/COLOR] & Ten(HoTen(j, 1))
            Exit For
        End If
    Next j
Next i
If Len(GhepTen) Then GhepTen = Mid(GhepTen, 4)
End Function
Cảm ơn bạn code OK rồi.

không hiểu yêu cầu tìm kiếm nối chuỗi của bạn áp dụng vào mục đích gì ?
Bài toán náy đơn giản chỉ là tìm kiếm họ tên theo mã số rồi lấy phần tên thôi anh ạ, nhưng vì lấy phần tên không thì e là sẽ trùng tên người này với người kia lên em phải lấy thêm cả phần mã số nữa ạ,
cảm ơn anh đã giúp đỡ,thật đáng khâm phục em không nghĩ rằng có thể giải quyết bằng công thức được thế này. Nhưng nếu có thể anh bổ sung thêm giúp em phần mã số với ạ. Em cũng chưa thể hiểu được công thức trong các name này ạ.

Bài này nếu làm cho đàng hoàng thì phải tách nó ra thành 3 bài toán:
1> Bài toán tách tên có khả năng cho phép biến đầu vào là 1 mảng (lấy đại code tách tên nào đó và sửa thành hàm mảng)
2> Bài toán nối chuỗi theo điều kiện (hàm JoinText đã đang trên diễn đàn)
3> Hàm Split chuỗi thành mảng (quá dễ, dùng hàm Split trong VBA để xử)
----------------
Làm như vậy thì mức độ ứng dụng mới cao (có khả năng áp dụng cho nhiều trường hợp khác). Bởi nếu viết code chỉ để áp dụng cho riêng bài này đúng là quá dễ nhưng chẳng ngon lành gì (viết xong rồi... bỏ)

Cảm ơn Thầy đã góp ý ạ, mục 1 thì em biết nhưng mục 2 thì em có biết đến nhưng chưa biết áp dụng con mục 3 em chưa biết đến Thầy ạ .
Nếu không phiền Thầy có thể cho em xin một ví dụ minh họa được không ạ.
Em cảm ơn Thầy.
 
Upvote 0
Cảm ơn Thầy đã góp ý ạ, mục 1 thì em biết nhưng mục 2 thì em có biết đến nhưng chưa biết áp dụng con mục 3 em chưa biết đến Thầy ạ .
Nếu không phiền Thầy có thể cho em xin một ví dụ minh họa được không ạ.
Em cảm ơn Thầy.

Tôi cần có bao nhiêu đây hàm:
1> Hàm hỗ trợ tách tên:
Mã:
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 SourceArray, ByVal lType As Long)
  Dim tmpArr, arr(), lDim As Long, i As Long, j As Long, tmp As String
  On Error Resume Next
  tmpArr = SourceArray
  If TypeName(tmpArr) <> "Variant()" Then
    arrNameSplit = NameSplit(tmpArr, lType)
  Else
    lDim = Dimensions(tmpArr)
    If lDim < 3 Then
      If lDim = 1 Then
        For i = LBound(tmpArr) To UBound(tmpArr)
          tmp = 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 = tmpArr(i, j)
            tmpArr(i, j) = NameSplit(tmp, lType)
          Next
        Next
      End If
    End If
    arrNameSplit = tmpArr
  End If
End Function
Private Function Dimensions(ByVal SourceArray) As Long
  Dim chkDim As Long, lDim As Long, tmpArr
  On Error Resume Next
  tmpArr = SourceArray
  If IsArray(tmpArr) Then
    Do While Err.Number = 0
      lDim = lDim + 1
      chkDim = LBound(tmpArr, lDim)
    Loop
   Dimensions = lDim - 1
  End If
End Function
trong đó hàm NameSplit có đối số đầu vào là 1 chuỗi đơn còn hàm arrNameSplit có đối số đầu vào là mảng hoặc chuỗi đơn tùy ý
2> Hàm Split chuỗi thành mảng:
Mã:
Function SplitText(ByVal Text As String, ByVal Delimiter As String)
   SplitText = Split(Text, Delimiter)
End Function
3> Hàm nối chuỗi theo điều kiện:
Mã:
Function JoinText(ByVal Delimiter As String, ParamArray Arrays()) As String
  Dim aTmp, arr(), Item, tmp As String
  Dim i As Long, n As Long
  'On Error Resume Next
  For i = LBound(Arrays) To UBound(Arrays)
    aTmp = Arrays(i)
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      If TypeName(Item) <> "Error" Then
        tmp = CStr(Item)
        n = n + 1
        ReDim Preserve arr(1 To n)
        arr(n) = tmp
      End If
    Next
  Next
  If n Then JoinText = Join(arr, Delimiter)
End Function
-----------------
Áp dụng công thức tại cell I3:
Mã:
=JoinText(" & ",SplitText(H3," & ")&"."&arrNameSplit(T(OFFSET($E$3:$E$11,MATCH(--SplitText(H3," & "),$D$3:$D$11,0)-1,)),3))
Đây mới là những CÔNG CỤ có thể lưu trong máy tính để dùng lâu dài (cho nhiều trường hợp khác liên quan đến TÁCH TÊN và NỐI CHUỖI)
 

File đính kèm

Upvote 0
Tôi cần có bao nhiêu đây hàm:
1> Hàm hỗ trợ tách tên:
Mã:
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 SourceArray, ByVal lType As Long)
  Dim tmpArr, arr(), lDim As Long, i As Long, j As Long, tmp As String
  On Error Resume Next
  tmpArr = SourceArray
  If TypeName(tmpArr) <> "Variant()" Then
    arrNameSplit = NameSplit(tmpArr, lType)
  Else
    lDim = Dimensions(tmpArr)
    If lDim < 3 Then
      If lDim = 1 Then
        For i = LBound(tmpArr) To UBound(tmpArr)
          tmp = 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 = tmpArr(i, j)
            tmpArr(i, j) = NameSplit(tmp, lType)
          Next
        Next
      End If
    End If
    arrNameSplit = tmpArr
  End If
End Function
Private Function Dimensions(ByVal SourceArray) As Long
  Dim chkDim As Long, lDim As Long, tmpArr
  On Error Resume Next
  tmpArr = SourceArray
  If IsArray(tmpArr) Then
    Do While Err.Number = 0
      lDim = lDim + 1
      chkDim = LBound(tmpArr, lDim)
    Loop
   Dimensions = lDim - 1
  End If
End Function
trong đó hàm NameSplit có đối số đầu vào là 1 chuỗi đơn còn hàm arrNameSplit có đối số đầu vào là mảng hoặc chuỗi đơn tùy ý
2> Hàm Split chuỗi thành mảng:
Mã:
Function SplitText(ByVal Text As String, ByVal Delimiter As String)
   SplitText = Split(Text, Delimiter)
End Function
3> Hàm nối chuỗi theo điều kiện:
Mã:
Function JoinText(ByVal Delimiter As String, ParamArray Arrays()) As String
  Dim aTmp, arr(), Item, tmp As String
  Dim i As Long, n As Long
  'On Error Resume Next
  For i = LBound(Arrays) To UBound(Arrays)
    aTmp = Arrays(i)
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      If TypeName(Item) <> "Error" Then
        tmp = CStr(Item)
        n = n + 1
        ReDim Preserve arr(1 To n)
        arr(n) = tmp
      End If
    Next
  Next
  If n Then JoinText = Join(arr, Delimiter)
End Function
-----------------
Áp dụng công thức tại cell I3:
Mã:
=JoinText(" & ",SplitText(H3," & ")&"."&arrNameSplit(T(OFFSET($E$3:$E$11,MATCH(--SplitText(H3," & "),$D$3:$D$11,0)-1,)),3))
Đây mới là những CÔNG CỤ có thể lưu trong máy tính để dùng lâu dài (cho nhiều trường hợp khác liên quan đến TÁCH TÊN và NỐI CHUỖI)

Em cảm ơn Thầy đã giúp đỡ ạ, thật sự hiện giờ em vẫn chưa hiểu gì cả,trong quá trình áp dụng nếu có vấn đề gì mong lại nhận được thêm sự giúp đỡ của Thầy và mọi người ạ.
 
Upvote 0
Tôi cần có bao nhiêu đây hàm:
......
Áp dụng công thức tại cell I3:
Mã:
=JoinText(" & ",SplitText(H3," & ")&"."&arrNameSplit(T(OFFSET($E$3:$E$11,MATCH(--SplitText(H3," & "),$D$3:$D$11[COLOR=#ff0000][B],0)-1,)),3[/B][/COLOR]))
Đây mới là những CÔNG CỤ có thể lưu trong máy tính để dùng lâu dài (cho nhiều trường hợp khác liên quan đến TÁCH TÊN và NỐI CHUỖI)

Thầy ạ, Thầy có thể giải thích giúp em phần đo đỏ được không ạ.
Xin cảm ơn Thây!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Thầy ạ, Thầy có thể giải thích giúp em phần đo đỏ được không ạ.
Xin cảm ơn Thây!

- Số 0 đầu tiên là đối số của hàm MATCH (dò chính xác)
- Số -1 tiếp theo: Sau khi có kết quả MATCH, ta trừ bớt 1 để làm đối số Rows cho hàm Offset
- Số 3 cuối cùng là đối số của hàm arrNameSplit (có ý nghĩa là lấy TÊN. Nếu đối số này =1 thì lấy HỌ, =2 lấy CHỮ LÓT)
 
Upvote 0
Tôi cần có bao nhiêu đây hàm:
1> Hàm hỗ trợ tách tên:
Mã:
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 SourceArray, ByVal lType As Long)
  Dim tmpArr, arr(), lDim As Long, i As Long, j As Long, tmp As String
  On Error Resume Next
  tmpArr = SourceArray
  If TypeName(tmpArr) <> "Variant()" Then
    arrNameSplit = NameSplit(tmpArr, lType)
  Else
    lDim = Dimensions(tmpArr)
    If lDim < 3 Then
      If lDim = 1 Then
        For i = LBound(tmpArr) To UBound(tmpArr)
          tmp = 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 = tmpArr(i, j)
            tmpArr(i, j) = NameSplit(tmp, lType)
          Next
        Next
      End If
    End If
    arrNameSplit = tmpArr
  End If
End Function
Private Function Dimensions(ByVal SourceArray) As Long
  Dim chkDim As Long, lDim As Long, tmpArr
  On Error Resume Next
  tmpArr = SourceArray
  If IsArray(tmpArr) Then
    Do While Err.Number = 0
      lDim = lDim + 1
      chkDim = LBound(tmpArr, lDim)
    Loop
   Dimensions = lDim - 1
  End If
End Function
trong đó hàm NameSplit có đối số đầu vào là 1 chuỗi đơn còn hàm arrNameSplit có đối số đầu vào là mảng hoặc chuỗi đơn tùy ý
2> Hàm Split chuỗi thành mảng:
Mã:
Function SplitText(ByVal Text As String, ByVal Delimiter As String)
   SplitText = Split(Text, Delimiter)
End Function
3> Hàm nối chuỗi theo điều kiện:
Mã:
Function JoinText(ByVal Delimiter As String, ParamArray Arrays()) As String
  Dim aTmp, arr(), Item, tmp As String
  Dim i As Long, n As Long
  'On Error Resume Next
  For i = LBound(Arrays) To UBound(Arrays)
    aTmp = Arrays(i)
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      If TypeName(Item) <> "Error" Then
        tmp = CStr(Item)
        n = n + 1
        ReDim Preserve arr(1 To n)
        arr(n) = tmp
      End If
    Next
  Next
  If n Then JoinText = Join(arr, Delimiter)
End Function
-----------------
Áp dụng công thức tại cell I3:
Mã:
=JoinText(" & ",SplitText(H3," & ")&"."&arrNameSplit(T(OFFSET($E$3:$E$11,MATCH(--SplitText(H3," & "),$D$3:$D$11,0)-1,)),3))
Đây mới là những CÔNG CỤ có thể lưu trong máy tính để dùng lâu dài (cho nhiều trường hợp khác liên quan đến TÁCH TÊN và NỐI CHUỖI)

Xin chào Thầy,
Em áp dụng hàm trên thấy phát sinh lỗi nhỏ như đã nêu trong file kèm.
Phiền Thầy và các anh chị sửa lại giúp em với ạ.
Xin cảm ơn.
 

File đính kèm

Upvote 0
Xin chào Thầy,
Em áp dụng hàm trên thấy phát sinh lỗi nhỏ như đã nêu trong file kèm.
Phiền Thầy và các anh chị sửa lại giúp em với ạ.
Xin cảm ơn.

Thì bạn có thể chỉnh công thức lại thành vầy:
Mã:
=JoinText(" & ",SplitText(H3," & ")&"."&arrNameSplit([COLOR=#ff0000]IFERROR([/COLOR]T(OFFSET($E$3:$E$11,MATCH(--SplitText(H3," & "),$D$3:$D$11,0)-1,))[COLOR=#ff0000],"")[/COLOR],3))
Thêm IFERROR vào là được mà
 
Upvote 0
Web KT

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

Back
Top Bottom