Ẩn hiện theo điều kiện bằng cách nhập ký Y/N (2 người xem)

Liên hệ QC

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

satthuvae

Thành viên thường trực
Tham gia
12/3/09
Bài viết
381
Được thích
52
Em chào các Anh/Chị. Em đã được giúp đỡ của các cao thủ trên diễn đàn. Nhưng do còn vướng trong quá trình làm ẩn dòng chỉ với thao tác nhập dữ liệu thôi, chứ không phải tạo nút ấn.
Em có File đính kèm, rất mong các cao thủ giúp đỡ em.
@ Mỗi lần được sự trả lời, góp ý em rất vui à. Cám ơn mọi người.
 

File đính kèm

Nhiều khi mình không muốn mất công lọc và nhìn nó rất dối mắt, khi làm mình ẩn cái cột đó đi, mình chỉ cần nhập Y/N là được. Mình đang nhờ cao thủ xem có cách nào hay hơn không.
 
Nhiều khi mình không muốn mất công lọc và nhìn nó rất dối mắt, khi làm mình ẩn cái cột đó đi, mình chỉ cần nhập Y/N là được. Mình đang nhờ cao thủ xem có cách nào hay hơn không.
Cách cùi:
[GPECODE=vb]Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If [M6] = "Y" Then
[L10].AutoFilter Field:=1, Criteria1:="hi?n"
End If
If [M6] = "N" Then
[L10].AutoFilter Field:=1
End If
End Sub
[/GPECODE]
Bạn Copy Code trên rồi Paste vào This Workbook của chính File Up lên ở #1 xem.
 
Anh ơi cho em hỏi, paste vào modud, hay sheet à?
 
Em làm được rùi ah. Em cám ơn anh nhiều.
 
Em chào các Anh/Chị. Em đã được giúp đỡ của các cao thủ trên diễn đàn. Nhưng do còn vướng trong quá trình làm ẩn dòng chỉ với thao tác nhập dữ liệu thôi, chứ không phải tạo nút ấn.
Em có File đính kèm, rất mong các cao thủ giúp đỡ em.
@ Mỗi lần được sự trả lời, góp ý em rất vui à. Cám ơn mọi người.
Như thế này có đúng ý bạn không:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$M$6" Then Exit Sub
    [A9:L10000].AutoFilter 12, [M6]
    If [M6] = "" Then ShowAllData
End Sub
chọn ẩn/hiện ở M6, xóa trắng để show all data.

P/S: Bài #4 hình như ko chạy.
 
Lần chỉnh sửa cuối:
Như thế này có đúng ý bạn không:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$M$6" Then Exit Sub
    [A9:L10000].AutoFilter 12, [M6]
    If [M6] = "" Then ShowAllData
End Sub
chọn ẩn/hiện ở M6, xóa trắng để show all data.
Chủ pic có nói là Nếu nhập Y thì chỉ lọc cột L có chữ "hiện", nếu nhập N thì sẽ trở lại bình thường mà.
#4 vẫn chạy bình thường nhé bạn.
 
Chủ pic có nói là Nếu nhập Y thì chỉ lọc cột L có chữ "hiện", nếu nhập N thì sẽ trở lại bình thường mà.
#4 vẫn chạy bình thường nhé bạn.
Vậy thì đổi code thành thế này:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$M$6" Then Exit Sub
    If Target = "Y" Then [A9:L10000].AutoFilter 12, "hi?n"
    If Target = "N" Then ShowAllData
End Sub
nhập Y/N vào ô M6
 

File đính kèm

