Ẩn dòng theo điều kiện ? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
Xin chào tất các bạn,
Như tiêu đề O.Thơ đã nêu ở trên và điều kiện cụ thể O,Thơ viết chi tiết trong file đính kèm rồi ạ.
Rất mong nhận được sự trợ giúp của các bạn.
O.Thơ xin cảm ơn rất nhiều.
 

File đính kèm

Macro của bạn đây & xin mời:

PHP:
Option Explicit
Sub An5DongTrong()
 Dim SoDg As Long
 Dim Cls As Range, aRng As Range
 
 For Each Cls In Range("E2:E33")
    If Cls.Value = "" Then
        SoDg = SoDg + 1
        If SoDg = 1 Then
            Set aRng = Cls
        ElseIf SoDg < 5 Then
            Set aRng = Union(aRng, Cls)
        ElseIf SoDg = 5 Then
            Union(aRng, Cls).EntireRow.Hidden = True
            Set aRng = Nothing:         SoDg = 0
        End If
    Else
        Set aRng = Nothing:             SoDg = 0
    End If
 Next Cls
End Sub
 
Upvote 0
Bạn thử thêm cách này nữa nha:
Mã:
Option Explicit
Sub an_dong()
Dim i As Long, dem As Long, vung As Range, vung2 As Range
Set vung = Range("A1")
For i = 2 To 33
  If IsEmpty(Cells(i, 5).Value) Then
       dem = dem + 1
       If dem = 5 Then
          Set vung = Union(Cells(i, 5).Offset(-4).Resize(5), vung)
          dem = 0
       End If
  Else
      dem = 0
  End If
Next i
Set vung2 = Intersect([E2:E100], vung)
vung2.EntireRow.Hidden = True
End Sub
 
Upvote 0
PHP:
Option Explicit
Sub An5DongTrong()
 Dim SoDg As Long
 Dim Cls As Range, aRng As Range
 
 For Each Cls In Range("E2:E33")
    If Cls.Value = "" Then
        SoDg = SoDg + 1
        If SoDg = 1 Then
            Set aRng = Cls
        ElseIf SoDg < 5 Then
            Set aRng = Union(aRng, Cls)
        ElseIf SoDg = 5 Then
            Union(aRng, Cls).EntireRow.Hidden = True
            Set aRng = Nothing:         SoDg = 0
        End If
    Else
        Set aRng = Nothing:             SoDg = 0
    End If
 Next Cls
End Sub

Rút gọn một chút để khỏi "Set" hé "Đại Ca".
PHP:
Public Sub GPE()
Dim Cll As Range, Num As Long
For Each Cll In Range("E2:E33")
    If Cll.Value = "" Then
        Num = Num + 1
    Else
        Num = 0
    End If
    If Num = 5 Then
        Rows(Cll.Row & ":" & Cll.Offset(-4).Row).EntireRow.Hidden = True
        Num = 0
    End If
Next
End Sub
 
Upvote 0
Cảm ơn tất cả các bạn rất nhiều vì đã hỗ trợ.
O.Thơ đã thử các code trên, tất cả đều đúng như O.Thơ đã miêu tả rồi.
-------------
Tuy nhiên O.Thơ đã có một chút nhầm lẫn trong vấn đề miêu tả.
Oanh Thơ rất xin lỗi vì đã làm các bạn mất thời gian vì sự nhầm lẫn này ạ.
Hiện O.Thơ đã miêu tả lại mong muốn của mình.
Rất mong lại nhận được sự hỗ trợ từ các bạn.
Xin cảm ơn các bạn rất nhiều
 

File đính kèm

Upvote 0
PHP:
Option Explicit
Sub An5OTrongLienTiep()
 Dim J As Long:                         Dim Rng As Range
 For J = 2 To 44 Step 5
    Set Rng = Cells(J, "E").Resize(5)
    If Application.WorksheetFunction.Sum(Rng) = 0 Then
        Rng.EntireRow.Hidden = True
    End If
 Next J
