Giúp mình ghép chuối theo điều kiện!

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Chào các Pro! xin giúp mình với, mình muốn ghép các chuỗi theo điều kiện.
Ví dụ (có đính kèm file) giúp nhé các Pro cần gấp lắm ạ!

Lúc trước tôi có viết bộ hàm: JoinText, JoinUnique và JoinIf
Với yêu cầu này, thích hợp dùng JoinIf như sau:
1> Code VBA:

Function JoinIf(ByVal Delimiter As String, ByVal CriteriaArray, ByVal Criteria, Optional ByVal TargetArray) As String
  Dim aTmpCrit, aTmpDes, tmp1, tmp2, arr(), dic As Object
  Dim bComp As Boolean, Chk As Boolean
  Dim i As Long, j As Long, k As Long, dTmpVal As Double
  Set dic = CreateObject("Scripting.Dictionary")
  If IsMissing(TargetArray) Then TargetArray = CriteriaArray
  aTmpCrit = ConvertTo1DArray(CriteriaArray)
  aTmpDes = ConvertTo1DArray(TargetArray)
  If (Not IsArray(aTmpCrit)) Or (Not IsArray(aTmpDes)) Then Exit Function
  On Error Resume Next
  bComp = (InStr("<>=", Left(Criteria, 1)) > 0)
  For i = LBound(aTmpDes) To UBound(aTmpDes)
    tmp1 = aTmpCrit(i): tmp2 = aTmpDes(i)
    If TypeName(tmp1) <> "Error" Then
      If TypeName(tmp2) <> "Error" Then
        If bComp And Len(Criteria) Then
          dTmpVal = CDbl(aTmpCrit(i))
          If Evaluate(dTmpVal & Criteria) Then dic.Add tmp2, ""
        Else
          If (Left(Criteria, 1) = "!") Then
            If Not (UCase(tmp1) Like UCase(Mid(Criteria, 2, Len(Criteria)))) Then dic.Add tmp2, ""
          Else
            If (UCase(tmp1) Like UCase(Criteria)) Then dic.Add tmp2, ""
          End If
        End If
      End If
    End If
  Next
  If dic.Count Then
    arr = dic.Keys
    JoinIf = Join(arr, Delimiter)
  End If
End Function
Private Function ConvertTo1DArray(ByVal SourceArray)
  Dim aTmp, Item, arr()
  Dim n As Long
  On Error Resume Next
  aTmp = SourceArray
  If Not IsArray(aTmp) Then aTmp = Array(aTmp)
  For Each Item In aTmp
    n = n + 1
    ReDim Preserve arr(1 To n)
    arr(n) = Item
  Next
  ConvertTo1DArray = arr
End Function

2> Áp dụng trên bảng tính:
Công thức tại F4:

=JoinIf([COLOR=#ff0000]""[/COLOR],$B$4:$B$12,B4,$D$4:$D$12)

kéo fill xuống. Xong!
Lưu ý: cái dấu "" màu đỏ trong công thức chính là dấu phân cách. Nếu bạn muốn phần từ này cách phần tử kia bằng dấu phân cách nào đó, hãy thay đổi cho phù hợp. Chẳng hạn muốn dấu phân cách là dấu "-" ta sửa công thức thành:

=JoinIf([COLOR=#ff0000]"-"[/COLOR],$B$4:$B$12,B4,$D$4:$D$12)

——————–
Nói thêm: Cách sử dụng hàm JoinIf gần giống như SUMIF

www.giaiphapexcel.com/diendan/threads/gi%C3%BAp-m%C3%ACnh-gh%C3%A9p-chu%E1%BB%91i-theo-%C4%91i%E1%BB%81u-ki%E1%BB%87n.108084/

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 5 ▥ 0
Quảng cáo

Bạn nên đọc

5 Responses

  1. hands says:

    Dùng cột phụ, bạn xem file đính kèm

  2. hands says:

    Bài toán này mình viết bằng 1 đoạn Sub, bạn xóa thử cột F đi rồi bấm chạy Code để chạy thử xem có OK không nghen

  3. hands says:

    Mình gặp một vấn đề nữa là kết quả ghép đôi theo điều kiện bị trùng. Ví dụ: con đường A có bốn đoạn theo kết cấu là: đoạn 1 bê tông; đoạn 2 đất; đoạn 3 bê tông; đoạn 4 đất. Vậy khi mình ghép chuỗi theo con đường A thì kết quả là: bê tôngđấtbê tôngđât. Các pro giúp mình rút gọn cụm kết cấu trên thành "bê tôngđất". Cám ơn!

    CT của bạn chuẩn rồi ạ, tuy nhiên ở cột phụ có thể rút ngắn thành thế này cũng được : D4 =IF(B4<>B3,C4,D3&C4)

    Trước có làm một bài tương tự nhưng dữ liệu tại cột "STT" không liên tục nên áp dụng công thức trên. Giờ bổn cũ soạn lại không nhìn thấy rõ là số liệu liên tục.
    Thank!

    CT của bạn rất hay và sáng tạo, mình gọi là chỉ đi học hỏi lại và chế biến lại đôi chút cho ngắn gọn thôi chứ nói về ý tưởng thì nó hoàn

    toàn là của bạn :-=

  4. hands says:

    Xin giúp rút gọn kết quả trùng lặp ạ (file đính kèm)

    Bạn xem thử File xem được chưa

    Dạo này trình VBA lên rồi đấy,hii.
    Bạn có thể thay dòng:
    gop = gop & Cells(j, 4)

    Bằng dòng:
    gop = gop & " " & Cells(j, 4)

    ?

    Hi hi ! Em vẫn còn kém lắm, mới gọi là chỉ biết một vài cái sơ đẳng nhất của VBA thôi, vần còn phải rèn luyện cũng như học hỏi nhiều

    từ các thành viên khác của GPE ạ

  5. hands says:

    Thêm một cách dùng công thức

    sumproduct(max(($b$4:$b$14=b4)*row($b$4:$b$14))) bác ơi giải thích dùm ạ!

    Đại khái là
    ($b$4:$b$14=b4) sẽ tạo 1 mảng mới, cái nào =b4 thì trong mảng mới =1 và ngược lại
    row($b$4:$b$14) là mảng chỉ số dòng tương ứng

    ($b$4:$b$14=b4)*row($b$4:$b$14) là tích các phần tử tương ứng của 2 mảng với nhau. Hàm max lấy giá trị của mảng tích này

    Bạn có thể sửa dấu * thành dấu "," sau đó nhấn shift+F3—>Nhấn chuột vào hàm MAX trên thanh formula để xem

    Làm xong mới thấy bài 15 đã giải thích rồi, có lẽ để lại để chủ thớt đọc chơi vậy!

    Có thể thay bằng thế này cho dễ hiểu :

    Max(IF($b$4:$b$14=b4,row($b$4:$b$14)))

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm