Lấy dữ liệu duy nhất từ 1 chuổi

Liên hệ QC

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,282
Được thích
15,783
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Chào các anh chị GPE thân mến.

Em lại có 1 câu hỏi nữa mong các anh chị giúp giùm:
Mình làm thế nào để lấy dữ liệu duy nhất từ 1 chuổi bằng hàm theo dạng sau không

VD: L8& & L8& & L1& & L5& & L5& & L5& & L4& & L4& & L6& & L5& & L4& & L4& & L2& & L2& & L2& & L6& & L6& & L6& & L1& & L7&
==> L1, L2, L4, L5, L6, L7, L8

Em xin cám ơn trước.
 
Chào các anh chị GPE thân mến.

Em lại có 1 câu hỏi nữa mong các anh chị giúp giùm:
Mình làm thế nào để lấy dữ liệu duy nhất từ 1 chuổi bằng hàm theo dạng sau không

VD: L8& & L8& & L1& & L5& & L5& & L5& & L4& & L4& & L6& & L5& & L4& & L4& & L2& & L2& & L2& & L6& & L6& & L6& & L1& & L7&
==> L1, L2, L4, L5, L6, L7, L8

Em xin cám ơn trước.
Thử UDF này xem:
PHP:
Function StrUnique(Chuoi As String) As String
  Dim i As Long, Temp
  Chuoi = WorksheetFunction.Trim(Replace(Chuoi, "&", " "))
  Temp = Split(Chuoi, " ")
  StrUnique = Temp(0)
  For i = 0 To UBound(Temp)
    If InStr(StrUnique, Temp(i)) = 0 Then
      StrUnique = StrUnique & ", " & Temp(i)
    End If
  Next i
End Function
Nếu có thay đổi khác hãy chỉnh sửa lại
Như kết quả của bạn đưa lên thì có vẽ là nó đã được Sort, nếu đúng thế thì phải thêm 1 UDF khác nữa đấy ---> Nếu đồng ý ta nghiên cứu tiếp
 

File đính kèm

  • SrtUnique.xls
    18 KB · Đọc: 79
Wow cực nhanh, cực kỳ chính xác, đúng là bậc thầy. Nếu như kết quả sort thì mình phải làm sao hả thầy.
 
Wow cực nhanh, cực kỳ chính xác, đúng là bậc thầy. Nếu như kết quả sort thì mình phải làm sao hả thầy.
Chờ 1 vài tiếng đồng hồ nữa nhé ---> Đang bận chút (vụ ngày lúc trước đã từng làm rồi)
Nếu bạn cần gấp thì tìm bài viết về Sort Sheet mà áp dụng
Đại khái là:
- Dùng Split chia kết quả ra từng phần tử
- Dùng 2 vòng lập quét qua các phần từ
- So sánh chúng với nhau, nếu cái trước > cái sau thì đổi chổ chúng với nhau
Thuật toán là vậy ---> Phần còn lại do bạn "biến tấu"
 
Chào các anh chị GPE thân mến.

Em lại có 1 câu hỏi nữa mong các anh chị giúp giùm:
Mình làm thế nào để lấy dữ liệu duy nhất từ 1 chuổi bằng hàm theo dạng sau không

VD: L8& & L8& & L1& & L5& & L5& & L5& & L4& & L4& & L6& & L5& & L4& & L4& & L2& & L2& & L2& & L6& & L6& & L6& & L1& & L7&
==> L1, L2, L4, L5, L6, L7, L8

Em xin cám ơn trước.
Tôi Tham gia một giải pháp dùng công thức. Mời bạn tham khảo.
 

File đính kèm

  • GPE.xls
    17.5 KB · Đọc: 81
Tôi Tham gia một giải pháp dùng công thức. Mời bạn tham khảo.
Cũng may trong chuổi có số, nên lấy đó làm chuẩn mà so sánh... Nếu nó không thuộc dạng L1, L2... tôi nghĩ công thức sẽ bó tay ---> Bài này dùng VBA viết thành 1 UDF là chuẩn nhất...
Nhân tiện bạn Domfootwear muốn nghiên cứu về sort, tôi làm cho bạn luôn
Lý ra nếu chỉ làm theo đúng yêu cầu ở trên thì code khá gon... Tuy nhiên, lở làm thì làm luôn, khuyến mãi cho bạn thêm 1 tùy chọn cho phép sort tăng hoặc giảm dần
1> Code lọc chuổi duy nhất (có sửa đổi bổ sung)
PHP:
Function StrUnique(Text As String, Optional Sep As String = ",") As String
  Dim i As Long, Temp
  Temp = Split(WorksheetFunction.Trim(Replace(Text, Sep, " ")), " ")
  StrUnique = Temp(0)
  For i = 0 To UBound(Temp)
    If InStr(StrUnique, Temp(i)) = 0 Then
      StrUnique = StrUnique & ", " & Temp(i)
    End If
  Next i
