Ẩn dòng khi 1 khoảng dòng dữ liệu trắng.

Liên hệ QC

lq177

Thành viên thường trực
Tham gia
22/4/10
Bài viết
203
Được thích
112
EM có một bảng dữ liệu Em muốn ẩn những dòng trống
yêu cầu ở trong file đính kèm
TKS!
 

File đính kèm

  • GPE.xlsx
    9.2 KB · Đọc: 24
Bạn xem ntn có được không?
 

File đính kèm

  • GPE1.xls
    35 KB · Đọc: 52
Upvote 0
Bạn dhn46 cho mình hỏi chút là giả sử dữ liệu phát sinh thêm ra đến ô C7:C29 thì mình phải sửa code ở chỗ nào. Để mình biết cách để ứng dụng vào thực tiễn sau này. Mong bạn chỉ bảo.
 
Upvote 0
Mã:
Sub GIAU()
Dim irow As Long
Dim cls As Range


For Each cls In Range("d:d")
[COLOR=#ff0000]    If cls.Value = "0" And cls.Offset(, 1).Value = "0" And cls.Offset(, 3) = "0" Then[/COLOR]
             cls.EntireRow.Hidden = True
     End If
Next
End Sub
thay bằng
If cls.Value = "0" And cls.Offset(, 1).Value = "0" And cls.Offset(, 3) = "0" And cls.Offset(, [-1]) = "0" Then

Cách này của mình chắc chưa phải tối ưu nhất, tốc độ còn chậm, Mong các anh e gpe góp ý thêm.
(Nếu bạn thấy hữu ích thì thanks cái nha...hii--=0 )
 
Upvote 0
Mã:
Sub GIAU()
Dim irow As Long
Dim cls As Range


For Each cls In Range("d:d")
[COLOR=#ff0000]    If cls.Value = "0" And cls.Offset(, 1).Value = "0" And cls.Offset(, 3) = "0" Then[/COLOR]
             cls.EntireRow.Hidden = True
     End If
Next
End Sub
thay bằng
If cls.Value = "0" And cls.Offset(, 1).Value = "0" And cls.Offset(, 3) = "0" And cls.Offset(, [-1]) = "0" Then

Cách này của mình chắc chưa phải tối ưu nhất, tốc độ còn chậm, Mong các anh e gpe góp ý thêm.
(Nếu bạn thấy hữu ích thì thanks cái nha...hii--=0 )

Code của bạn nhanh đấy chứ, tôi muốn sửa lại cho trường hợp nhiều cột hơn, lúc đó bạn không thể dùng and được, mà phải dùng dòng lặp để duyệt, nhưng mà code này chạy cực kỳ tệ, bạn có thể xem và sửa lại cho nhanh dùm tôi nha
xin cảm ơn

PHP:
For Each cls In Range("d1:d50")
    falg = True
  For i = 1 To 3
      If cls.Offset(, i).Value <> "0" Then
               falg = False
               Exit For
       End If
    Next i
       cls.EntireRow.Hidden = falg
    Next cls
 
Upvote 0
Bạn xem ntn có được không?
Code của bạn:
Mã:
Sub GIAU()
Dim irow As Long
Dim cls As Range
For Each cls In Range("d:d")
    If cls.Value = "0" And cls.Offset(, 1).Value = "0" And cls.Offset(, 3) = "0" Then
             cls.EntireRow.Hidden = True
     End If
Next
End Sub
Có thể chưa thỏa yêu cầu của đề bài, hình như đề bài là cả 4 cột đều là 0 thì mới ẩn hay sao í
baquy
Bạn dhn46 cho mình hỏi chút là giả sử dữ liệu phát sinh thêm ra đến ô C7:C29 thì mình phải sửa code ở chỗ nào. Để mình biết cách để ứng dụng vào thực tiễn sau này. Mong bạn chỉ bảo
Trong trường hợp này mình nghĩ nên dùng hàm MAX để lấy dòng thỏa điều kiện
Cái này nói ngoài lề tí tẹo:
Mã:
For Each cls In Range("d:d")
Sao bạn không xác định vùng chạy của biến cls mà cho chạy cả cột nhỉ ?
Trường hợp thêm cột C mình nghĩ code có thể như thế này:
Mã:
Sub GIAU1()
    Dim cls As Range
        For Each cls In Range([c8], [c1000].End(xlUp))
            If Application.WorksheetFunction.Max(cls.Resize(, 5)) = 0 Then cls.EntireRow.Hidden = True
        Next
End Sub
Thân
 
Upvote 0
Code của bạn:
Mã:
Sub GIAU()
Dim irow As Long
Dim cls As Range
For Each cls In Range("d:d")
    If cls.Value = "0" And cls.Offset(, 1).Value = "0" And cls.Offset(, 3) = "0" Then
             cls.EntireRow.Hidden = True
     End If
Next
End Sub
Có thể chưa thỏa yêu cầu của đề bài, hình như đề bài là cả 4 cột đều là 0 thì mới ẩn hay sao í

Trong trường hợp này mình nghĩ nên dùng hàm MAX để lấy dòng thỏa điều kiện
Cái này nói ngoài lề tí tẹo:
Mã:
For Each cls In Range("d:d")
Sao bạn không xác định vùng chạy của biến cls mà cho chạy cả cột nhỉ ?
Trường hợp thêm cột C mình nghĩ code có thể như thế này:
Mã:
Sub GIAU1()
    Dim cls As Range
        For Each cls In Range([c8], [c1000].End(xlUp))
            If Application.WorksheetFunction.Max(cls.Resize(, 5)) = 0 Then cls.EntireRow.Hidden = True
        Next
End Sub
Thân
Em thấy code của Anh CONCOGIA trường hợp phát sinh cột C, khi em thay giá trị <> 0(1,2,...) thì cột dòng đó vẫn bị ẩn, ý của em là khi 1 trong 4 or 5 ô trong dòng đó =0 thì dòng đó sẽ bị ẩn cơ.
 
Upvote 0
Em thấy code của Anh CONCOGIA trường hợp phát sinh cột C, khi em thay giá trị <> 0(1,2,...) thì cột dòng đó vẫn bị ẩn, ý của em là khi 1 trong 4 or 5 ô trong dòng đó =0 thì dòng đó sẽ bị ẩn cơ.
Không hiểu ý Bạn luôn.
Code của Anh Cò là đúng yêu cầu như bài đầu của bạn rồi, làm gì có chuyện "khi em thay giá trị <> 0(1,2,...) thì cột dòng đó vẫn bị ẩn".
Theo yêu cầu của bài đầu thì: Nếu tất cả các ô của các cột đang xét = 0 (tương ứng với mệnh đề And) thì ẩn dòng đó, bây giờ bạn lại nói "ý của em là khi 1 trong 4 or 5 ô trong dòng đó =0 thì dòng đó sẽ bị ẩn cơ" (tương ứng với mệnh đề Or của các ô), vậy cuối cùng ý bạn như thế nào?
 
Lần chỉnh sửa cuối:
Upvote 0
Gởi Cò già:
1. Cò già dùng Max là chưa hợp lý à nha: Nếu có số âm thì sao nè?
2. Người ta nói 4 cột D:G đều bằng 0, mà cò già chơi C.Resize(, 5) thì người ta la làng phải rồi, phải là D.Resize(, 4) chứ?

Túm lại, điều kiện ẩn dòng là:

PHP:
If Application.Sum(cls.Resize(, 4)) = 0 Then cls.EntireRow.Hidden = True

Xui lắm mới có 1 âm 1 dương bù trừ nhau. Còn không thì phải liệt kê 4 cells và 3 and

3. Nếu dữ liệu nhiều dòng thì nên dùng mảng + cột phụ + Autofilter
 
Lần chỉnh sửa cuối:
Upvote 0
Gởi Cò già:
1. Cò già dùng Max là chưa hợp lý à nha: Nếu có số âm thì sao nè?
2. Người ta nói 4 cột D:G đều bằng 0, mà cò già chơi C.Resize(, 5) thì người ta la làng phải rồi, phải là D.Resize(, 4) chứ?

Túm lại, điều kiện ẩn dòng là:

PHP:
If Application.Sum(cls.Resize(, 4)) = 0 Then cls.EntireRow.Hidden = True

Xui lắm mới có 1 âm 1 dương bù trừ nhau. Còn không thì phải liệt kê 4 cells và 3 and

3. Nếu dữ liệu nhiều dòng thì nên dùng mảng + cột phụ + Autofilter
1)- Tại thấy dữ liệu sao thì làm vậy ( dù sao cũng sơ ý, quên đề phòng trường hợp âm. Híc)
2)- Hihi, resize(,5) là khi có thêm cột C theo ý tác giả mà Thầy
 