End Sub
 
Upvote 0
PHP:
Option Explicit
Sub An5OTrongLienTiep()
 Dim J As Long:                         Dim Rng As Range
 For J = 2 To 44 Step 5
    Set Rng = Cells(J, "E").Resize(5)
    If Application.WorksheetFunction.Sum(Rng) = 0 Then
        Rng.EntireRow.Hidden = True
    End If
 Next J
End Sub

Cảm ơn bạn đã hỗ trợ cho O.Thơ ạ,
O.Thơ đã test thử đoạn code này chỉ set giá trị số thôi ạ (nếu các vùng màu vàng mà có dữ liệu dạng văn bản hay các dữ liệu khác ngoài các con số thì dòng vẫn bị ẩn) bạn ạ.
Bạn có thể sửa lại code giúp O.Thơ để làm sao khi 5 ô không có 1 ký hiệu gì thì mới ẩn được không?
Một lần nữa xin cảm ơn bạn.
 
Upvote 0
Thì tại bạn đưa file toàn chưa kí số không cơ mà!
PHP:
Option Explicit
Sub An5OTrongLienTiep()
 Dim J As Long:                         Dim Rng As Range
 For J = 2 To 44 Step 5
    Set Rng = Cells(J, "E").Resize(5)
    If Application.WorksheetFunction.CountBlank(Rng) = 5 Then
        Rng.EntireRow.Hidden = True
    End If
 Next J
End Sub
 
Upvote 0
Thì tại bạn đưa file toàn chưa kí số không cơ mà!
PHP:
Option Explicit
Sub An5OTrongLienTiep()
 Dim J As Long:                         Dim Rng As Range
 For J = 2 To 44 Step 5
    Set Rng = Cells(J, "E").Resize(5)
    If Application.WorksheetFunction.CountBlank(Rng) = 5 Then
        Rng.EntireRow.Hidden = True
    End If
 Next J
End Sub

Hi, vâng! Đúng là lỗi do O.Thơ bạn ạ!
Cảm ơn bạn đã hỗ trợ , code đúng ý O.Thơ rồi.
 
Upvote 0
Thì tại bạn đưa file toàn chưa kí số không cơ mà!
PHP:
Option Explicit
Sub An5OTrongLienTiep()
 Dim J As Long:                         Dim Rng As Range
 For J = 2 To 44 Step 5
    Set Rng = Cells(J, "E").Resize(5)
    If Application.WorksheetFunction.CountBlank(Rng) = 5 Then
        Rng.EntireRow.Hidden = True
    End If
 Next J
End Sub

Xin chào tất cả các bạn,đúng là code đã hoat động tốt rồi ạ...
Tuy nhiên với dữ liệu khoảng 7000 dòng thì code chạy cũng rất lâu:
Mã:
For J = 2 To 7000 Step 5
Xin hỏi các bạn còn giải pháp nào tối ưu về thời gian chạy code nữa không ạ?
Rất mong được các bạn hỗ trợ thêm cho chủ để này.
Xin cảm ơn.
---
Có lẽ cũng là lỗi của O.Thơ không nói kỹ hơn, rất xin lỗi tất cả các bạn.
 
Upvote 0
Xin chào tất cả các bạn,đúng là code đã hoat động tốt rồi ạ...
Tuy nhiên với dữ liệu khoảng 7000 dòng thì code chạy cũng rất lâu:
Mã:
For J = 2 To 7000 Step 5
Xin hỏi các bạn còn giải pháp nào tối ưu về thời gian chạy code nữa không ạ?
Rất mong được các bạn hỗ trợ thêm cho chủ để này.
Xin cảm ơn.
---
Có lẽ cũng là lỗi của O.Thơ không nói kỹ hơn, rất xin lỗi tất cả các bạn.