Lần chỉnh sửa cuối:
Chủ pic có nói là Nếu nhập Y thì chỉ lọc cột L có chữ "hiện", nếu nhập N thì sẽ trở lại bình thường mà.
#4 vẫn chạy bình thường nhé bạn.
Vâng đúng rùi, thực hiện theo 2 cách của các Anh đều tốt cả. Nhưng em có một điểm nữa em đang vướng à
Cái #4 của anh Hung2412 nếu mà em có nhiều sheet khác nhau, số dòng của sheet khác nhau khi đó em lăn tăn không biết thực hiện như thế nào à.
#8 của anh Cá ngừ F1, là lọc điều kiện theo từng sheet, nhưng mà khi em copy sang word bằng past link thì nó vẫn hiện nút lọc. Em đang ko biết làm thế nào.
Em cám ơn các anh đã quan tâm bài viết của em.
 
Nhiều khi mình không muốn mất công lọc và nhìn nó rất dối mắt, khi làm mình ẩn cái cột đó đi, mình chỉ cần nhập Y/N là được. Mình đang nhờ cao thủ xem có cách nào hay hơn không.

Bạn tính như vậy chưa hợp lý đâu, ví dụ:
- Nhập "Y" thì lọc cột L với điều kiện "hiện"
- Nhập "N" thì trở lại bình thường (ShowAll dữ liệu)
- Vậy bạn có tính đến trường hợp nhập cái gì đó khác (chẳng hạn tôi nhập chữ "NDU") thì code sẽ hành động thế nào?
-------------------
Ngoài ra: Muốn khỏi mất công thì cái chuyện phải nhập chữ "Y" hoặc "N" vẫn còn dở ẹc. Nếu là tôi thì tôi sẽ thiết kế 1 CheckBox, check vào sẽ lọc "hiện", không check nữa sẽ ShowAll
Hợp lý không? Đằng nào bạn cũng chỉ cần 2 trường hợp lọc, vậy dùng CheckBox mới là chuẩn (và như vậy mới gọi là đở mất công nhất)
 
Lần chỉnh sửa cuối:
Không cần dữ liệu lại cột L
Nhập bất kỳ cái gì vào M6 đều ẩn, khi nhập N thì hiện
Khi ẩn không có dấu lọc
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> [M6].Address Then End
Cells.EntireRow.Hidden = 0
If UCase([M6]) = "N" Then End
Application.ScreenUpdating = False
Dim r As Long
For r = [I65536].End(3).Row To 10 Step -1
   If IsNumeric(Cells(r, 9)) Then
      If Cells(r, 7) + Cells(r, 9) = 0 Then
         Cells(r, 9).EntireRow.Hidden = True
      End If
   End If
Next
Application.ScreenUpdating = True
End Sub
 
Không cần dữ liệu lại cột L
Nhập bất kỳ cái gì vào M6 đều ẩn, khi nhập N thì hiện
Khi ẩn không có dấu lọc

Tại sao phải vòng lập mà không Filter cột G và cột I theo điều kiện >0 nhỉ?
Bởi tôi để ý dữ liệu thì thấy rằng: cột G và I cùng =0 hoặc cùng >0
 
Em chào các Anh/Chị. Em đã được giúp đỡ của các cao thủ trên diễn đàn. Nhưng do còn vướng trong quá trình làm ẩn dòng chỉ với thao tác nhập dữ liệu thôi, chứ không phải tạo nút ấn.
Em có File đính kèm, rất mong các cao thủ giúp đỡ em.
@ Mỗi lần được sự trả lời, góp ý em rất vui à. Cám ơn mọi người.

Minh xin góp một phần code cho bài của bạn!

PHP:
Sub ShowHide()
If [m6] = "Y" Then
    Range("L9", [L200].End(xlUp)).AutoFilter 1, [o4]
Else
    Range("L9", [L200].End(xlUp)).AutoFilter 1, [o3]
End If
End Sub

Tại Ô O3, O4 bạn điền ẩn, hiện là được!
 
Chủ pic có nói là Nếu nhập Y thì chỉ lọc cột L có chữ "hiện", nếu nhập N thì sẽ trở lại bình thường mà.
#4 vẫn chạy bình thường nhé bạn.

