Các bác giúp em : chủ đề ẩn cột theo điều kiện, nhưng với các cột đã Merge lại theo nhóm

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

thientrieuqs

Thành viên mới
Tham gia
18/8/22
Bài viết
24
Được thích
1
Em chào các bác,
Em có file theo đính kèm
Tại ô B2, em muốn tạo 1 droplist theo level: Level 3, level 4, ...
Mỗi khi chọn level tại B2, ví dụ level 3, tự động Level 3 từ F2 tới AC2 được giữ lại, còn tất cả các cột khác bị ẩn đi.
Sau khi xoá ô B2 ( B2 = "") thì các tất cả các cột đc unhide

Em nhờ các bác giúp ạ
 

File đính kèm

  • vidu.xlsm
    2.7 MB · Đọc: 2
1- Dropdown list tại B2: Bạn tự làm bằng chức năng DataValidation nhé
2- Hide cột
Dùng cái worksheet_Change event có sẵn, thêm phần hide/unhide theo điều kiện thay đổi ô B2
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, lc&
Cells.EntireColumn.AutoFit
Columns("D:D").ColumnWidth = 63.43
If Target.Address(0, 0) = "B2" Then
    lc = Cells(4, 1000).End(xlToLeft).Column
    Range("F3", Cells(3, lc)).EntireColumn.Hidden = True
    For Each cell In Range("F3", Cells(3, lc))
        If cell.MergeCells = True Then
            With cell.MergeArea.Cells(1, 1)
                If .Value = Target Then
                    .MergeArea.EntireColumn.Hidden = False
                    Exit Sub
                End If
            End With
        End If
    Next
    Range("F3", Cells(3, lc)).EntireColumn.Hidden = False
End If
End Sub
 

File đính kèm

  • vidu.xlsm
    2.7 MB · Đọc: 6
Upvote 0
Dạ em cảm ơn bác,
Em nhờ xí: Bác có thể thêm ghi chú vào code để em dễ đọc hơn không ạ :D
Còn tuỳ biến nữa ạ
 
Upvote 0
Mọi cái nó lồ lộ ra thế kia cơ mà. Không hiểu chỗ nào thì hỏi nhé.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, lc&
Cells.EntireColumn.AutoFit
Columns("D:D").ColumnWidth = 63.43
If Target.Address(0, 0) = "B2" Then ' chỉ chạy code khi ô B2 thay đổi
    lc = Cells(4, 1000).End(xlToLeft).Column ' cột cuối cùng có dữ liệu
    Range("F3", Cells(3, lc)).EntireColumn.Hidden = True ' hide toàn bộ
    For Each cell In Range("F3", Cells(3, lc)) ' duyệt từng ô trong dòng 3
        If cell.MergeCells = True Then ' nếu ô nào bị merge thì
            With cell.MergeArea.Cells(1, 1)
                If .Value = Target Then ' so sánh với B2, nấu bằng thì unhide toàn bộ vùng merge
                    .MergeArea.EntireColumn.Hidden = False
                    Exit Sub ' thoát code
                End If
            End With
        End If
    Next
    Range("F3", Cells(3, lc)).EntireColumn.Hidden = False ' khi đến bước này nghĩa là ô B2 không tìm thấy trong dòng 3:--> unhide toàn bộ
 
End If
End Sub
 
Upvote 0
1- Dropdown list tại B2: Bạn tự làm bằng chức năng DataValidation nhé
2- Hide cột
Dùng cái worksheet_Change event có sẵn, thêm phần hide/unhide theo điều kiện thay đổi ô B2
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, lc&
Cells.EntireColumn.AutoFit
Columns("D:D").ColumnWidth = 63.43
If Target.Address(0, 0) = "B2" Then
    lc = Cells(4, 1000).End(xlToLeft).Column
    Range("F3", Cells(3, lc)).EntireColumn.Hidden = True
    For Each cell In Range("F3", Cells(3, lc))
        If cell.MergeCells = True Then
            With cell.MergeArea.Cells(1, 1)
                If .Value = Target Then
                    .MergeArea.EntireColumn.Hidden = False
                    Exit Sub
                End If
            End With
        End If
    Next
    Range("F3", Cells(3, lc)).EntireColumn.Hidden = False
End If
End Sub
Em đang hiểu tuần tự như sau:
lc là last column
Xác định LC bằng cách đếm cell dòng 4 cột 1000 qua trái ( Nếu số cột em nhiều hơn 1000 thì đổi số này)
Sau đó code chạy tới: Hide toàn bộ cột từ F3 tới lc
Dùng vòng lặp For để xét từ F3 tới lc ( ví dụ em insert thì insert từ dòng 3 trở đi, k thì phải đổi 3 thành số khác tương ứng)
Nếu có merge cell ( = True) thì : Em chưa hiểu phần cell.MergeArea.Cells(1,1) lắm: Bác giảng hộ em
Nếu Value = ô B2: Unhide toàn bộ cột của vùng Merge

Em hiểu được tới đó ạ
Bài đã được tự động gộp:

Bác giúp em phát nữa:
Nếu em muốn 1 lần chọn nhiều Level để xem ( Chọn nhiều option 1 lần)
Thì nó ẩn hiện số tầng tương ứng ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu có merge cell ( = True) thì : Em chưa hiểu phần cell.MergeArea.Cells(1,1) lắm: Bác giảng hộ em
VD: ô F3:H3 là vùng merge
Ô gốc là ô F3
Nếu hiểu cell là ô gốc F3 thì:
cell.MergeArea là vùng F3:H3
cell.MergeArea.Cells(1,1) chính là ô đầu tiên của vùng merge = F3

Còn yêu cầu "Chọn nhiều Level" thì bạn phải nêu rõ: các level nằm chung trong ô B2, hay 1 level trong ô B2 và 1 trong ô B3?
Bạn đính kèm file mới theo yêu cầu này nhé
 
Upvote 0
VD: ô F3:H3 là vùng merge
Ô gốc là ô F3
Nếu hiểu cell là ô gốc F3 thì:
cell.MergeArea là vùng F3:H3
cell.MergeArea.Cells(1,1) chính là ô đầu tiên của vùng merge = F3

Còn yêu cầu "Chọn nhiều Level" thì bạn phải nêu rõ: các level nằm chung trong ô B2, hay 1 level trong ô B2 và 1 trong ô B3?
Bạn đính kèm file mới theo yêu cầu này nhé
Em cảm ơn bác nhiều vì giúp em nãy giờ
Em đang muốn: Trong ô B2, khi chọn nhiều level 1 lần thì trong ô B2 sẽ hiển thị: Level 3, Level 4, Level 5, ...
Theo bác có nên dùng kiểu combobox cho yêu cầu này không ạ
Bác hướng dẫn hộ em nhé
 

File đính kèm

  • vidu.xlsm
    2.7 MB · Đọc: 6
Upvote 0
Theo file đính kèm thì B2 chỉ cho phép chọn 1 level thôi nhé, không chọn nhiều được.
Muốn chọn nhiều thì dùng Userform và combobox nhé (Mình bận quá k làm được, nhờ bạn nào đi ngang qua làm giúp)
 
Upvote 0
Theo file đính kèm thì B2 chỉ cho phép chọn 1 level thôi nhé, không chọn nhiều được.
Muốn chọn nhiều thì dùng Userform và combobox nhé (Mình bận quá k làm được, nhờ bạn nào đi ngang qua làm giúp)
Để em làm cái uf có combobox chọn nhiều option rồi em up lên bác hộ em nhé
 
Upvote 0
Web KT

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

Back
Top Bottom