thanh tong
Thành viên hoạt động
- Tham gia
- 27/5/10
- Bài viết
- 122
- Được thích
- 11
Thử file này xem!Mỗi sheet đều đặt Hide và Show all. Để vào sheet nào cần thực hiện thì mình chọn luôn ở sheet đó cho tiện. Như trong file mình đã đặt sẵn. Bạn xem file đính kèm và sửa giúp mình nhé?
Sub HideAndUnHide()
Dim Btt As Button
With Range([L2], [L65536].End(xlUp))
Set Btt = .Parent.Buttons("Btt1")
If Btt.Characters.Text = "Hide" Then
.AutoFilter 1, ">0", , , False
Btt.Characters.Text = "UnHide"
Else
.Parent.AutoFilterMode = False
Btt.Characters.Text = "Hide"
End If
End With
End Sub
Nếu bạn làm theo từng Sheet thì càng đươn giản hơnMỗi sheet đều đặt Hide và Show all. Để vào sheet nào cần thực hiện thì mình chọn luôn ở sheet đó cho tiện. Như trong file mình đã đặt sẵn. Bạn xem file đính kèm và sửa giúp mình nhé?
Thử file này xem!
Code trong file chỉ vầy:
Lưu ý rằng tôi dùng Button được vẽ từ thanh Forms (không giống như CommandButton mà bạn đang dùng)PHP:Sub HideAndUnHide() Dim Btt As Button With Range([L2], [L65536].End(xlUp)) Set Btt = .Parent.Buttons("Btt1") If Btt.Characters.Text = "Hide" Then .AutoFilter 1, ">0", , , False Btt.Characters.Text = "UnHide" Else .Parent.AutoFilterMode = False Btt.Characters.Text = "Hide" End If End With End Sub
Muốn chạy code ở sheet khác, chỉ việc copy Button paste sang sheet khác là được
Ngoài ra, chẳng dùng Define name nào cả
Dù dữ liệu thế nào thì cũng phải có cái gì đó để nhận biết. Như file của bạn, tôi dùng từ khóa "Những dòng ko phát sinh" để nhận biết cột cần tìmCác bạn cho mình hỏi chút? Giả sử sheet4 cột cần ẩn nó lại thay đổi nằm ở cột M . Tức là cột cần ẩn ở sheet4 nó ko giống với các sheet khác trong file hiện tại là cột L . Mình có gửi file đính kèm. Mong các bạn sửa giúp. Cảm ơn các Bạn đã quan tâm và giúp đỡ!
Sub HideAndUnHide()
Dim Btt As Button, fRng As Range
Set fRng = Cells.Find(Evaluate("Tmp"), , , xlWhole)
If Not fRng Is Nothing Then
With Range(fRng, Cells(65536, fRng.Column).End(xlUp))
Set Btt = .Parent.Buttons("Btt1")
If Btt.Characters.Text = "Hide" Then
.AutoFilter 1, ">0", , , False
Btt.Characters.Text = "UnHide"
Else
.Parent.AutoFilterMode = False
Btt.Characters.Text = "Hide"
End If
End With
End If
End Sub
Sub HideAndUnHide()
Dim Btt As Button, MyRng As Range
Set MyRng = IIf(ActiveSheet.Name = "Sheet4", Range([M2], [M65536].End(xlUp)), Range([L2], [L65536].End(xlUp)))
With MyRng
Set Btt = .Parent.Buttons("Btt1")
If Btt.Characters.Text = "Hide" Then
.AutoFilter 1, ">0", , , False
Btt.Characters.Text = "UnHide"
Else
.Parent.AutoFilterMode = False
Btt.Characters.Text = "Hide"
End If
End With
End Sub
Sub HideAndUnHide()
Dim Btt As Button, fRng As Range
Set fRng = Cells.Find(Evaluate("Tmp"), , , xlWhole)
If Not fRng Is Nothing Then
With Range(fRng, Cells(65536, fRng.Column).End(xlUp))
Set Btt = .Parent.Buttons("Btt1")
If Btt.Characters.Text = "Hide" Then
.AutoFilter 1, ">0", xlOr, "<>", False
Btt.Characters.Text = "UnHide"
Else
.Parent.AutoFilterMode = False
Btt.Characters.Text = "Hide"
End If
End With
End If
End Sub
Dù dữ liệu thế nào thì cũng phải có cái gì đó để nhận biết. Như file của bạn, tôi dùng từ khóa "Những dòng ko phát sinh" để nhận biết cột cần tìm
Trong code này có Evaluate("Tmp"), với Tmp là name chứa từ khóa "Những dòng ko phát sinh"PHP:Sub HideAndUnHide() Dim Btt As Button, fRng As Range Set fRng = Cells.Find(Evaluate("Tmp"), , , xlWhole) If Not fRng Is Nothing Then With Range(fRng, Cells(65536, fRng.Column).End(xlUp)) Set Btt = .Parent.Buttons("Btt1") If Btt.Characters.Text = "Hide" Then .AutoFilter 1, ">0", , , False Btt.Characters.Text = "UnHide" Else .Parent.AutoFilterMode = False Btt.Characters.Text = "Hide" End If End With End If End Sub
Cái tên "Cột cần ẩn" ấy, thực tế nó là cái gì thì bạn cứ vào Define name, sửa lại y chang thế là được. Tôi đã nói ở trên là tôi tìm cột theo từ khóa rồi màMong các bạn xem file và giúp đỡ
Cái tên "Cột cần ẩn" ấy, thực tế nó là cái gì thì bạn cứ vào Define name, sửa lại y chang thế là được. Tôi đã nói ở trên là tôi tìm cột theo từ khóa rồi mà
"Cột cần ẩn" thực ra mình ghi chú vậy thôi. Mình muốn ẩn theo khoảng như ở sheet1 là L3:L12 và muốn là khi mình thêm ròng đến L20 thì trong code nó cũng tự động giãn dòng theo là L3:L20.
Bạn cứ thử đi bao nhiêu dòng mà chẳng được! 65 ngàn dòng cũng OK
Nhưng mà theo khoảng kiểu L$3:L$12 thì tốt. Bởi vì nếu trong file ở dưới lại có những phát sinh khác mà nó cứ tự động làm một nhát từ trên xuống đến 65.000 thì nó ẩn hết cả những vùng mình ko muốn ẩn
Với Code của Thầy NDU, bạn chỉnh lại theo cái này:
With Range(fRng, Cells(65536, fRng.Column).End(xlUp))
Cái số màu đỏ ấy, bạn chỉnh thành 12 hay 20 gì đó là được!
Chỉnh lại là 20 chẳng hạn. Nhưng khi mình thêm 20 dòng nữa. Thì lúc này phải lấy trong khoảng L3:L40 còn code mà để là 20 theo bạn nói thì code nó sẽ lấy là L1:L20 thôi mà trên thực tế mình đã thêm 20 dòng cơ mà bạn.
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim Rng As Range
On Error GoTo thoat
For Each Rng In Sh.Range(Sh.[R1])
Rng.EntireRow.Hidden = Rng.Value = 0
Next
thoat:
End Sub
Sub AnDong()
Dim Rg As Range
Application.ScreenUpdating = False
With ActiveSheet
For Each Rg In .Range(.[A4], .[A65536].End(3).Offset(-2))
If WorksheetFunction.CountA(Rg.Resize(, 5)) = 0 Then
Rg.EntireRow.Hidden = True
Else
Rg.EntireRow.Hidden = False
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Qua file ví dụ mình mới hiểu ẩn tất cả các dòng hoàn toàn không dữ liệu đúng không?
Nếu đã dùng nút nhấn cho mỗi trang thì ta viết 1 code chung như sau:
Mã:Sub AnDong() Dim Rg As Range Application.ScreenUpdating = False With ActiveSheet For Each Rg In .Range(.[A4], .[A65536].End(3).Offset(-2)) If WorksheetFunction.CountA(Rg.Resize(, 5)) = 0 Then Rg.EntireRow.Hidden = True Else Rg.EntireRow.Hidden = False End If Next End With Application.ScreenUpdating = True End Sub
Sau đó tất cả các nút mỗi Sheet đều gọi code này