Tự động ẩn dòng khi giá trị bằng 0 trong excel

Liên hệ QC

syhoang24

Thành viên mới
Tham gia
1/9/10
Bài viết
30
Được thích
5
Nghề nghiệp
Kế Toán.
Các bác ơi.
Em có một file quản lý báo giá như sau ( File đính kèm ), các phần khác thì em đã xử lý xong hết rồi, duy chỉ có phần Phiếu báo giá, em muốn khi em nhập dữ liệu và chuyển sang sheet này thì những ô không có giá trị ( bằng 0 ) trong bảng sẽ tự động ẩn đi và nếu có giá trị sẽ tự động hiện ra mà em không biết làm thế nào cả.
Em đang tự mày mò VBA nhưng chẳng biết tí gì, các bác có ai biết giúp em với em đang cần gấp lắm vì sắp tới em phải quản lý nó để báo cáo xếp rồi.
Cố gắng giúp em nha.
 

File đính kèm

  • 12.jpg
    12.jpg
    20 KB · Đọc: 695
  • Untitled.jpg
    Untitled.jpg
    20.7 KB · Đọc: 658
Chỉnh sửa lần cuối bởi điều hành viên:
Mọi người sẽ giúp bạn, nhưng chính bạn cũng phải bỏ ra 1 chút công chứ. Nếu vì riêng tư không công bố file gốc đươc, thì bạn cũng phải soạn 1 file ví dụ .
Mình đã nhiều lần vừa mất công tạo ví dụ rồi sử lý--->Không đúng do sai mẫu.
Mình gần như dám chắc khi viết xong bài này giá có file mẫu mình cũng đã sử lý xong yêu cầu của bạn
 
Các bác ơi.
Em có một file quản lý báo giá như sau ( File đính kèm ), các phần khác thì em đã xử lý xong hết rồi, duy chỉ có phần Phiếu báo giá, em muốn khi em nhập dữ liệu và chuyển sang sheet này thì những ô không có giá trị ( bằng 0 ) trong bảng sẽ tự động ẩn đi và nếu có giá trị sẽ tự động hiện ra mà em không biết làm thế nào cả.
Em đang tự mày mò VBA nhưng chẳng biết tí gì, các bác có ai biết giúp em với em đang cần gấp lắm vì sắp tới em phải quản lý nó để báo cáo xếp rồi.
Cố gắng giúp em nha.

Bạn có thể dùng AutoFilter như hình bên dưới nhé.

View attachment 52766
 

File đính kèm

  • 52.jpg
    52.jpg
    54.9 KB · Đọc: 2,725
Lần chỉnh sửa cuối:
Các bạn lưu ý:
Đây là ẩn cả dòng khi giá trị ở đâu đó bằng không, khi tính toán giá trị của nó khác 0 thì phải hiện nó ra.Vậy nó có 2 giải pháp:
1/Dùng VBA đặt vào sự kiện Active của sheet. Đại khái câu lệnh:

Mã:
...............
Dim Clls as Range
For each Clls in Range(..............)
if Clls=0 then
Rows(Clls.Row).EntierRow.Hidden=True
Else
Rows(Clls.Row).EntierRow.Hidden=False
End if
next
................
Nói chung, dùng kỹ thuật Filter cũng được nhưng nó lại vướng cái dấu tam giác trông không thích.

2/Dùng công thức kết hợp với Name hay cột phụ. Sau đó lọc sang Sheet khác (Hạ sách)
 
Cảm ơn các bác nhiều lắm, ,nhưng ý em không phải vậy vì đây là bảng giá trị in và lấy dữ liệu từ sheets khác nên em muốn nó tự động ẩn hiện.
Em gửi lại file có gì các bác giúp đỡ em nhé.

pass để mở file là : nguyenhoang
 

