Cần tự động ẩn hàng với điều kiện dữ liệu trống

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

goodwin999

Thành viên mới
Tham gia
16/12/12
Bài viết
23
Được thích
1
Hi các bác,
Mình có file excel đính kèm. Mình đang làm việc ở sheet "NGHIEM THU". Khi mình ấn "Spin button" 1686726906788.pngthì dữ liệu tự động cập nhật theo data ở sheet "Danh muc".
1. Vấn đề thứ nhất (ưu tiên), ở đây, khi mình ấn chạy "Spin button" thì mình đang cần tự động ẩn các hàng (B78:I84) nếu hàng đó có dữ liệu trống.

1686726861808.png

2. Vấn đề thứ hai, khi mình ấn chạy "Spin button" thì mình đang cần tự động giãn (Auto Fit) các dòng B54, B74 và B78:B84 cho phù hợp với dữ liệu.
Nhờ các bác giúp đỡ. Trân trọng!
 

File đính kèm

1) Alt-F11 mở cửa số VBA, chọn sheet "NGHIEM THU", dán code ở dưới vào.
2) Bạn click chuột phải vào cái Spin Button, assign macro và chọn cái macro này nhé

PHP:
Option Explicit
Sub spinButton()
Dim cell As Range
Rows("54,74").AutoFit
Rows("78:84").AutoFit
For Each cell In Range("B78:B84")
    With cell.EntireRow
        If cell.Value = "" Then
            .Hidden = True
        Else
            .Hidden = False
        End If
    End With
Next
End Sub
 

File đính kèm

1) Alt-F11 mở cửa số VBA, chọn sheet "NGHIEM THU", dán code ở dưới vào.
2) Bạn click chuột phải vào cái Spin Button, assign macro và chọn cái macro này nhé

PHP:
Option Explicit
Sub spinButton()
Dim cell As Range
Rows("54,74").AutoFit
Rows("78:84").AutoFit
For Each cell In Range("B78:B84")
    With cell.EntireRow
        If cell.Value = "" Then
            .Hidden = True
        Else
            .Hidden = False
        End If
    End With
Next
End Sub
Cám ơn bạn nhiều lắm. Vấn đề thứ 1, ẩn hàng rất Oke rồi bạn nhé.
Còn vấn đề thứ 2, chỗ AutoFit thì thấy ko chạy theo dữ liệu thay đổi bạn à.

1686735039448.png
Chỗ hàng 83 ấy, ô C83: bị thiếu chiều cao hàng nên không hiển thị hết dữ liệu.

Phải như này mới đúng:
1686735214318.png
 
Vì ô cột C,D,E bị merge đồng thời dùng Wrap Text nên nếu dùng Autofit sẽ không có hiệu quả
Với file cụ thể này thì cần lách 1 chút: Vì 2 cột Nội dung (C) và Phương pháp (F) khống chế mức ký tự tối đa là khoảng 19 (len cell = 19), nếu vượt thì xuống dòng, và set độ cao là 51. Nếu ký tự vượt qúa mức mà đòi hỏi set thêm độ cao thì chỉnh 51 thành 70 nhé (Thấy diễn giải của bạn cũng không dài nên mình tạm để mức 51)
PHP:
 If Len(cell) > 19 Or Len(cell.Offset(0, 3)) > 19 Then .RowHeight = 51

Dù sao thì cách này chưa phải là tối ưu, vì nó chưa autofit ô bị merge, nhưng tạm chấp nhận trong file của bạn.
PHP:
Option Explicit
Sub spinButton()
Dim cell As Range
Rows("54,74").EntireRow.AutoFit
Rows("78:84").EntireRow.AutoFit
For Each cell In Range("C78:C84")
    With cell
        If cell.Value = "" Then
            .EntireRow.Hidden = True
        Else
            .EntireRow.Hidden = False
            If Len(cell) > 19 Or Len(cell.Offset(0, 3)) > 19 Then .RowHeight = 51
        End If
    End With
Next
End Sub
 
Vì ô cột C,D,E bị merge đồng thời dùng Wrap Text nên nếu dùng Autofit sẽ không có hiệu quả
Với file cụ thể này thì cần lách 1 chút: Vì 2 cột Nội dung (C) và Phương pháp (F) khống chế mức ký tự tối đa là khoảng 19 (len cell = 19), nếu vượt thì xuống dòng, và set độ cao là 51. Nếu ký tự vượt qúa mức mà đòi hỏi set thêm độ cao thì chỉnh 51 thành 70 nhé (Thấy diễn giải của bạn cũng không dài nên mình tạm để mức 51)
PHP:
 If Len(cell) > 19 Or Len(cell.Offset(0, 3)) > 19 Then .RowHeight = 51