Mình có ý nghĩ như sau:
Nếu bạn đã đưa vào sự kiện Change của Worksheet:
Thì mỗi khi bạn thay đổi cái gì trong Worksheet thì worksheet của bạn cũng cần phải tính toán lại, điều này tác động làm chậm cho bảng tính.
Trong khi đó.
Cá Ngử F1 đã dùng Object Target.Address để xác định sự tác động nằm ở đâu thì mới chạy code, còn không thì thoát thủ tục.
Ngoài ra nếu vùng tác động lớn ta còn phải phối hợp với phương thức Intersect để xác định vùng tác động nữa kìa.
Và code của bạn chưa bao phủ trường hợp xóa ký tự Y, No thì nó sẽ như thế nào?
Cho nên chúng ta cần phải học hỏi thêm từ những bài này.
 
Mình có ý nghĩ như sau:
Nếu bạn đã đưa vào sự kiện Change của Worksheet:
Thì mỗi khi bạn thay đổi cái gì trong Worksheet thì worksheet của bạn cũng cần phải tính toán lại, điều này tác động làm chậm cho bảng tính.
Trong khi đó.
Cá Ngử F1 đã dùng Object Target.Address để xác định sự tác động nằm ở đâu thì mới chạy code, còn không thì thoát thủ tục.
Ngoài ra nếu vùng tác động lớn ta còn phải phối hợp với phương thức Intersect để xác định vùng tác động nữa kìa.
Và code của bạn chưa bao phủ trường hợp xóa ký tự Y, No thì nó sẽ như thế nào?
Cho nên chúng ta cần phải học hỏi thêm từ những bài này.
Hoàn toàn đồng ý với bạn
Cách viết của anh Cá Ngừ khá cơ bản cho những ai mới học rồi
Ngoài ra còn có If Interect(Target,[E2]) is nothing then exit sub như bạn vừa nói nữa
Nhưng theo mình nên để Field là trường thứ mấy và Criteria: điều kiện lọc là thế nào thì những ai mới học dễ hình dung hơn
 
Em cám ơn cả nhà đã quan tâm.
 
Không cần dữ liệu lại cột L
Nhập bất kỳ cái gì vào M6 đều ẩn, khi nhập N thì hiện
Khi ẩn không có dấu lọc
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> [M6].Address Then End
Cells.EntireRow.Hidden = 0
If UCase([M6]) = "N" Then End
Application.ScreenUpdating = False
Dim r As Long
For r = [I65536].End(3).Row To 10 Step -1
   If IsNumeric(Cells(r, 9)) Then
      If Cells(r, 7) + Cells(r, 9) = 0 Then
         Cells(r, 9).EntireRow.Hidden = True
      End If
   End If
Next
Application.ScreenUpdating = True
End Sub

Hi Anh Quang Hải, em thấy code của anh khá hay, nhưng em muốn lọc theo điều kiện của cột L. Anh có thể giúp em sửa được không à. Vì đôi khi em có thể sửa cột L để nó ẩn và hiện à. Em cám ơn anh.
 
Hi Anh Quang Hải, em thấy code của anh khá hay, nhưng em muốn lọc theo điều kiện của cột L. Anh có thể giúp em sửa được không à. Vì đôi khi em có thể sửa cột L để nó ẩn và hiện à. Em cám ơn anh.
Thử vầy xem
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> [M6].Address Then End
Cells.EntireRow.Hidden = 0
If UCase([M6]) = "N" Then End
Application.ScreenUpdating = False
Dim r As Long
For r = [L65536].End(3).Row To 10 Step -1
   If Cells(r, 12).Value = ChrW(7849) & "n" Then
      Cells(r, 12).EntireRow.Hidden = True
   End If
Next
Application.ScreenUpdating = True
End Sub
 
Ạ Em cám ơn anh Quang Hải rất nhiều à.
 
Web KT

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

Back
Top Bottom