Làm sao cho các dòng tự động ẩn (hiện)

Liên hệ QC

dpsangcva

Thành viên mới
Tham gia
9/11/07
Bài viết
45
Được thích
26
Tôi có 1 bảng tính với vùng chứa dữ liệu A1:E19, trong đó ở cột A1:A19 đôi khi có 1 số ô trống kéo theo các ô khác cùng dòng với nó đều trống (như thế bảng tính sẽ không đẹp mà thêm phiền phức khác)

Tôi muốn thiết lập chế độ sao cho nếu có 1 ô nào trong vùng A1:A19 bị bỏ trống thì tự động nguyên dòng chứa ô đó Ẩn (hide) theo.

Như thế có làm được không nhờ các thầy giúp đỡ!

Thanks!
 
Tự động thì tôi không biết nhưng có thể sử dụng lệnh filer để làm việc này, dùng thêm một cột phụ để thiết lập dữ liệu cho lệnh filter. Ở ví dụ tôi chọn cột G làm cột phụ
 

File đính kèm

Có hai cách, một là nhấp bất cứ nơi nào trong khu vực A1:A19 thì nó sẽ tự ẩn. Nhưng hơi bất tiện nếu bạn muốn thay đổi dữ liệu. Thứ hai, nhấp vào 1 nơi cố định nào đó thì nó sẽ tự ẩn. Bạn xem Sheet1 và sheet2 sẽ hiểu. Code nằm trong chính Sheet đó. Muốn mở hết thì có code trong Macro đó. Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
Tôi có 1 bảng tính với vùng chứa dữ liệu A1:E19, trong đó ở cột A1:A19 đôi khi có 1 số ô trống kéo theo các ô khác cùng dòng với nó đều trống (như thế bảng tính sẽ không đẹp mà thêm phiền phức khác)

Tôi muốn thiết lập chế độ sao cho nếu có 1 ô nào trong vùng A1:A19 bị bỏ trống thì tự động nguyên dòng chứa ô đó Ẩn (hide) theo.

Như thế có làm được không nhờ các thầy giúp đỡ!

Thanks!

Bạn xem file đính kèm nhé. Có cái nút bấm đấy, hãy thử xem nhé.
 

File đính kèm

Dùng Autofilter nhanh hơn For Next vì for phải duyệt hết các ô. Khi dữ liệu nhiều, duyệt hết sẽ chậm. Muốn nhanh hơn nữa thì dùng 1 name động.
Thí dụ đặt name DS: = OFFSET(Sheet2!$A$1;0;0;MATCH(REPT("z";255);Sheet2!$A$1:$A$1000;1);5)
Sau đó là code:

PHP:
Sub MyUnhide()
Activesheet.Range("DS").Select
Selection.AutoFilter
[a1].Select
End Sub
PHP:
Sub MyHide()
    Activesheet.Range("DS").Select
       Selection.AutoFilter field:=1, Criteria1:="<>"
    [a1].Select
End Sub
 
Lần chỉnh sửa cuối:
Tiện thể mọi ng cho E hỏi, Làm thế nào để nếu trong vùng A1-E19 chỉ những dòng nào không hề có dữ liệu thì mới ẩn dòng đó, còn nếu 1 trong các ô của 1 dòng mà có dữ liệu thì k ẩn dòng đó. Bởi E thấy làm theo phương pháp lọc Filter nếu có nhiều cột thì sẽ rất lâu. E thấy phương pháp của Ca_Dafi rất hay, liệu Ca_Dafi có thể sửa lại code trong trường hợp này đc không? Thanks!
 
Đúng là AutoFilter không sử dụng được trong trường hợp này, trừ khi dùng cột phụ. Dùng theo Cadafi thì sửa code như sau:
Vẫn dùng name: DS = OFFSET(Sheet2!$A$1;0;0;MATCH(REPT("z";255);Sheet2! $A$1:$A$1000;1);5)

PHP:
Sub MyUnhide()
    ActiveSheet.Range("DS").Select
    Selection.EntireRow.Hidden = False
End Sub
PHP:
Sub MyHide()
    Dim EndR As Integer, Tmp As String, i As Integer, j As Integer
    EndR = Range("DS").Rows.Count
    For i = 1 To EndR
        For j = 1 To 5
            Tmp = Tmp & Cells(i, j)
        Next
        If Tmp = "" Then Cells(i, j).EntireRow.Hidden = True
        Tmp = ""
    Next
End Sub
 