Dù sao thì cách này chưa phải là tối ưu, vì nó chưa autofit ô bị merge, nhưng tạm chấp nhận trong file của bạn.
PHP:
Option Explicit
Sub spinButton()
Dim cell As Range
Rows("54,74").EntireRow.AutoFit
Rows("78:84").EntireRow.AutoFit
For Each cell In Range("C78:C84")
    With cell
        If cell.Value = "" Then
            .EntireRow.Hidden = True
        Else
            .EntireRow.Hidden = False
            If Len(cell) > 19 Or Len(cell.Offset(0, 3)) > 19 Then .RowHeight = 51
        End If
    End With
Next
End Sub
Cám ơn bạn nhiều!
À chỗ AutoFit còn cần ở hàng 54 và 74 nữa. Nên nhờ bạn giúp mình chỉnh code lại tối ưu nhé.
1686737910663.png
(Hàng 74 không hiển thị hết dữ liệu)
 
Hi các bác,
Mình có file excel đính kèm. Mình đang làm việc ở sheet "NGHIEM THU". Khi mình ấn "Spin button" View attachment 291420thì dữ liệu tự động cập nhật theo data ở sheet "Danh muc".
1. Vấn đề thứ nhất (ưu tiên), ở đây, khi mình ấn chạy "Spin button" thì mình đang cần tự động ẩn các hàng (B78:I84) nếu hàng đó có dữ liệu trống.

View attachment 291419

2. Vấn đề thứ hai, khi mình ấn chạy "Spin button" thì mình đang cần tự động giãn (Auto Fit) các dòng B54, B74 và B78:B84 cho phù hợp với dữ liệu.
Nhờ các bác giúp đỡ. Trân trọng!
1. Auto filter
2. Cột phụ
Đơn giản mà hiệu quả.
 
Tập viết và nghịch code bác bebo tí trong lúc chờ phương án hay hơn nhé, đây là phương án cực nông dân:
thay:
If Len(cell) > 19 Or Len(cell.Offset(0, 3)) > 19 Then .RowHeight = 51

bằng:
Select Case Application.Max(Len(cell), Len(cell.Offset(0, 3)))
' Case Is > 150'so luong ky tu trong ô
' .RowHeight = 140'chieu cao ô, ô càng nhiêu ký tu thi càng cao.

Case Is > 80
.RowHeight = 120
Case Is > 19
.RowHeight = 51
Case Else
.EntireRow.AutoFit
End Select

và tự sửa nếu có thêm kiểu khác (màu đỏ phải giảm dần từ trên xuống) trong lúc chờ đợi.
 
Việc tự động điều chỉnh chiều cao dòng thì trong GPE có code rồi, nhưng nếu nhiều dòng thì chạy khá lâu. Cách nhanh nhất là dùng 1 cột phụ có chiều rộng bằng tổng các cột gộp kia rồi dùng code Autofit các dòng.
 
Tham khảo thêm code để autofit merged rows của GPE trước đây
 
Cám ơn tất cả các bác đã giúp đỡ.
Tuy nhiên, vì "1 số lý do" nên mình không thể dùng "Spin button" trong File được nữa. Mình phải nhập tay số data vào ô H1.
Vậy giờ vẫn với 2 vấn đề mỗi lần mình nhập số thay đổi ở H1 thì cần tự động ẩn hàng trống ở những ô (B78:I84) và AutoFit (dùng cột phụ) thì cần chỉnh Code lại như thế nào vậy các bác.
Mình gửi lại File đã xóa Spin button.
 

File đính kèm

Mình xử lý được vấn đề rồi. Cám ơn tất cả các bác đã nhiệt tình giúp đỡ. Trân trọng!
 
Đang định chỉ thì xong rồi, mỗi tội máy chạy lâu quá.
Chia sẻ anh em cách làm với nào.
À mình gửi lại File mình đã sửa lại, sử dụng Code của bác Bebo + Cột phụ + Code này
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$H$1" Then
        Call ANDONG
    End If
End Sub

Vừa có Spin Button vừa có thể nhập tay vào ô H1 cũng được. Gửi các bác tham khảo và cho ý kiến. Thanks!
 

File đính kèm

Web KT

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

Back
Top Bottom