Lọc dữ liệu

Liên hệ QC
PHP:
Option Explicit
Sub MaxBlanksInRows()
 Dim eCol As Byte, eRw As Long, Jj As Long, maxC As Long, Max_ As Byte, SoOR As Byte
 Dim RgR As Range, Rng As Range, lRng As Range, myRng As Range
 Dim Timer_ As Double, Arr()
 Dim WF As WorksheetFunction:                       Set WF = WorksheetFunction
 
 Sheets("Sheet1").Select:                          Timer_ = Timer
 Set Rng = [B2].CurrentRegion
 eCol = Rng.Columns.Count:                          eRw = Rng.Rows.Count
 For Jj = 4 To eRw
   If Cells(Jj, "B").Value = "" Then
      Set Rng = Cells(Jj, "a")
   Else
      Set Rng = Cells(Jj, "A").End(xlToRight)
   End If
   Set myRng = Range(Cells(Jj, 2), Cells(Jj, eCol))
   maxC = WF.CountA(myRng)
   Do
      Set RgR = Rng.End(xlToRight)
      If RgR.Column > eCol - maxC Then
1         If Not lRng Is Nothing Then
            lRng.Interior.ColorIndex = 42
3            Cells(Jj, eCol + 3).Value = lRng.Cells.Count
         End If
          ReDim Preserve Arr(1 To Jj - 3)
          Arr(Jj - 3) = Max_ - 1
          Max_ = 0
         Set lRng = Nothing
         Exit Do
      End If
5      If Range(Rng, RgR)(1).Column > 2 Then
            SoOR = Range(Rng, RgR).Count - 1
        Else
            SoOR = 1
7        End If
        
      If SoOR > Max_ Then
         Max_ = SoOR
       If Rng(1).Column > 2 Then _
            Set lRng = Rng.Offset(, 1).Resize(, SoOR - 1)   '**'
      End If
      Set Rng = RgR
   Loop
 Next Jj
9 ' [iF4].Resize(Jj - 3) = WF.Transpose(Arr)'
 Set myRng = Nothing: Set WF = Nothing
 Erase Arr
 Cells(1, eCol + 3).Value = Timer - Timer_           '<=|'
End Sub
Mình đã test code của bạn ChanhTQ@ thì có chỗ chưa được chính xác lắm. Mình có gửi kèm theo file test mong bạn ChanhTQ@ và các bạn xem giúp đỡ:
- Dòng 3: kết quả báo số ô trống max trong dòng là 9 (từ AO3:AW3) nhưng mình kiểm tra thì số ô trống max trong dòng là 10 (từ BA3:BJ3).
- Dòng 5: kết quả báo số ô trống max trong dòng là 4 (từ E5:H5); nhưng mình kiểm tra thì số ô trống max trong dòng là 9 (từ O5:W5)
Đó là một vài trường hợp mong các bạn xem hộ giúp ạ! Xin cảm ơn các bạn!
(p/s: Mình rất xin lỗi vì phải đăng kí thêm tên đăng nhập này trên diễn đàn, do tên đăng nhập kia (hcl_pt) mình không thể gửi kèm theo file được! Mong được lượng thứ!)
 

File đính kèm

  • test_MaxBlanksInRows.rar
    17.2 KB · Đọc: 16
Một cách làm hơi đơn giản hơn. Gởi các bạn xem cho vui.
 

File đính kèm

  • test_MaxBlanksInRows.rar
    17.2 KB · Đọc: 11
Một cách làm hơi đơn giản hơn. Gởi các bạn xem cho vui.
Mong bạn kiểm tra giúp. Nếu trường hợp Insert thêm một số cột đầu tiên, thì mình sẽ phải sửa lại code như thế nào bạn? Rất mong sự giúp đỡ của các bạn! Xin cảm ơn!
 

File đính kèm

  • test_MaxBlanksInRows.7z
    17.6 KB · Đọc: 4
Bạn có thể thêm một số cột đầu tiên tùy ý mà không cần phải chỉnh code.
 

File đính kèm

  • test_MaxBlanksInRows.rar
    17.8 KB · Đọc: 4
Bạn có thể thêm một số cột đầu tiên tùy ý mà không cần phải chỉnh code.
Bạn ơi! Trường hợp tìm số ô trống max có trong dòng bị chặn bởi 2 ô có dữ liệu (trường hợp 2 của bạn làm) có chỗ chưa được chính xác lắm! Bạn thử xem giúp mình file test này có phải không nhé! Xin cảm ơn bạn rất nhiều!
 

File đính kèm

  • test_MaxBlanksInRows.7z
    17.9 KB · Đọc: 4