File đính kèm

  • Bao gia.rar
    182.9 KB · Đọc: 1,535
Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn các bác nhiều lắm, ,nhưng ý em không phải vậy vì đây là bảng giá trị in và lấy dữ liệu từ sheets khác nên em muốn nó tự động ẩn hiện.
Em gửi lại file có gì các bác giúp đỡ em nhé.

pass để mở file là : nguyenhoang
Cột D=IF(ISERROR(VLOOKUP($B19,'TD B Gia'!$F$11:$J$158,3,0)),"",VLOOKUP($B19,'TD B Gia'!$F$11:$J$158,3,0))
Vậy nếu error thì sẽ =""
Bạn dùng thử code sau:
PHP:
Sub hide()
'Hide nhung dong ma sl =""'
With Sheets("P.B giá")
  .Range("D19:D42").SpecialCells(4, 22).EntireRow.Hidden = True
End With
End Sub
Sub unhide()
'UnHide nhung dong ma sl =""'
With Sheets("P.B giá")
  .Range("D19:D42").EntireRow.Hidden = False
End With
End Sub
 
Lần chỉnh sửa cuối:
Cảm ơn các bác nhiều lắm, ,nhưng ý em không phải vậy vì đây là bảng giá trị in và lấy dữ liệu từ sheets khác nên em muốn nó tự động ẩn hiện.
Em gửi lại file có gì các bác giúp đỡ em nhé.

pass để mở file là : nguyenhoang
Theo mình hiểu thì tại sheet P.B giá, những hàng từ 19 đến 42 mà có giá trị Thành tiền (cột I) là "" thì sẽ ẩn đi. Nếu đúng thì bạn nháy chuột phải vào nhãn sheet P.B giá, chọn View code và dán code sau:
PHP:
Private Sub Worksheet_Activate()
    Dim Rng As Range
    Application.ScreenUpdating = False
    For Each Rng In [I19:I42]
        Rng.EntireRow.Hidden = Rng.Value = ""
    Next Rng
End Sub
Sau đó, bạn vào sheet TD B Gia, nhập một vài phiếu rồi quay lại sheet P.B giá xem kết quả nhé.
 
Có vẻ ý Bạn Syhoang24 muốn ô có giá trị 0 thì trắng ký tự. Nếu đúng vậy thì bạn vào Tool/Options/View bỏ chọn Zero value là được.

Nếu Bạn muốn ẩn dòng mà bất kỳ có ô nào trong dòng đó có giá trị bằng 0 thì Bạn có thể thêm cột phụ,
công thức ở cột phụ là =If(Countif(A1:**1,0)>0,0,1), sau đó dùng AutoFilter chọn giá trị 1 ở cột phụ là xong.
 
Lần chỉnh sửa cuối:
Bác nghiaphuc ơi cho em hỏi là ở sheets P. Báo giá nếu em muốn khóa và giấu công thức của mình bằng protection thi khi nhập số liệu nó bị lỗi không nhảy được. còn nếu mở pass thì ok. là sao vậy bác, tại máy tính của em có nhiều người dùng nên em không muốn người nào táy máy phá số liệu ý mà, bác giúp em tí nha.
Cảm ơn.
 
Bác nghiaphuc ơi cho em hỏi là ở sheets P. Báo giá nếu em muốn khóa và giấu công thức của mình bằng protection thi khi nhập số liệu nó bị lỗi không nhảy được. còn nếu mở pass thì ok. là sao vậy bác, tại máy tính của em có nhiều người dùng nên em không muốn người nào táy máy phá số liệu ý mà, bác giúp em tí nha.
Cảm ơn.

Khi Protect Sheet, bạn chọn thêm các thuộc tính sau:

Format cells
Format columns
Format rows

Như vậy, bạn có thể Format tất cả trên đó mà không phải sợ mất dữ liệu.

Còn không thì trong code của nghiaphuc bạn thêm như vầy:

PHP:
Private Sub Worksheet_Activate()
  ActiveSheet.Unprotect ("Learning_Excel")
  Dim Rng As Range
  Application.ScreenUpdating = False
    For Each Rng In [I19:I42]
      Rng.EntireRow.Hidden = Rng.Value = ""
    Next Rng
  ActiveSheet.Protect ("Learning_Excel")
End Sub

Với ("Learning_Excel") là password của bạn!

Nhìn vào code của NghiaPhuc tôi thấy chỉ có ẩn dòng trống tại cột I, còn giá trị = 0 thì không bị ẩn, nên tôi bổ sung lại như sau:

PHP:
Private Sub Worksheet_Activate()
  ActiveSheet.Unprotect ("Learning_Excel")
  Dim Rng As Range
  Application.ScreenUpdating = False
    For Each Rng In [I19:I42]
      If Rng.Value = "" Or Rng.Value = 0 Then Rng.EntireRow.Hidden = True
    Next Rng
  Application.ScreenUpdating = True
  ActiveSheet.Protect ("Learning_Excel")
End Sub
 
Lần chỉnh sửa cuối:
Cảm ơn các bác nhiều lắm, nhờ các bác hướng dẫn mà em có thể làm được điều mà mình mong muốn, tiếc là trình độ của em còn yếu nên chưa đóng góp được nhiều.
Cảm ơn các bác và diễn đàn.
 
Khi Protect Sheet, bạn chọn thêm các thuộc tính sau:

Format cells
Format columns
Format rows

Như vậy, bạn có thể Format tất cả trên đó mà không phải sợ mất dữ liệu.

Còn không thì trong code của nghiaphuc bạn thêm như vầy:

PHP:
Private Sub Worksheet_Activate()
  ActiveSheet.Unprotect ("Learning_Excel")
  Dim Rng As Range
  Application.ScreenUpdating = False
    For Each Rng In [I19:I42]
      Rng.EntireRow.Hidden = Rng.Value = ""
    Next Rng
  ActiveSheet.Protect ("Learning_Excel")
End Sub

Với ("Learning_Excel") là password của bạn!

Nhìn vào code của NghiaPhuc tôi thấy chỉ có ẩn dòng trống tại cột I, còn giá trị = 0 thì không bị ẩn, nên tôi bổ sung lại như sau:

PHP:
Private Sub Worksheet_Activate()
  ActiveSheet.Unprotect ("Learning_Excel")
  Dim Rng As Range
  Application.ScreenUpdating = False
    For Each Rng In [I19:I42]
      If Rng.Value = "" Or Rng.Value = 0 Then Rng.EntireRow.Hidden = True
    Next Rng
  Application.ScreenUpdating = True
  ActiveSheet.Protect ("Learning_Excel")
End Sub
Em muốn sử dụng code này. Em cũng có một bảng, em muốn ẩn dòng có giá trị tại cột H bằng 0 nhưng không dùng mật mã thì em sửa code như thế nào? Anh giúp em nhé.
 
Bạn vui lòng đọc lại bài 8 để biết cách xử lý
Em làm được rồi, nhưng file của em có khác bạn syhoang24. Em định dạng sheet sẵn để gửi cho khách hàng, sếp. Em chọn giá trị (data validation) thì các dữ liệu em cần sẽ hiện ra theo form. Nhưng khi em dùng code này. Nó mặc định cho data validation được chọn luôn. Nó không hiểu cho các giá trị chọn khác, vô tình các dòng còn lại bị ẩn đi hết khi data validation được chọn có nhiều dữ liệu hơn. Có cách nào để em áp dụng không. Vì em không hiểu code này và không biết về VBA, anh giúp em nhé.
 
Khi Protect Sheet, bạn chọn thêm các thuộc tính sau:

Format cells
Format columns
Format rows

Như vậy, bạn có thể Format tất cả trên đó mà không phải sợ mất dữ liệu.

Còn không thì trong code của nghiaphuc bạn thêm như vầy:

