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ằngMã: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
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 )
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
Code của bạn:Bạn xem ntn có được không?
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
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ệnbaquy
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
For Each cls In Range("d:d")
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
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ơ.Code của bạn:
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 í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
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:
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ỉ ?Mã:For Each cls In Range("d:d")
Trường hợp thêm cột C mình nghĩ code có thể như thế này:
ThânMã: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
Không hiểu ý Bạn luô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ơ.
If Application.Sum(cls.Resize(, 4)) = 0 Then cls.EntireRow.Hidden = True
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)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
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?
Vậy thì mình thêm hàm Abs vào nha sư phụ: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è?
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
=COUNTIF($D8:$G8,0)<COLUMNS($D8:$G8)
Đú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.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:
- Gọi Advanced Filter là lọc với vùng điều kiện J1:J2 là được rồiPHP:=COUNTIF($D8:$G8,0)<COLUMNS($D8:$G8)
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
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.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
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2