Sắp xếp lấy TOP 4 theo nhiều điều kiện

Liên hệ QC
Đó là nó xếp không đúng với cột tiêu đề thôi. (do số cột lớn nhất là 8 mà số ô có màu trong các dòng lớn nhất là 5. Do vậy Cột lớn nhất - (số ô có màu liên tiếp là 5 +1 Ô không có màu cuối cùng=8) =2 .do vậy khi dán kết quả xuống sheet nó bị chệch 2 cột.
Nghĩ mãi mà không biết làm cách nào.

Có chơi kiểu xếp là Không có màu , 1 lần , 2 ,3,4,5,6....lần không?Số lần ô tô màu trong dòng có thể không hạn chế (10,100, hoặc một số n lần nào đó) ...Nếu xếp theo kiểu như tôi trình bày thì code dễ hơn, chính xác hơn. Bạn thêm dữ liệu, chạy code và kiểm tra lại kết quả Ở I2:...
Nếu trong dải ô ấy có n ô được tô màu và có 1 hoặc 2 ô không được tô màu xen kẽ các ô tô màu thì lấy kết quả thế nào, tính liên tiếp là mấy hay vẫn tính là n lần?
Cám ơn anh rất nhiều. Ý Anh hỏi tính theo số ô không được tô màu em cũng muốn tính xem số ô không được tô màu từ 1 đến n lần như ô được tô màu ak. Phiền Anh có thể code thêm phần những ô không được tô màu từ 1 đến n lần. Ta tính thêm cho trường hợp ngược lại với bài toán tính ô có màu Anh ak!
 
Cám ơn anh rất nhiều. Ý Anh hỏi tính theo số ô không được tô màu em cũng muốn tính xem số ô không được tô màu từ 1 đến n lần như ô được tô màu ak. Phiền Anh có thể code thêm phần những ô không được tô màu từ 1 đến n lần. Ta tính thêm cho trường hợp ngược lại với bài toán tính ô có màu Anh ak!
Em đã chạy code và rất ngưỡng mộ Bác. ở đây code chạy rất ok. Nhưng với trường hợp ở những ô không có màu thì em thấy Anh viết code tính cộng cả các hàng bên trên không có màu. Mong muốn của em là mong Anh sửa giúp em với các ô không có màu từ 1 đến N cũng giống như với ô đã được tô màu ak!( Tính thêm với các ô không được bôi màu tương tự như với ô đã được bôi màu đó anh). Em đã ghi chú trong file đính kèm ak!
Kính mong Anh chiếu cố giúp cho.
Trân trọng/
 

File đính kèm

Em đã chạy code và rất ngưỡng mộ Bác. ở đây code chạy rất ok. Nhưng với trường hợp ở những ô không có màu thì em thấy Anh viết code tính cộng cả các hàng bên trên không có màu. Mong muốn của em là mong Anh sửa giúp em với các ô không có màu từ 1 đến N cũng giống như với ô đã được tô màu ak!( Tính thêm với các ô không được bôi màu tương tự như với ô đã được bôi màu đó anh). Em đã ghi chú trong file đính kèm ak!
Kính mong Anh chiếu cố giúp cho.
Trân trọng/
Thành thật xin lỗi Anh! đọc nội dung Anh viết em mừng quá. file vừa rồi e gửi thiếu nội dung nên lần này em chỉnh sửa lại theo câu hỏi của Anh đã ghi trong file. Quả thật Bác thiệt tài đọc luôn được ý trong đầu em vậy. Em xin gửi lại file Anh chiếu cố giúp cho.
Cám ơn Anh đã quan tâm!
Trân trọng/
 

File đính kèm

Giải thích lòng vòng thêm rối, dựa vào dữ liệu và kết quả trong file
Mã:
Sub ABC()
  Dim a$(), b$(1 To 1, 1 To 6), rng As Range, sRow&, i&, j&, C&
  Set rng = Sheet1.Range("A4:I" & Sheet1.Range("A" & Rows.Count).End(xlUp).Row)
  sRow = rng.Rows.Count
  ReDim a(1 To sRow, 1 To 6)
  For i = 1 To sRow
    C = 6
    For j = 1 To 8
      If rng(i, j).Interior.Color = vbYellow Then C = C - 1
      If rng(i, j + 1) = Empty Then
        a(i, C) = rng(i, j)
        If InStr(1, b(1, C), a(i, C)) = 0 Then
          If Len(b(1, C)) Then b(1, C) = b(1, C) & "," & a(i, C) Else b(1, C) = a(i, C)
        End If
        Exit For
      End If
    Next j
  Next i
  Range("I2:T10000").Clear
  Sheet1.Range("I4").Resize(sRow, 6) = a
  Sheet1.Range("P2").Resize(, 5) = b
End Sub
Dữ liệu khác có thể

Đó là nó xếp không đúng với cột tiêu đề thôi. (do số cột lớn nhất là 8 mà số ô có màu trong các dòng lớn nhất là 5. Do vậy Cột lớn nhất - (số ô có màu liên tiếp là 5 +1 Ô không có màu cuối cùng=8) =2 .do vậy khi dán kết quả xuống sheet nó bị chệch 2 cột.
Nghĩ mãi mà không biết làm cách nào.

Có chơi kiểu xếp là Không có màu , 1 lần , 2 ,3,4,5,6....lần không?Số lần ô tô màu trong dòng có thể không hạn chế (10,100, hoặc một số n lần nào đó) ...Nếu xếp theo kiểu như tôi trình bày thì code dễ hơn, chính xác hơn. Bạn thêm dữ liệu, chạy code và kiểm tra lại kết quả Ở I2:...
Nếu trong dải ô ấy có n ô được tô màu và có 1 hoặc 2 ô không được tô màu xen kẽ các ô tô màu thì lấy kết quả thế nào, tính liên tiếp là mấy hay vẫn tính là n lần?
Em có thêm một vấn đề nữa mong Bác giúp ak!
Tình hình là em có chuỗi muốn lọc và loại kí tự lặp nhiều lần chỉ giữ lại lần lặp đầu sau đó đếm số lần kí tự có trong chuỗi liệt kê sang cột riêng. Vấn đề nữa là cộng tịnh tiến theo hàng các số tự nhiên theo qui luật một hàng cho trước. Nội dung em ghi trong file đính kèm.
Kính mong Anh bớt chút thời gian giúp cho!
Trân trọng/
 

File đính kèm

Em có thêm một vấn đề nữa mong Bác giúp ak!
Tình hình là em có chuỗi muốn lọc và loại kí tự lặp nhiều lần chỉ giữ lại lần lặp đầu sau đó đếm số lần kí tự có trong chuỗi liệt kê sang cột riêng. Vấn đề nữa là cộng tịnh tiến theo hàng các số tự nhiên theo qui luật một hàng cho trước. Nội dung em ghi trong file đính kèm.
Kính mong Anh bớt chút thời gian giúp cho!
Trân trọng/
cái này là bài mới rồi mà. bạn nên lập chủ đề mới
 
Thành thật xin lỗi Anh! đọc nội dung Anh viết em mừng quá. file vừa rồi e gửi thiếu nội dung nên lần này em chỉnh sửa lại theo câu hỏi của Anh đã ghi trong file. Quả thật Bác thiệt tài đọc luôn được ý trong đầu em vậy. Em xin gửi lại file Anh chiếu cố giúp cho.
Cám ơn Anh đã quan tâm!
Trân trọng/
Thế này chăng?
Xem file
 

File đính kèm

Em có thêm một vấn đề nữa mong Bác giúp ak!
Tình hình là em có chuỗi muốn lọc và loại kí tự lặp nhiều lần chỉ giữ lại lần lặp đầu sau đó đếm số lần kí tự có trong chuỗi liệt kê sang cột riêng. Vấn đề nữa là cộng tịnh tiến theo hàng các số tự nhiên theo qui luật một hàng cho trước. Nội dung em ghi trong file đính kèm.
Kính mong Anh bớt chút thời gian giúp cho!
Trân trọng/
Chạy 2 code . . .
Mã:
Option Explicit
Sub Dem()
  Dim arr(), S, res(), str$, tmp$, t$, a$, d$
  Dim sR&, i&, k&, j&, N&, fC&, c&
  Const deli$ = ",.;:-"
  With Sheet1
    arr = .Range("A2", .Range("A2").End(xlDown)).Value
  End With
  sR = UBound(arr)
  ReDim res(1 To sR, 1 To 3)
  For i = 1 To sR
    str = Replace(arr(i, 1), " ", "") & ","
    N = Len(str)
    fC = 1
    k = 0
    tmp = "|"
    a = Empty: d = Empty
    For j = 1 To N
      c = InStr(1, deli, Mid(str, j, 1))
      If c > 0 Then
        t = Mid(str, fC, j - fC)
        If InStr(1, tmp, "|" & t & "|") = 0 Then
          k = k + 1
          tmp = tmp & t & "|"
          a = a & d & t
          d = Mid(deli, c, 1)
        End If
        fC = j + 1
      End If
    Next j
    If a = Empty Then res(i, 1) = str Else res(i, 1) = a
    res(i, 2) = k
  Next i
  Sheet1.Range("B2").Resize(sR).NumberFormat = "@"
  Sheet1.Range("B2").Resize(sR, 2) = res
End Sub

Sub Them()
  Dim arr(), res(), sR&, sC&, i&, j&

  arr = Sheet1.Range("E2:N2").Resize(10).Value
  sR = UBound(arr, 1): sC = UBound(arr, 2)
  For j = 1 To sC
    For i = 2 To sR
      If arr(i - 1, j) = 9 Then arr(i, j) = 0 Else arr(i, j) = arr(i - 1, j) + 1
    Next i
  Next j
  Sheet1.Range("E2:N2").Resize(10).Value = arr
End Sub
 

File đính kèm

Chạy 2 code . . .
Mã:
Option Explicit
Sub Dem()
  Dim arr(), S, res(), str$, tmp$, t$, a$, d$
  Dim sR&, i&, k&, j&, N&, fC&, c&
  Const deli$ = ",.;:-"
  With Sheet1
    arr = .Range("A2", .Range("A2").End(xlDown)).Value
  End With
  sR = UBound(arr)
  ReDim res(1 To sR, 1 To 3)
  For i = 1 To sR
    str = Replace(arr(i, 1), " ", "") & ","
    N = Len(str)
    fC = 1
    k = 0
    tmp = "|"
    a = Empty: d = Empty
    For j = 1 To N
      c = InStr(1, deli, Mid(str, j, 1))
      If c > 0 Then
        t = Mid(str, fC, j - fC)
        If InStr(1, tmp, "|" & t & "|") = 0 Then
          k = k + 1
          tmp = tmp & t & "|"
          a = a & d & t
          d = Mid(deli, c, 1)
        End If
        fC = j + 1
      End If
    Next j
    If a = Empty Then res(i, 1) = str Else res(i, 1) = a
    res(i, 2) = k
  Next i
  Sheet1.Range("B2").Resize(sR).NumberFormat = "@"
  Sheet1.Range("B2").Resize(sR, 2) = res
End Sub

Sub Them()
  Dim arr(), res(), sR&, sC&, i&, j&

  arr = Sheet1.Range("E2:N2").Resize(10).Value
  sR = UBound(arr, 1): sC = UBound(arr, 2)
  For j = 1 To sC
    For i = 2 To sR
      If arr(i - 1, j) = 9 Then arr(i, j) = 0 Else arr(i, j) = arr(i - 1, j) + 1
    Next i
  Next j
  Sheet1.Range("E2:N2").Resize(10).Value = arr
End Sub
Thực lòng xin cảm ơn Thầy nhiều ak!, Em Kính chúc Thầy luôn mạnh khoẻ và thành công.
Trân trọng/
Bài đã được tự động gộp:

Cái sub dem đúng là tuyệt. Cám ơn thầy
Thầy xử lí luôn được cả các kí tự :," ;, ." vv...và vv. Thầy đúng là quá giỏi.!
Bài đã được tự động gộp:

Cám ơn Anh đã hướng dẫn ak!
 
Lần chỉnh sửa cuối:
Cám ơn Anh ak! Code của Anh quá tuyệt vời, cuối cùng vượt ngoài mong đợi của em. Thành thật xin lỗi vì phiền anh nhiều vì văn phạm lủng củng không nói nên được nội dụng làm anh mất thời gian viết đi viết lại. Một lần nữa gửi lời chúc đến Anh và gia đình có ngày 8.3 vui vẻ và hạnh phúc!
Trân trọng/
 
Cám ơn Anh nhiều nhiều! Tuy nhiên khi chạy code chưa đúng với nội dung mong muốn và định dạng là text chứ không phải là number vì vậy mong Anh chỉnh giúp. Nội dung mong muốn sửa em ghi trong file ak!
 

File đính kèm

Chạy 2 code . . .
Mã:
Option Explicit
Sub Dem()
  Dim arr(), S, res(), str$, tmp$, t$, a$, d$
  Dim sR&, i&, k&, j&, N&, fC&, c&
  Const deli$ = ",.;:-"
  With Sheet1
    arr = .Range("A2", .Range("A2").End(xlDown)).Value
  End With
  sR = UBound(arr)
  ReDim res(1 To sR, 1 To 3)
  For i = 1 To sR
    str = Replace(arr(i, 1), " ", "") & ","
    N = Len(str)
    fC = 1
    k = 0
    tmp = "|"
    a = Empty: d = Empty
    For j = 1 To N
      c = InStr(1, deli, Mid(str, j, 1))
      If c > 0 Then
        t = Mid(str, fC, j - fC)
        If InStr(1, tmp, "|" & t & "|") = 0 Then
          k = k + 1
          tmp = tmp & t & "|"
          a = a & d & t
          d = Mid(deli, c, 1)
        End If
        fC = j + 1
      End If
    Next j
    If a = Empty Then res(i, 1) = str Else res(i, 1) = a
    res(i, 2) = k
  Next i
  Sheet1.Range("B2").Resize(sR).NumberFormat = "@"
  Sheet1.Range("B2").Resize(sR, 2) = res
End Sub

Sub Them()
  Dim arr(), res(), sR&, sC&, i&, j&

  arr = Sheet1.Range("E2:N2").Resize(10).Value
  sR = UBound(arr, 1): sC = UBound(arr, 2)
  For j = 1 To sC
    For i = 2 To sR
      If arr(i - 1, j) = 9 Then arr(i, j) = 0 Else arr(i, j) = arr(i - 1, j) + 1
    Next i
  Next j
  Sheet1.Range("E2:N2").Resize(10).Value = arr
End Sub
Thầy ơi cứu em!
Code lần trước Thầy viết giúp em nhưng khi em chạy nảy sinh một số vấn đề ak. Cụ thể trong code Thầy viết đem cộng liệt kê toàn bộ hàng có bôi màu và không loại đi ô bị ngắt quãng trong hàng. Mong muốn cụ thể nhờ Thầy chỉnh lại em viết trong file đính kèm.
Mong Thầy giúp em!
Trân trong/
 

File đính kèm

Thầy ơi cứu em!
Code lần trước Thầy viết giúp em nhưng khi em chạy nảy sinh một số vấn đề ak. Cụ thể trong code Thầy viết đem cộng liệt kê toàn bộ hàng có bôi màu và không loại đi ô bị ngắt quãng trong hàng. Mong muốn cụ thể nhờ Thầy chỉnh lại em viết trong file đính kèm.
Mong Thầy giúp em!
Trân trong/
Dữ liệu khác code phải khác nhiều. Gởi file với cấu trúc dữ liệu thật, dữ liệu có thể thay thế bằng dữ liệu giả định nếu muốn bảo mật, để viết code 1 lần cuối
 
Cám ơn Anh nhiều nhiều! Tuy nhiên khi chạy code chưa đúng với nội dung mong muốn và định dạng là text chứ không phải là number vì vậy mong Anh chỉnh giúp. Nội dung mong muốn sửa em ghi trong file ak!
Bạn trình bày trong file thực tình tôi không hiểu gì cả.
Bạn viết ".....Ví dụ ô D2 số (05) vẫn liệt kê là 3 màu liên tục. ở đây phép so sánh em cần là tính từ ô được có màu liên tục nhiều nhất tính lùi lại. ví dụ ở cột E4 thì phép so sánh được tính đúng là 1 mới là đúng. vì ô f4 (09) tính lùi về bên trái có màu là số (07) và nó bị ngắt quãng là ô d4(05) không tô màu nên là nếu liệt kê đúng phải là 1 màu liên tục ...."
Trong khi trong comment bạn viết : "...vị trí ô này ko có màu thì chỉ liệt kê 3 màu liên tục ak! Só 05 sẽ được tính là 3 màu liên tục. Tham chiếu cột ứng với nó để tính với ô không có màu đối với trường hợp tính ô không có màu.". Vậy thì là điếm số ô có màu liên tục hay là gì? và nếu đúng thế ghi kết quả đếm hay ghi dữ liệu nào vào ô tương ứng.
Và bạn viết ".... Lưu ý không tính nếu như hàng đó bị ngắt quãng hay đúng hơn là phép tính liên tục chỉ tham chiếu từ bên phải qua trái từ cột f4 đến a4 ví dụ nếu gặp e4 có màu rồi d4 không có màu thì tính là 1 màu liên tục. tương tự như hàng F7 tính liên tục nếu đúng thì là 3 màu liên tục mới đúng ý bởi hàng đó bị ngắt quãng bởi ô b7(02)....." Nghĩa là chỉ lấy một giá trị (số đếm được hay dữ liệu 1 ô ), còn không quan tâm đến các số điếm được các ô có màu sau đó của hàng đó (trương trường hợp số ô có màu và không màu xen kẽ không có quy luật)
Ở bài #23 bạn đửa ra đề bài là " .....mong muốn của e là viết code lấy 01 con số nằm ở ô cuối cùng của hàng đã được tô màu và tách sang cột riêng biệt".
Cứ như thế này thì có lẽ bạn phải chờ lâu lâu mới có đáp án.
Tôi đã phải là đoán mò: Thế này chăng? ở bài#48 khi gửi trả đáp án cho bạn.
Thay vì giải thích, bạn cứ gửi file có mô tả cách lấy dữ liệu và điền kết quả mong muốn (chỉ cần 1 số dòng ). Chứ cứ để tình trạng mỗi người mỗi hướng này thì bao giờ mới được. Tôi đã nói rồi: "Tôi Không phải là người tinh anh như người ta" rồi mà.
 
Bạn trình bày trong file thực tình tôi không hiểu gì cả.
Bạn viết ".....Ví dụ ô D2 số (05) vẫn liệt kê là 3 màu liên tục. ở đây phép so sánh em cần là tính từ ô được có màu liên tục nhiều nhất tính lùi lại. ví dụ ở cột E4 thì phép so sánh được tính đúng là 1 mới là đúng. vì ô f4 (09) tính lùi về bên trái có màu là số (07) và nó bị ngắt quãng là ô d4(05) không tô màu nên là nếu liệt kê đúng phải là 1 màu liên tục ...."
Trong khi trong comment bạn viết : "...vị trí ô này ko có màu thì chỉ liệt kê 3 màu liên tục ak! Só 05 sẽ được tính là 3 màu liên tục. Tham chiếu cột ứng với nó để tính với ô không có màu đối với trường hợp tính ô không có màu.". Vậy thì là điếm số ô có màu liên tục hay là gì? và nếu đúng thế ghi kết quả đếm hay ghi dữ liệu nào vào ô tương ứng.
Và bạn viết ".... Lưu ý không tính nếu như hàng đó bị ngắt quãng hay đúng hơn là phép tính liên tục chỉ tham chiếu từ bên phải qua trái từ cột f4 đến a4 ví dụ nếu gặp e4 có màu rồi d4 không có màu thì tính là 1 màu liên tục. tương tự như hàng F7 tính liên tục nếu đúng thì là 3 màu liên tục mới đúng ý bởi hàng đó bị ngắt quãng bởi ô b7(02)....." Nghĩa là chỉ lấy một giá trị (số đếm được hay dữ liệu 1 ô ), còn không quan tâm đến các số điếm được các ô có màu sau đó của hàng đó (trương trường hợp số ô có màu và không màu xen kẽ không có quy luật)
Ở bài #23 bạn đửa ra đề bài là " .....mong muốn của e là viết code lấy 01 con số nằm ở ô cuối cùng của hàng đã được tô màu và tách sang cột riêng biệt".
Cứ như thế này thì có lẽ bạn phải chờ lâu lâu mới có đáp án.
Tôi đã phải là đoán mò: Thế này chăng? ở bài#48 khi gửi trả đáp án cho bạn.
Thay vì giải thích, bạn cứ gửi file có mô tả cách lấy dữ liệu và điền kết quả mong muốn (chỉ cần 1 số dòng ). Chứ cứ để tình trạng mỗi người mỗi hướng này thì bao giờ mới được. Tôi đã nói rồi: "Tôi Không phải là người tinh anh như người ta" rồi mà.
Dạ! Thật lòng không biết nói gì ngoài lời cảm kích ngưỡng mộ Anh, em xin gửi lại file với nội dung mong muốn. Anh bớt chút thời gian xem qua và code giúp.
Trân trọng/
 

File đính kèm

Úi chà. Hóa ra là nghề chọn những con số thần kỳ.

Thấy bạn này tâm sự công việc không dùng tới Excel nhưng lại đam mê viết code. Giờ thì đã hiểu động lực đam mê là gì.

View attachment 272911
Dạ cái này nó ứng dụng nhiều đó anh, file giả lập về màu kiểu liệt kê màu những hàng có ô liên tục bôi màu kiểu đánh dấu ak.
 
Web KT

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

Back
Top Bottom