Upvote 0
Muốn dùng mảng để set có bao nhiêu dòng thì làm như thế nào vậy anh?

Có thể dùng name kết hợp được không?

Dùng mảng + cột phụ + Autofilter:

- Khai báo 1 mảng 1 cột, số dòng bằng với số dòng của dữ liệu
- Dùng vòng lặp, gán giá trị cho mảng = Sum 4 cột
- Gán mảng xuống 1 cột phụ kề bên vùng dữ liệu
- Autofilter cả vùng dữ liệu + cột phụ (bằng code), điều kiện cột phụ <>0
 
Upvote 0
Gởi Cò già:
1. Cò già dùng Max là chưa hợp lý à nha: Nếu có số âm thì sao nè?
Vậy thì mình thêm hàm Abs vào nha sư phụ:
Mã:
Sub HideRow()
    Dim cls As Range, EndR As Long
    EndR = Range("C:G").Find("*", , , , , xlPrevious).Row
    For Each cls In Range("C8", "C" & EndR)
        If Application.WorksheetFunction.Max(Abs(cls), Abs(cls.Offset(o, 1)), Abs(cls.Offset(o, 2)), Abs(cls.Offset(o, 3)), Abs(cls.Offset(o, 4))) = 0 Then cls.EntireRow.Hidden = True
    Next