Mình đã chỉnh và kiểm tra. Bạn kiểm tra tiếp nhé.
 

File đính kèm

  • test_MaxBlanksInRows1.rar
    18.1 KB · Đọc: 11
-Vùng dữ liệu của bạn gồm 2 phần: phần đầu tiên và phần tô màu. Vùng đó mở rộng ở phần nào? Hay cả 2? Tốt nhất là bạn gởi file giả lập lên.
 
-Vùng dữ liệu của bạn gồm 2 phần: phần đầu tiên và phần tô màu. Vùng đó mở rộng ở phần nào? Hay cả 2? Tốt nhất là bạn gởi file giả lập lên.
Vâng! Mình xin thử gửi file giả định! Vì dữ liệu chỉ có thể gửi lên nhỏ nên mình lấy dòng cuối và cột cuối cùng! Mong bạn xem giúp!
 

File đính kèm

  • test_MaxBlanksInRows1.7z
    303.5 KB · Đọc: 25
-Vùng dữ liệu càng lớn thì các giá trị cột và dòng rất quan trọng trong việc xây dựng chương trình. Chỉ cần tăng thêm 1 vài nấc, sẽ bị out memory. Trong file, vùng dữ liệu của bạn có số dòng: 51.360 và số cột: 1.954. Một máy tính loại khá ( Core dual 2.33, Ram: 2G) vẫn không đủ khả năng để chạy. Thế nên, trước mắt bạn xem thử có co lại vùng dữ liệu này được không. Giải pháp của mình sẽ là: chia vùng thành từng phần nhỏ và chạy lần lượt cho phù hợp với bộ nhớ của máy. Mong các cao thủ và các thầy cho thêm ý kiến.
 
-Vùng dữ liệu càng lớn thì các giá trị cột và dòng rất quan trọng trong việc xây dựng chương trình. Chỉ cần tăng thêm 1 vài nấc, sẽ bị out memory. Trong file, vùng dữ liệu của bạn có số dòng: 51.360 và số cột: 1.954. Một máy tính loại khá ( Core dual 2.33, Ram: 2G) vẫn không đủ khả năng để chạy. Thế nên, trước mắt bạn xem thử có co lại vùng dữ liệu này được không. Giải pháp của mình sẽ là: chia vùng thành từng phần nhỏ và chạy lần lượt cho phù hợp với bộ nhớ của máy. Mong các cao thủ và các thầy cho thêm ý kiến.
Vâng! Đúng như vậy ạ. Khi số liệu tăng lên thì sẽ bị out memory. Mình cũng đã tính đến phương án chia thành 10 phần nhỏ, mỗi phần khoảng trên 5000 dòng thì sẽ chạy được. Nhưng như vậy thì đúng là khó khăn. Mong bạn có thể xem có phương án hay không? Rất chân thành xin cảm ơn bạn! Cảm ơn GPE! or ,
 
-Cách dùng mảng để xử lý vấn đề tốc độ của excel quả thật là rất hiệu quả. Tuy nhiên, kích cỡ của mảng lại giới hạn bởi cấu hình của máy. Đối với vùng dữ liệu phải dùng mảng với số lượng phần tử quá lớn như trên, mình phải giải quyết bằng cách:
+ Bỏ tô màu.
+Chia vùng dữ liệu thành 100 phần và chạy lần lượt. ( chia nhiều phần để phòng số dòng có thể tăng thêm)
-Bạn tải file về, cho dữ liệu vào, chạy thử và cho mình biết thời gian chạy chương trình là bao lâu. Có gì thì báo để mình chỉnh sửa thêm.
 

File đính kèm

  • chaynoikhong.rar
    483 KB · Đọc: 13
Lần chỉnh sửa cuối:
-Cách dùng mãng để xử lý vấn đề tốc độ của excel quả thật là rất hiệu quả. Tuy nhiên, kích cỡ của mãng lại giới hạn bởi cấu hình của máy. Đối với vùng dữ liệu phải dùng mãng với số lượng phần tử quá lớn như trên, mình phải giải quyết bằng cách:
+ Bỏ tô màu.
+Chia vùng dữ liệu thành 100 phần và chạy lần lượt. ( chia nhiều phần để phòng số dòng có thể tăng thêm)
-Bạn tải file về, cho dữ liệu vào, chạy thử và cho mình biết thời gian chạy chương trình là bao lâu. Có gì thì báo để mình chỉnh sửa thêm.
Biết nói gì đây, tuyệt vời bạn ạ! Cách làm của bạn coi như tổng hợp có thể giải quyết các trường hợp dữ liệu lớn hay nhỏ rồi! Rất cảm ơn bạn! Tuyệt quá!
 
Web KT

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

Back
Top Bottom