PHP:
Private Sub Worksheet_Activate()
  ActiveSheet.Unprotect ("Learning_Excel")
  Dim Rng As Range
  Application.ScreenUpdating = False
    For Each Rng In [I19:I42]
      Rng.EntireRow.Hidden = Rng.Value = ""
    Next Rng
  ActiveSheet.Protect ("Learning_Excel")
End Sub

Với ("Learning_Excel") là password của bạn!

Nhìn vào code của NghiaPhuc tôi thấy chỉ có ẩn dòng trống tại cột I, còn giá trị = 0 thì không bị ẩn, nên tôi bổ sung lại như sau:

PHP:
Private Sub Worksheet_Activate()
  ActiveSheet.Unprotect ("Learning_Excel")
  Dim Rng As Range
  Application.ScreenUpdating = False
    For Each Rng In [I19:I42]
      If Rng.Value = "" Or Rng.Value = 0 Then Rng.EntireRow.Hidden = True
    Next Rng
  Application.ScreenUpdating = True
  ActiveSheet.Protect ("Learning_Excel")
End Sub

Mình có thể thêm gì vào để tính cho tất cả các sheet cùng 1 lúc được không ạ. File của em có 500 sheet nên tính từng sheet 1 sẽ rất lâu
 
Mình có thể thêm gì vào để tính cho tất cả các sheet cùng 1 lúc được không ạ. File của em có 500 sheet nên tính từng sheet 1 sẽ rất lâu

Bạn có thể thay dòng này vào code

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

và đặt code trong thisworkbook
 
Bạn có thể thay dòng này vào code

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

và đặt code trong thisworkbook

Có phải ntn không ạ
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
ActiveSheet.Unprotect ("Learning_Excel")
Dim Rng As Range
Application.ScreenUpdating = False
For Each Rng In [I20:I120]
If Rng.Value = "" Or Rng.Value = 0 Then Rng.EntireRow.Hidden = True
Next Rng
Application.ScreenUpdating = True
ActiveSheet.Protect ("Learning_Excel")
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
ActiveSheet.Unprotect ("Learning_Excel")
Dim Rng As Range
Application.ScreenUpdating = False
For Each Rng In [I20:I120]
If Rng.Value = "" Or Rng.Value = 0 Then Rng.EntireRow.Hidden = True
Next Rng
Application.ScreenUpdating = True
ActiveSheet.Protect ("Learning_Excel")
End Sub


Em đã thay vào nhưng không được, anh xem giúp em với ạ, em cảm ơn anh
 
Có phải ntn không ạ
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
ActiveSheet.Unprotect ("Learning_Excel")
Dim Rng As Range
Application.ScreenUpdating = False
For Each Rng In [I20:I120]
If Rng.Value = "" Or Rng.Value = 0 Then Rng.EntireRow.Hidden = True
Next Rng
Application.ScreenUpdating = True
ActiveSheet.Protect ("Learning_Excel")
End Sub

Em đã thay vào nhưng không được, anh xem giúp em với ạ, em cảm ơn anh
Bạn sửa chỗ [I20:I120] thành Sh.[I20:I120] là được.
 
Hi Phucnghia, Code cua bạn chạy đúng đó, nhưng có thể làm cho nó tự động ẩn hiện với nhiều ròng hơn dc không, mình sửa mãi mà ko dc, với lại có vẻ Nặng lắm, làm kết quả hơi chậm
Thank's
 
Làm sao để khi Giá trị tại G10 khác 0 thì nó tự động hiện ra nhỉ các bác
Private Sub Worksheet_Activate()
Dim Rng As Range
Application.ScreenUpdating = False
For Each Rng In [G10:G10]
If Rng.Value = "" Or Rng.Value = 0 Then Rng.EntireRow.Hidden = True
Next Rng
Application.ScreenUpdating = True

End Sub
 
Web KT
Back
Top Bottom