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

Liên hệ QC

nguyendinhvinh0410

Thành viên mới
Tham gia
8/5/13
Bài viết
25
Được thích
0
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 ạ!
 

File đính kèm

  • GHÉP CHUỖI THEO ĐIỀU KIỆN.xlsx
    9 KB · Đọc: 16
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 ạ!

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
 

File đính kèm

  • GHÉP CHUỖI THEO ĐIỀU KIỆN.xls
    30.5 KB · Đọc: 13
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!
 
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!

Bạn trình bày yêu cầu mình muốn vào trong File rồi gửi lên đi bạn, thế cho mọi người dễ hiểu
 
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!
 
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 :-=
 
Xin giúp rút gọn kết quả trùng lặp ạ (file đính kèm)
 

File đính kèm

  • GHÉP CHUỖI THEO ĐIỀU KIỆN_RUTGON.xlsx
    9 KB · Đọc: 10
Dạo này trình VBA lên rồi đấy,hii.
Bạn có thể thay dòng:
PHP:
gop = gop & Cells(j, 4)

Bằng dòng:
PHP:
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 ạ
 
sumproduct(max(($b$4:$b$14=b4)*row($b$4:$b$14))) bác ơi giải thích dùm ạ!

lần lượt xét từ ô B4 đến ô B14, nếu ô nào = với ô B4 thì trả về row tức là dòng của ô đó. Vì có nhiều ô cùng bằng ô B4 nên kq trả về sẽ có

nhiều row, trong số các row trả về ta lấy row có giá trị lớn nhất
 
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!
 
Xin giúp rút gọn kết quả trùng lặp ạ (file đính kè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:
Mã:
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:
Mã:
=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:
Mã:
=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
 
Mong các bác giải thích giúp đoạn hàm này ạ, mặc dù có nghiên cứu nghiêm túc nhưng không hiểu được ạ.
F4=indirect("e"&sumproduct(max(($b$4:$b$12=b4)*row($b$4:$b$12))))
 

File đính kèm

  • GHÉP CHUỖI THEO ĐIỀU KIỆN_RUTGON.xlsx
    9.9 KB · Đọc: 7
Mong các bác giải thích giúp đoạn hàm này ạ, mặc dù có nghiên cứu nghiêm túc nhưng không hiểu được ạ.
F4=indirect("e"&sumproduct(max(($b$4:$b$12=b4)*row($b$4:$b$12))))

hàm Indirect sẽ tham chiếu đến ô ô nào đó của cột E mà ta cần tìm, tức là E? ta cần xác định cái ? , cái ? ở đây chính là đoạn từ sumproduc.... cái này đã đã giải thích bên trên rồi nhé
 
Web KT
Back
Top Bottom