Bạn đưa dữ liệu "hơi thật" một chút coi sao.
Có thể dùng mảng lọc ra chỗ khác hoặc sheet khác theo điều kiện sẽ nhanh hơn là duyệt từng dòng rồi Hide, Unhide.
Khoảng 10.000 dòng chắc cũng không lâu lắm đâu.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào tất cả các bạn,đúng là code đã hoat động tốt rồi ạ...
Tuy nhiên với dữ liệu khoảng 7000 dòng thì code chạy cũng rất lâu:
Mã:
For J = 2 To 7000 Step 5
Xin hỏi các bạn còn giải pháp nào tối ưu về thời gian chạy code nữa không ạ?
Rất mong được các bạn hỗ trợ thêm cho chủ để này.
Xin cảm ơn.
---
Có lẽ cũng là lỗi của O.Thơ không nói kỹ hơn, rất xin lỗi tất cả các bạn.
Bạn up file khoảng 7000 dòng lên đây mình test thử thế nào. Tôi thấy code #8 nếu sửa chút nửa có thể giải quyết được, nhưng phải có file test mới trả lời được.
 
Upvote 0
Nếu dữ liệu trong cột có nhiều hơn bội số của 5 ô thì ta có thể không xài For. . .Next nữa
Mà xài Do . . . Loop đỡ fần nào tốc độ chăng?

Bạn RoberLiem hăm he xài mảng kia rồi; Hãy chờ file giả lập của tác giải vậy.
Gì mà file quí lắm hay sao mà trình bày đến hơn 5 lần vẫn chưa xác thực?!

Chúc mọi người có ngày nghỉ vui vẻ!
 
Upvote 0
Xin cảm ơn các bạn đã quan tâm đến chủ đề ạ.
Vâng o.Thơ xin upfile minh họa dữ liệu lớn ạ. ( so với file số 2 cũng không có gì thay đổi đâu ạ chỉ là tăng số lượng dòng và sheet lên thêm thôi ).
Chỉ là dữ liệu trong file của O.Thơ hơi nhạy cảm một chút nên O.Thơ không up file thật lên được chứ trong đó có gì quý giá đáng học hay đang xem đâu ạ.
Đúng là code bài 8, O.Thơ đã giải quyết được vấn đề rồi và O.Thơ đã áp dụng một lần nữa cảm ơn bạn HYen17 đã hỗ trợ
nhưng O.Thơ thấy hơi chậm lên muốn hỏi thêm xem có giải pháp nào tối ưu hơn nữa không ạ.

Nếu các bạn có thời gian và hứng thú rất mong các bạn tiếp tục với chủ đề ạ.
Xin cảm ơn tất cả các bạn rất nhiều
 

File đính kèm

Upvote 0
Xin cảm ơn các bạn đã quan tâm đến chủ đề ạ.
Vâng o.Thơ xin upfile minh họa dữ liệu lớn ạ. ( so với file số 2 cũng không có gì thay đổi đâu ạ chỉ là tăng số lượng dòng và sheet lên thêm thôi ).
Chỉ là dữ liệu trong file của O.Thơ hơi nhạy cảm một chút nên O.Thơ không up file thật lên được chứ trong đó có gì quý giá đáng học hay đang xem đâu ạ.
Đúng là code bài 8, O.Thơ đã giải quyết được vấn đề rồi và O.Thơ đã áp dụng một lần nữa cảm ơn bạn HYen17 đã hỗ trợ
nhưng O.Thơ thấy hơi chậm lên muốn hỏi thêm xem có giải pháp nào tối ưu hơn nữa không ạ.

Nếu các bạn có thời gian và hứng thú rất mong các bạn tiếp tục với chủ đề ạ.
Xin cảm ơn tất cả các bạn rất nhiều