End Sub
Âm dương gì cũng được tất, dữ liệu trong 5 cột nên chưa dùng vòng lặp.
 
Upvote 0
Bài này mình thấy dùng Advanced Filter cũng gọn lắm chứ
- Gõ vào cell J2 công thức:
PHP:
=COUNTIF($D8:$G8,0)<COLUMNS($D8:$G8)
- Gọi Advanced Filter là lọc với vùng điều kiện J1:J2 là được rồi
 
Upvote 0
Bài này mình thấy dùng Advanced Filter cũng gọn lắm chứ
- Gõ vào cell J2 công thức:
PHP:
=COUNTIF($D8:$G8,0)<COLUMNS($D8:$G8)
- Gọi Advanced Filter là lọc với vùng điều kiện J1:J2 là được rồi
Đúng vậy anh NDU nhưng đây chỉ là một phần nhỏ trong cả 1 bảng tính lớn của em.
Cho em hỏi: Đoạn code của mọi người ở trên dùng cũng hay lắm nhưng nó chạy hơi ì ạch. file dữ liệu của em khoảng 500 dòng thôi,
anh có cách nào làm cho nó chạy nhanh hơn giúp em được không?
Cám ơn anh.
 

File đính kèm

  • An dong có điều kiện.rar
    22.7 KB · Đọc: 8
Upvote 0
Bạn thử code này xem: Code không dùng công thức, không dùng cột phụ, không dùng vòng lặp nên có thể nhanh hơn chăng.
Mã:
Sub Hide_RowBlank()
    Application.ScreenUpdating = False
    With Range([d8], [d65000].End(3)).Resize(, 4)
        .Replace 0, "", 1
        .EntireRow.Hidden = 1
        .SpecialCells(2).EntireRow.Hidden = 0
        .SpecialCells(4).Value = 0
    End With
End Sub


Mã:
Sub Un_Hide()
    Application.ScreenUpdating = False
    Cells.EntireRow.Hidden = 0
End Sub
 
Upvote 0
Bạn thử code này xem: Code không dùng công thức, không dùng cột phụ, không dùng vòng lặp nên có thể nhanh hơn chăng.
Mã:
Sub Hide_RowBlank()
    Application.ScreenUpdating = False
    With Range([d8], [d65000].End(3)).Resize(, 4)
        .Replace 0, "", 1
        .EntireRow.Hidden = 1
        .SpecialCells(2).EntireRow.Hidden = 0
        .SpecialCells(4).Value = 0
    End With
End Sub


Mã:
Sub Un_Hide()
    Application.ScreenUpdating = False
    Cells.EntireRow.Hidden = 0
End Sub
Cám ơn anh nhé, Em thấy nó cũng không được nhanh hơn lắm.
 
Upvote 0
Web KT
Back
Top Bottom