Tiện thể mọi ng cho E hỏi, Làm thế nào để nếu trong vùng A1-E19 chỉ những dòng nào không hề có dữ liệu thì mới ẩn dòng đó, còn nếu 1 trong các ô của 1 dòng mà có dữ liệu thì k ẩn dòng đó. Bởi E thấy làm theo phương pháp lọc Filter nếu có nhiều cột thì sẽ rất lâu. E thấy phương pháp của Ca_Dafi rất hay, liệu Ca_Dafi có thể sửa lại code trong trường hợp này đc không? Thanks!

Bạn xem code của anh ptm0412 nhé, bài #7.

To ptm0412: Trong trường hợp đã biết trước vùng cần xử lý, em nghĩ chúng ta khỏi đặt Name luôn được không anh?
 
Lần chỉnh sửa cuối:
Trong trường hợp đã biết trước vùng cần xử lý, có thể khỏi đặt name, nhưng sửa dòng lệnh xác định EndR:
PHP:
EndR = Range("A1:E19").Rows.Count

Chắc Cadafi hỏi cho bạn KingHeart chứ cái này đâu có khó?
 
TheKingHeart đã viết:
Tiện thể mọi ng cho E hỏi, Làm thế nào để nếu trong vùng A1-E19 chỉ những dòng nào không hề có dữ liệu thì mới ẩn dòng đó, còn nếu 1 trong các ô của 1 dòng mà có dữ liệu thì k ẩn dòng đó.

Hoặc bạn xem đoạn code này nhé, chỉ chỉnh một tí xíu thôi.
PHP:
Sub MyHide()
    Sheets("Sheet2").[A1:A19].Select
    For Each Clls In Selection
    If Cells(Clls.Row, 1) & Cells(Clls.Row, 2) & Cells(Clls.Row, 3) & Cells(Clls.Row, 4) & Cells(Clls.Row, 5) = "" Then
    Clls.EntireRow.Hidden = True
    End If
    Next
End Sub

Xem thêm file đính kèm nữa nhé!
 

File đính kèm

Kingheart cảm ơn tất cả mọi người!
Kingheart không hiểu j về VBA cả nhưng cũng đã biết vận dụng cách mà mọi người hướng dẫn. Chỉ xin hỏi bạn Ca_dafi 1 chút nữa, làm thế nào để di chuyển cái nút Hide/Unhide ra vị trí khác hoặc sheet khác, bởi vì khi in tài liệu ra có cả cái nút đó. Mọi ng thông cảm nhé, kiến thức mình ít ỏi nên đành phải hỏi nhiều. Thanks!
 
Mình thêm 1 đoạn code trong ThisWorkbook rồi đó, mỗi khi in thì Button sẽ ẩn đi. Bạn muốn hiện lại thì vào Macro chạy code ShowButton thì nó sẽ hiện lại thôi! Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
làm thế nào để di chuyển cái nút Hide/Unhide ra vị trí khác hoặc sheet khác, bởi vì khi in tài liệu ra có cả cái nút đó. Mọi ng thông cảm nhé, kiến thức mình ít ỏi nên đành phải hỏi nhiều. Thanks!
1. Để di chuyển nút đi chỗ khác:

Bạn click chuột phải lên thanh menu chọn Control toolbox.
File1.png


Thanh control toolbox hiện ra, bạn bật chế độ Design Mode lên:
File2.png


Click chuột trái lên nút bấm đó và di chuyển thoải mái.
File3.png


2. Để khi in, không hiện ra nút bấm:

Bạn click chuột trái lên nút bấm và chọn Properties
File4.png


Tìm đến thuộc tính PrintObject và sửa lại giá trị của thuộc tính này là False
File5.png


Chúc bạn thành công.

To Po_Pikachu: Hihi, chỉ cần set thuộc tính PrintObject của commandbutton là false là được rồi bạn à!
 
Lần chỉnh sửa cuối:
Em có ý kiến thế này, Hiện nay đã có Excel 2007 mặc dù vẫn còn lỗi nhưng không thể phủ nhận các tiện ích mới của nó. Vì thế các cao thủ trong GPE nên xài thêm phiên bản này, để có j không hiểu các huynh còn chỉ bảo trên cả 2 phiên bản, chứ cứ thế này, E tìm muốn bở hơi tai trong Ex 2007. Thanks a lot!
 
Đây này! Code rất đơn giãn chứ có cần For với Next gì chứ!
Mượn file của Kiệt, tôi sửa lại code như sau:
PHP:
Sub MyHide()
    ActiveSheet.[A1:A19].SpecialCells(4).EntireRow.Hidden = True
End Sub
Để Unhide thì làm ngược lại:
PHP:
Sub MyUnhide()
     ActiveSheet.[A1:A19].EntireRow.Hidden = False