Bạn nói rõ lại là từng nhóm 5 dòng trong cột E nếu hoàn toàn trống rỗng thì bỏ qua không lọc? Có một dấu nháy đơn cũng coi là có dữ liệu? (Vì tôi thấy có nhóm không có số 1,2,3... mà có 1 dấu nháy đơn)
Lọc dữ liệu sang sheet khác được không hay phải ẩn dòng tại chỗ?
 
Upvote 0
Xin cảm ơn các bạn đã quan tâm đến chủ đề ạ.
Vâng o.Thơ xin upfile minh họa dữ liệu lớn ạ. ( so với file số 2 cũng không có gì thay đổi đâu ạ chỉ là tăng số lượng dòng và sheet lên thêm thôi ).
Chỉ là dữ liệu trong file của O.Thơ hơi nhạy cảm một chút nên O.Thơ không up file thật lên được chứ trong đó có gì quý giá đáng học hay đang xem đâu ạ.
Đúng là code bài 8, O.Thơ đã giải quyết được vấn đề rồi và O.Thơ đã áp dụng một lần nữa cảm ơn bạn HYen17 đã hỗ trợ
nhưng O.Thơ thấy hơi chậm lên muốn hỏi thêm xem có giải pháp nào tối ưu hơn nữa không ạ.

Nếu các bạn có thời gian và hứng thú rất mong các bạn tiếp tục với chủ đề ạ.
Xin cảm ơn tất cả các bạn rất nhiều
Mạng phép sử dụng code của bạn HYen17 và chỉnh sửa chút đỉnh để tăng tốc, hy vọng đáp ứng yêu cầu của bạn.
Mã:
Sub An5OTrongLienTiep()
 Dim J As Long, vung As Range, Rng As Range, kt As Boolean
 Application.ScreenUpdating = False
 Application.DisplayAlerts = False
 Application.Calculation = xlCalculationManual
 For J = 2 To 8097 Step 5
    Set Rng = Cells(J, "E").Resize(5)
    If Application.WorksheetFunction.CountBlank(Rng) = 5 Then
        If vung Is Nothing Then
           Set vung = Rng
        Else
           Set vung = Union(vung, Rng)
        End If
    End If
 Next J
 vung.EntireRow.Hidden = True
 Application.ScreenUpdating = True
 Application.DisplayAlerts = True
 Application.Calculation = xlCalculationAutomatic
End Sub
 
Upvote 0
Bạn nói rõ lại là từng nhóm 5 dòng trong cột E nếu hoàn toàn trống rỗng thì bỏ qua không lọc? Có một dấu nháy đơn cũng coi là có dữ liệu? (Vì tôi thấy có nhóm không có số 1,2,3... mà có 1 dấu nháy đơn)
Lọc dữ liệu sang sheet khác được không hay phải ẩn dòng tại chỗ?

Đúng vậy bạn,dấu nháy đơn cũng được coi là có dữ liệu ạ. Code bài #8 đã chạy đúng tuy nhiên hơi chậm nếu số lượng dòng nhiều thôi ạ.
Về vấn đề lọc sang sheet khác trong file nay O.Thơ không áp dụng được vì đó là file dùng chung và đã khóa password không cho thêm sheets hoặc sửa tên sheets, xóa dòng thêm dòng,cột trong các sheets... chỉ có thể ẩn dòng hiện dòng,cột được thôi ạ.
Nếu bạn đã làm rồi thì có thể gửi lên cho O.Thơ tham khảo được không ạ.
Có thể O.Thơ sẽ cần đến trong trường hợp khác
Cảm ơn bạn đã tìm cách giúp đỡ O.Thơ.
 