End Function
2> Code sort chuổi
PHP:
Function StrSort(Text As String, Optional Sep As String = ",", Optional Order As String = "Asc") As String
  Dim Temp, Item, i As Long, j As Long
  Item = Split(WorksheetFunction.Trim(Replace(Text, Sep, " ")), " ")
  For i = 0 To UBound(Item) - 1
    For j = i + 1 To UBound(Item)
      Select Case Order
        Case Is = "Asc"
          If Item(i) > Item(j) Then
            Temp = Item(i): Item(i) = Item(j): Item(j) = Temp
          End If
        Case Is = "Des"
          If Item(j) > Item(i) Then
            Temp = Item(i): Item(i) = Item(j): Item(j) = Temp
          End If
        End Select
    Next j
  Next i
  StrSort = Join(Item, ", ")
End Function
Vậy với yêu cầu của bạn, ta có công thức sau:
Lọc và sắp xếp tăng dần
PHP:
=StrSort(StrUnique($A$1,"&"),",","Asc")
hoăc rút gọn
PHP:
=StrSort(StrUnique($A$1,"&"))
Lọc và sắp xếp giảm dần
PHP:
=StrSort(StrUnique($A$1,"&"),",","Des")
hoặc rút gọn:
PHP:
=StrSort(StrUnique($A$1,"&"),,"Des")
 

File đính kèm

  • String_Unique_n_Sort.xls
    24.5 KB · Đọc: 62

File đính kèm

  • GPE(1).xls
    24 KB · Đọc: 39
To bạn HuuThang_bd: Rất cám ơn bạn, hàm của bạn rất sáng tạo, bài toán của mình là lấy dữ liệu duy nhất trong chuổi và ghép lại thành 1 chuổi. Tuy nhiên cái này cũng là 1 chiêu đáng cho mình học tập.
To thầy Ndu96081631: Em rất cám ơn thầy đã bỏ thời gian nghiên cứu giúp em, rất kung fu, rất chi tiết, ngắn gọn và cực kỳ chính xác. Yêu cầu của em đã được thầy giải quyết 100%.
 
To bạn HuuThang_bd: Rất cám ơn bạn, hàm của bạn rất sáng tạo, bài toán của mình là lấy dữ liệu duy nhất trong chuổi và ghép lại thành 1 chuổi. Tuy nhiên cái này cũng là 1 chiêu đáng cho mình học tập.
To thầy Ndu96081631: Em rất cám ơn thầy đã bỏ thời gian nghiên cứu giúp em, rất kung fu, rất chi tiết, ngắn gọn và cực kỳ chính xác. Yêu cầu của em đã được thầy giải quyết 100%.
Tiếc là trong các hàm của Excel không có hàm nào nối các thành phần của mảng thành một chuỗi :-=
 
Không hẳn là như thế. Chỉ có điều không sort được thôi.
Mời Bạn tham khảo.
Thì cái tôi đang nói chính là SORT đây!
Tiếc là trong các hàm của Excel không có hàm nào nối các thành phần của mảng thành một chuỗi :-=
Cái này khỏi cần phải nghiên cứu... vì thực chất là... KHÔNG CÓ...
Tôi đã từng nghiên cứu bài toán này từ rất lâu, đã tham khảo hầu hết các trang web nước ngoài... Nói chung ngoại trừ VBA ra thì công thức không có khả năng nối các phần tử trong mãng thành 1 chuổi
 
Trong quá trình sử dụng em thấy phát sinh vấn đề là nó không cho ra kết quả với chuổi dài như sau:

NM06912(M-L)-SS10-K& NM06912(M-L)-SS10-LG& NM06912(M-L)-SS10-PP& NM06912(XS-S)-SS10-K& NM06912(XS-S)-SS10-LG& NM06912(XS-S)-SS10-PP& NM06925(M-L)-SS10-K& NM06925(M-L)-SS10-LG& NM06925(M-L)-SS10-PP& NM06925(XS-S)-SS10-K& NM06925(XS-S)-SS10-LG& NM06925(XS-S)-SS10-PP& NM06956(M-L)-SS10-K& NM06956(M-L)-SS10-LG& NM06956(M-L)-SS10-PP& NM06956(XS-S)-SS10-K& NM06956(XS-S)-SS10-LG& NM06956(XS-S)-SS10-PP& NM08032-SS10-K& NM08032-SS10-K& NM08032-SS10-LG& NM08032-SS10-LG& NM08032-SS10-PP& NM08032-SS10-PP& NM08033-SS10-K& NM08033-SS10-LG& NM08033-SS10-PP& NM08034-SS10-K& NM08034-SS10-K& NM08034-SS10-LG& NM08034-SS10-LG& NM08034-SS10-PP& NM08034-SS10-PP& NM08035-SS10-K& NM08035-SS10-LG& NM08035-SS10-PP& NM08036-SS10-K& NM08036-SS10-LG& NM08036-SS10-PP& NM09806-SS10-K& NM09806-SS10-LG& NM09806-SS10-PP& NM09807-SS10-K& NM09807-SS10-K& NM09807-SS10-LG& NM09807-SS10-PP& NM09807-SS10-PP& NM09808-SS10-K& NM09808-SS10-LG& NM09808-SS10-PP& NM09809-SS10-K& NM09809-SS10-K& NM09809-SS10-LG& NM09809-SS10-LG& NM09809-SS10-PP& NM09810-SS10-K& NM09810-SS10-K& NM09810-SS10-LG& NM09810-SS10-LG& NM09810-SS10-PP& NM09810-SS10-PP& NM09817-SS10-K& NM09817-SS10-LG& NM09817-SS10-PP& NM09818-SS10-K& NM09818-SS10-LG& NM09818-SS10-PP

Chuổi trên và tương tự như trên nó không lọc ra được mà nó hiển thị ############
Nếu lọc = tay thì có nước chết. Em đuối quá nhờ các anh chị xem và giúp dùm.
 

File đính kèm

  • Test.rar
    12.6 KB · Đọc: 17
Trong quá trình sử dụng em thấy phát sinh vấn đề là nó không cho ra kết quả với chuổi dài như sau:

NM06912(M-L)-SS10-K& NM06912(M-L)-SS10-LG& NM06912(M-L)-SS10-PP& NM06912(XS-S)-SS10-K& NM06912(XS-S)-SS10-LG& NM06912(XS-S)-SS10-PP& NM06925(M-L)-SS10-K& NM06925(M-L)-SS10-LG& NM06925(M-L)-SS10-PP& NM06925(XS-S)-SS10-K& NM06925(XS-S)-SS10-LG& NM06925(XS-S)-SS10-PP& NM06956(M-L)-SS10-K& NM06956(M-L)-SS10-LG& NM06956(M-L)-SS10-PP& NM06956(XS-S)-SS10-K& NM06956(XS-S)-SS10-LG& NM06956(XS-S)-SS10-PP& NM08032-SS10-K& NM08032-SS10-K& NM08032-SS10-LG& NM08032-SS10-LG& NM08032-SS10-PP& NM08032-SS10-PP& NM08033-SS10-K& NM08033-SS10-LG& NM08033-SS10-PP& NM08034-SS10-K& NM08034-SS10-K& NM08034-SS10-LG& NM08034-SS10-LG& NM08034-SS10-PP& NM08034-SS10-PP& NM08035-SS10-K& NM08035-SS10-LG& NM08035-SS10-PP& NM08036-SS10-K& NM08036-SS10-LG& NM08036-SS10-PP& NM09806-SS10-K& NM09806-SS10-LG& NM09806-SS10-PP& NM09807-SS10-K& NM09807-SS10-K& NM09807-SS10-LG& NM09807-SS10-PP& NM09807-SS10-PP& NM09808-SS10-K& NM09808-SS10-LG& NM09808-SS10-PP& NM09809-SS10-K& NM09809-SS10-K& NM09809-SS10-LG& NM09809-SS10-LG& NM09809-SS10-PP& NM09810-SS10-K& NM09810-SS10-K& NM09810-SS10-LG& NM09810-SS10-LG& NM09810-SS10-PP& NM09810-SS10-PP& NM09817-SS10-K& NM09817-SS10-LG& NM09817-SS10-PP& NM09818-SS10-K& NM09818-SS10-LG& NM09818-SS10-PP

Chuổi trên và tương tự như trên nó không lọc ra được mà nó hiển thị ############
Nếu lọc = tay thì có nước chết. Em đuối quá nhờ các anh chị xem và giúp dùm.
Bạn xem lại cái định dạng của các ô đó, thử thay đổi lại thành General xem sao, với lại bạn nên thay Shrink to fit thành Wrap text, để vậy khó nhìn quá.
 
Á ! tìm ra rồi, lý do là cột của nó nhỏ quá không nhìn thấy hết, chuyển sang cột mới thì OK.
 

File đính kèm

  • Test.rar
    13.1 KB · Đọc: 21
Á ! tìm ra rồi, lý do là cột của nó nhỏ quá không nhìn thấy hết, chuyển sang cột mới thì OK.
Trong code có 1 lỗi tiềm ẩn, bạn hãy cẩn thận không có đến lúc bug dữ liệu mở mắt. Hãy thử với chuỗi đầu vào là "L15 L1" xem kết quả cho ra cái gì nhé.
 
Trong code có 1 lỗi tiềm ẩn, bạn hãy cẩn thận không có đến lúc bug dữ liệu mở mắt. Hãy thử với chuỗi đầu vào là "L15 L1" xem kết quả cho ra cái gì nhé.
Chính xác!
Lọc Unique mà dùng Dictionary Object là vô địch
Đại khái thế này:
PHP:
Function StrUnique(Chuoi As String) As String
  Dim i As Long, Temp
  On Error Resume Next
  Chuoi = WorksheetFunction.Trim(Replace(Chuoi, "&", " "))
  Temp = Split(Chuoi, " ")
  With CreateObject("Scripting.Dictionary")
    For i = 0 To UBound(Temp)
      .Add Temp(i), ""
    Next i
    StrUnique = Join(.Keys, ", ")
  End With
End Function
Gữi tặng các bạn 2 hàm: Lọc chuổi duy nhất và Sort chuổi đã được cải tiến mới nhất (dùng Dictionary Object) ---> Có thể kết hợp 2 hàm để làm công việc gì đó tùy thích!
Mời tham khảo file đính kèm
 

File đính kèm

  • StringUnique_And_Sort.xls
    31 KB · Đọc: 58
Lần chỉnh sửa cuối:
Theo tôi thì đầu vào đã có biến Sep để chỉ rõ dấu phân cách là cái gì, thì khi trả về kết quả đầu ra sao không Join bằng Sep mà lại Join bằng 1 cái hằng ", " khô cứng thế nhỉ?
 
Theo tôi thì đầu vào đã có biến Sep để chỉ rõ dấu phân cách là cái gì, thì khi trả về kết quả đầu ra sao không Join bằng Sep mà lại Join bằng 1 cái hằng ", " khô cứng thế nhỉ?
Ah... không phải bạn à!... Đây là yêu cầu của tác giả ---> Dấu phân cách đầu vào có thể là bất cứ ký tự nào nhưng đầu ra luôn là dấu phẩy ---> Đúng ra định thêm 1 biến Sep2 dành cho đầu ra, nhưng thấy không quan trọng lắm (bạn xem file ví dụ thì biết: dấu phân cách đầu vào là dấu & nhưng sau đó kết quả xuất ra người ta bỏ luôn dấu & này)
 
Ah... không phải bạn à!... Đây là yêu cầu của tác giả ---> Dấu phân cách đầu vào có thể là bất cứ ký tự nào nhưng đầu ra luôn là dấu phẩy ---> Đúng ra định thêm 1 biến Sep2 dành cho đầu ra, nhưng thấy không quan trọng lắm (bạn xem file ví dụ thì biết: dấu phân cách đầu vào là dấu & nhưng sau đó kết quả xuất ra người ta bỏ luôn dấu & này)
He he, tại tôi thấy ndu nói là "Gữi tặng các bạn 2 hàm" nên mới góp ý chút, nếu vậy thì ndu nên đề tặng riêng cho tác giả chứ nhỉ -\\/.
 
Web KT
Back
Top Bottom