End Sub
Hoặc nếu kết hợp với Command Button thì càng dể, chỉ cần 1 sub duy nhất:
PHP:
Sub MyHide()
    DK = (ActiveSheet.CommandButton1.Caption = "Hide")
    ActiveSheet.[A1:A19].SpecialCells(4).EntireRow.Hidden = DK
End Sub
Xem file
 

File đính kèm

Lần chỉnh sửa cuối:
Đây này! Code rất đơn giãn chứ có cần For với Next gì chứ!
Mượn file của Kiệt, tôi sửa lại code như sau:
PHP:
Sub MyHide()
    ActiveSheet.[A1:A19].SpecialCells(4).EntireRow.Hidden = True
End Sub
Để Unhide thì làm ngược lại:
PHP:
Sub MyUnhide()
     ActiveSheet.[A1:A19].EntireRow.Hidden = False
End Sub
Hoặc nếu kết hợp với Command Button thì càng dể, chỉ cần 1 sub duy nhất:
PHP:
Sub MyHide()
    DK = (ActiveSheet.CommandButton1.Caption = "Hide")
    ActiveSheet.[A1:A19].SpecialCells(4).EntireRow.Hidden = DK
End Sub
Xem file

Code anh viết quả thật khiến người khác phải khâm phục. Anh có thể giải thích thêm về thuộc tính SpecialCells(i) tương ứng với từng giá trị i giúp em được không? Em cũng đang nghiên cứu về SpecialCells nhưng quả thực chưa hiểu lắm nên rất hạn chế trong việc ứng dụng vào thuật giải. Cảm ơn anh về đoạn code này!
 
Code anh viết quả thật khiến người khác phải khâm phục. Anh có thể giải thích thêm về thuộc tính SpecialCells(i) tương ứng với từng giá trị i giúp em được không? Em cũng đang nghiên cứu về SpecialCells nhưng quả thực chưa hiểu lắm nên rất hạn chế trong việc ứng dụng vào thuật giải. Cảm ơn anh về đoạn code này!
Dể lắm, cái này mày mò là ra ngay!
Kiệt bấm Ctrl + G\Special, đếm từ trên xuống, từ trái sang phải thì:
- Comments tương đương với 1
- Contants tương đương với 2
- Formats tương đương với 3

.......
vân vân...
Nếu mục chọn nào đó có tùy chọn con thì... tự tính lấy (hoặc record macro xem từng tùy chọn con tương đương với số bao nhiêu)
Đương nhiên viết rõ ràng là : xl gì gì đó có vẽ tường minh hơn nhưng thay nó thành 1 số sẽ giúp cho code ngắn gọn (lại còn có thể cho nó thành 1 biến i chạy )
Chú ý thêm: Các cửa sổ khác có các tùy chọn thì cũng sẽ theo nguyên tắc này! Ví dụ như Advanced Filter, Sort, Border, vân... vân...
 
PHP:
Sub MyHide()
DK = (ActiveSheet.CommandButton1.Caption = "Hide")
ActiveSheet.[A1:A19].SpecialCells(4).EntireRow.Hidden = DK
End Sub
Code của Ndu quả là ngắn gọn, nhưng đó là để giải quyết bài 1: hễ A3 trống thì nguyên dòng 3 sẽ trống.
Còn yêu cầu của KingHeart (bài 6) dữ liệu là 5 cột, chỉ dòng nào trống cả 5 cột mới hide, còn A trống mà từ C đến E không trống thì không hide.
 
Dùng Autofilter nhanh hơn For Next vì for phải duyệt hết các ô. Khi dữ liệu nhiều, duyệt hết sẽ chậm. Muốn nhanh hơn nữa thì dùng 1 name động.
Thí dụ đặt name DS: = OFFSET(Sheet2!$A$1;0;0;MATCH(REPT("z";255);Sheet2!$A$1:$A$1000;1);5)
Sau đó là code:

PHP:
Sub MyUnhide()
Activesheet.Range("DS").Select
Selection.AutoFilter
[a1].Select
End Sub
PHP:
Sub MyHide()
    Activesheet.Range("DS").Select
       Selection.AutoFilter field:=1, Criteria1:="<>"
    [a1].Select
End Sub

Nên đặt bẫy lỗi xíu bác ạ, nếu chưa có Filter thì set cho có, nếu có rồi nhưng ở chỗ khác thì hủy đi và set lại.

Tốt nhất vẫn là hủy đi và set lại.

Thân!

P/S : Em chỉ nói về Filter thôi chứ không nói về bài giải.
 
Web KT

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

Back
Top Bottom