Upvote 0
Mạng phép sử dụng code của bạn HYen17 và chỉnh sửa chút đỉnh để tăng tốc, hy vọng đáp ứng yêu cầu của bạn.
Mã:
Sub An5OTrongLienTiep()
 Dim J As Long, vung As Range, Rng As Range, kt As Boolean
 Application.ScreenUpdating = False
 Application.DisplayAlerts = False
 Application.Calculation = xlCalculationManual
 For J = 2 To 8097 Step 5
    Set Rng = Cells(J, "E").Resize(5)
    If Application.WorksheetFunction.CountBlank(Rng) = 5 Then
        If vung Is Nothing Then
           Set vung = Rng
        Else
           Set vung = Union(vung, Rng)
        End If
    End If
 Next J
 vung.EntireRow.Hidden = True
 Application.ScreenUpdating = True
 Application.DisplayAlerts = True
 Application.Calculation = xlCalculationAutomatic
End Sub

Nhanh quá bạn ơi..hihi
Cảm ơn bạn nhiều nhé.
 
Upvote 0
góp vui
Mã:
Option Explicit
Sub AnNhomDongTrong()
 Dim Sarr, tam(1 To 60000) As Variant
 Dim i, j, k As Long
 Dim rng As Range
 Sarr = [e2:e8101]
 For i = 1 To UBound(Sarr) Step 5
  If Trim(Sarr(i, 1)) = "" Then
    k = k + 1
    tam(k) = "E" & i + 1 & ":E" & i + 5
  End If
 Next

With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
    For i = 1 To k
        Range(tam(i)).EntireRow.Hidden = True
    Next
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
 
End Sub
=========
Sửa code sau khi đọc bài 16 của bạn "giaiphap"
Mã:
Option Explicit
Sub AnNhomDongTrong()
 Dim Sarr, tam(1 To 60000) As Variant
 Dim i, j, k As Long
 Dim rng, VUNG As Range
 Sarr = [e2:e8101]
 
 For i = 1 To UBound(Sarr) Step 5
  If Trim(Sarr(i, 1)) = "" Then
     Set rng = Range("E" & i + 1 & ":E" & i + 5)
        If VUNG Is Nothing Then
            Set VUNG = rng
        Else
           Set VUNG = Union(VUNG, rng)
        End If
  End If
 Next

    
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
    VUNG.EntireRow.Hidden = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
 
End Sub
hehehhe..sửa xong thấy y chang bài người ta..........heheheeh
giống "đạo code" quá...kkkakakak
 
Lần chỉnh sửa cuối:
Upvote 0
góp vui
Mã:
Option Explicit
Sub AnNhomDongTrong()
 Dim Sarr, tam(1 To 60000) As Variant
 Dim i, j, k As Long
 Dim rng As Range
 Sarr = [e2:e8101]
 For i = 1 To UBound(Sarr) Step 5
  If Trim(Sarr(i, 1)) = "" Then
    k = k + 1
    tam(k) = "E" & i + 1 & ":E" & i + 5
  End If
 Next

With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
    For i = 1 To k
        Range(tam(i)).EntireRow.Hidden = True
    Next
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
 
End Sub
=========
Sửa code sau khi đọc bài 16 của bạn "giaiphap"
Mã:
Option Explicit
Sub AnNhomDongTrong()
 Dim Sarr, tam(1 To 60000) As Variant
 Dim i, j, k As Long
 Dim rng, VUNG As Range
 Sarr = [e2:e8101]
 
 For i = 1 To UBound(Sarr) Step 5
  If Trim(Sarr(i, 1)) = "" Then
     Set rng = Range("E" & i + 1 & ":E" & i + 5)
        If VUNG Is Nothing Then
            Set VUNG = rng
        Else
           Set VUNG = Union(VUNG, rng)
        End If
  End If
 Next

    
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
    VUNG.EntireRow.Hidden = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
 
End Sub
hehehhe..sửa xong thấy y chang bài người ta..........heheheeh
giống "đạo code" quá...kkkakakak

O.Thơ đã thử cả 2 code của bạn,không thể so sánh được đoạn nào nhanh hơn nữa rồi. Tất cả chỉ diễn ra trong chớp mắt.
Được những người như bạn tham gia hỗ trợ đúng là rất vui :-=
Cảm ơn bạn nhiều rất nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom