Ẩn Hiện dòng cột theo điều kiện ? (1 người xem)

  • Thread starter Thread starter KUMI
  • Ngày gửi Ngày gửi
Liên hệ QC

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

KUMI

Bụi phấn
Tham gia
17/1/12
Bài viết
564
Được thích
571
Xin chào Thầy Cô các Anh Chị!
Em đã thiệt lập xong tính năng Ẩn Hiện dòng cột theo điều kiện.

Nhưng thấy không ưng ý lắm là vì khi chọn điều kiện trong list tại các ô màu vàng rồi enter sau đó phải chỉ vào ô điều kiện thì code mới phát huy tác dụng.

Em muốn hỏi là có cách nào sau khi chọn dữ liệu trong list xong cái là code hoạt động được ngay không ạ?
 

File đính kèm

Xin chào Thầy Cô các Anh Chị!
Em đã thiệt lập xong tính năng Ẩn Hiện dòng cột theo điều kiện.

Nhưng thấy không ưng ý lắm là vì khi chọn điều kiện trong list tại các ô màu vàng rồi enter sau đó phải chỉ vào ô điều kiện thì code mới phát huy tác dụng.

Em muốn hỏi là có cách nào sau khi chọn dữ liệu trong list xong cái là code hoạt động được ngay không ạ?

bạn thử chuyển Worksheet_SelectionChange sang dùng sự kiện Worksheet_Change xem có phải vậy ko?
 
Upvote 0
Ơ,Đúng rồi! +-+-+-+
hihi,Em cảm ơn anh Phucbugis nhiều nhé!
 
Upvote 0
Ẩn Hiện dòng cột theo điều kiện khi gộp ô ?

Xin chào Thầy Cô cùng các Anh Chị!
Với dữ liệu minh họa và vấn đề vướng mắc em đã nêu trong file kèm,mong thầy cô cùng anh chị xem file rồi tìm cách giúp em với.
Em xin cảm ơn nhiều ạ!

 

File đính kèm

Upvote 0
Xin chào Thầy Cô cùng các Anh Chị!
Với dữ liệu minh họa và vấn đề vướng mắc em đã nêu trong file kèm,mong thầy cô cùng anh chị xem file rồi tìm cách giúp em với.
Em xin cảm ơn nhiều ạ!

sửa code của bạn đi 1 tý xem đúng không nhé ? copy toàn bộ code dưới thay cho code của bạn , khỏi phải dò .

Option Explicit


Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, ActiveSheet.[H7]) Is Nothing Then HideCl
If Not Intersect(Target, ActiveSheet.[f8]) Is Nothing Then HideRw
End Sub


Public Sub HideCl()
With ActiveWorkbook.Worksheets(ActiveSheet.Name)
Application.ScreenUpdating = False
If UCase(.[H7]) = "C" Then
.[I:V].EntireColumn.Hidden = False
Else
.[I:V].EntireColumn.Hidden = True
End If
Dim Cls As Long
For Cls = 9 To 22
If Cells(7, Cls) = .[H7].Value Then Cells(7, Cls).EntireColumn.Hidden = False

Next
If [H7].Value = "" Then
Columns("I:V").EntireColumn.Hidden = False
End If
Application.ScreenUpdating = True
End With
End Sub


Public Sub HideRw()
With ActiveWorkbook.Worksheets(ActiveSheet.Name)
Application.ScreenUpdating = False
If UCase(.[f8]) = "R" Then
.[9:30].EntireRow.Hidden = False
Else
.[9:30].EntireRow.Hidden = True
End If
Dim Rws As Long
For Rws = 9 To 30
If Cells(Rws, 6) = .[f8].Value Then Cells(Rws, 6).EntireRow.Hidden = False
Next
If [f8].Value = "" Then
Rows("9:30").EntireRow.Hidden = False
End If
Application.ScreenUpdating = True
End With
End Sub


 
Upvote 0
sửa code của bạn đi 1 tý xem đúng không nhé ? copy toàn bộ code dưới thay cho code của bạn , khỏi phải dò .

Option Explicit


Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, ActiveSheet.[H7]) Is Nothing Then HideCl
If Not Intersect(Target, ActiveSheet.[f8]) Is Nothing Then HideRw
End Sub


Public Sub HideCl()
With ActiveWorkbook.Worksheets(ActiveSheet.Name)
Application.ScreenUpdating = False
If UCase(.[H7]) = "C" Then
.[I:V].EntireColumn.Hidden = False
Else
.[I:V].EntireColumn.Hidden = True
End If
Dim Cls As Long
For Cls = 9 To 22
If Cells(7, Cls) = .[H7].Value Then Cells(7, Cls).EntireColumn.Hidden = False

Next
If [H7].Value = "" Then
Columns("I:V").EntireColumn.Hidden = False
End If
Application.ScreenUpdating = True
End With
End Sub


Public Sub HideRw()
With ActiveWorkbook.Worksheets(ActiveSheet.Name)
Application.ScreenUpdating = False
If UCase(.[f8]) = "R" Then
.[9:30].EntireRow.Hidden = False
Else
.[9:30].EntireRow.Hidden = True
End If
Dim Rws As Long
For Rws = 9 To 30
If Cells(Rws, 6) = .[f8].Value Then Cells(Rws, 6).EntireRow.Hidden = False
Next
If [f8].Value = "" Then
Rows("9:30").EntireRow.Hidden = False
End If
Application.ScreenUpdating = True
End With
End Sub


Xin cảm ơn anh vì đã hỗ trọ cho em ạ, nhưng có thể do em chưa diễn đạt rõ ý nên kết quả chưa như mong muốn.
em xin đính kèm hình ảnh minh họa kết quả mong muốn ạ.
Untitled.jpg
Rất mong nhận được thêm các sự trợ giúp của GPE, em xin cảm ơn.
 
Upvote 0
Hix tạm thời với côt em loay hoay mãi chỉ biết thêm 1 dòng màu đỏ , còn với dòng em cũng chưa viết được.
GPE giúp em với nhé, em xin cảm ơn!
Mã:
Public Sub HideCl()    With ActiveWorkbook.Worksheets(ActiveSheet.Name)
        Application.ScreenUpdating = False
        If UCase(.[H7]) = "C" Then
            .[I:V].EntireColumn.Hidden = False
        Else
            .[I:V].EntireColumn.Hidden = True
        End If
        Dim Cls As Long
        For Cls = 9 To 22
        If Cells(7, Cls) = .[H7].Value Then Cells(7, Cls).EntireColumn.Hidden = False
[COLOR=#ff0000]        If Cells(7, Cls) = .[H7].Value Then Cells(7, Cls).Resize(, 2).ColumnWidth = 8[/COLOR]
        Next
        Application.ScreenUpdating = True
    End With
End Sub
 
Upvote 0
Hix tạm thời với côt em loay hoay mãi chỉ biết thêm 1 dòng màu đỏ , còn với dòng em cũng chưa viết được.
GPE giúp em với nhé, em xin cảm ơn!
Mã:
Public Sub HideCl()    With ActiveWorkbook.Worksheets(ActiveSheet.Name)
        Application.ScreenUpdating = False
        If UCase(.[H7]) = "C" Then
            .[I:V].EntireColumn.Hidden = False
        Else
            .[I:V].EntireColumn.Hidden = True
        End If
        Dim Cls As Long
        For Cls = 9 To 22
        If Cells(7, Cls) = .[H7].Value Then Cells(7, Cls).EntireColumn.Hidden = False
[COLOR=#ff0000]        If Cells(7, Cls) = .[H7].Value Then Cells(7, Cls).Resize(, 2).ColumnWidth = 8[/COLOR]
        Next
        Application.ScreenUpdating = True
    End With
End Sub

Vậy thì copy cái "mớ" code sau thay cho cái cũ :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, ActiveSheet.[H7]) Is Nothing Then HideC1
If Not Intersect(Target, ActiveSheet.[f8]) Is Nothing Then HideRw
End Sub


Public Sub HideRw()
With ActiveWorkbook.Worksheets(ActiveSheet.Name)
Application.ScreenUpdating = False
If UCase(.[f8]) = "R" Then
.[9:30].EntireRow.Hidden = False
Else
.[9:30].EntireRow.Hidden = True
End If
Dim Rws As Long
For Rws = 9 To 30
If Cells(Rws, 6) = .[f8].Value Then Cells(Rws, 6).Resize(2).EntireRow.Hidden = False
Next
Application.ScreenUpdating = True
End With
End Sub


Public Sub HideC1()
With ActiveWorkbook.Worksheets(ActiveSheet.Name)
Application.ScreenUpdating = False
If UCase(.[H7]) = "C" Then
.[I:V].EntireColumn.Hidden = False
Else
.[I:V].EntireColumn.Hidden = True
End If
Dim Cls As Long
For Cls = 9 To 22
If Cells(7, Cls) = .[H7].Value Then Cells(7, Cls).Resize(, 2).EntireColumn.Hidden = False
Next
Application.ScreenUpdating = True
End With
End Sub
 
Upvote 0
Thêm 1 phương án giản đơn sau để lựa chọn
(ở đây giả định số dòng/cột merged bằng nhau)

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    On Error GoTo enD_
    
    If Not Intersect(Target, ActiveSheet.[H7]) Is Nothing Then HidenColumns
    If Not Intersect(Target, ActiveSheet.[F8]) Is Nothing Then HidenRows
    
enD_:   Application.EnableEvents = True
End Sub


Private Sub HidenRows()
    Const nR = 2 ' so rows / 1 nhom'
    Const n = 11 'so nhom dong'
    Dim i As Long
    
    
    With [F8]
        If UCase(.Value) = "R" Then
            .Offset(1).Resize(n * nR).EntireRow.Hidden = False
        Else
            .Offset(1).Resize(n * nR).EntireRow.Hidden = True
            For i = 1 To n
                If UCase(.Offset(1 + (i - 1) * nR).Value) = UCase(.Value) Then
                    .Offset(1 + (i - 1) * nR).Resize(nR).EntireRow.Hidden = False
                    Exit For
                End If
            Next i
        End If
    End With
End Sub

Private Sub HidenColumns()

    Const nC = 2 ' so cols / 1 nhom'
    Const n = 7 'so nhom'
    Dim j As Long
    
    With [H7]
        If UCase(.Value) = "C" Then
            .Offset(, 1).Resize(, n * nC).EntireColumn.Hidden = False
        
        Else
            .Offset(, 1).Resize(, n * nC).EntireColumn.Hidden = True
            For j = 1 To n
                If UCase(.Offset(, 1 + (j - 1) * nC).Value) = UCase(.Value) Then
                    .Offset(, 1 + (j - 1) * nC).Resize(, nC).EntireColumn.Hidden = False
                    Exit For
                End If
            Next j
        End If
    End With
End Sub
 
Upvote 0
Định giải thích thêm, nhưng lướt thấy KUMI đã tham gia 1 khoá VBA HN nên chắc không cần giải thích bài #9 trên, vì ở đó toàn dùng range , offset bình thường
 
Upvote 0
Em xin cảm ơn 2 người nhiều ạ,
Em đã chạy thử và kết quả test trên file kèm cũng thấy đúng với mong muốn, trong quá trình áp dụng có vấn đề gì em xin hỏi thêm ạ.
Xin cảm ơn GPE nhiều nhé.
------------------------------
Ah:
Định giải thích thêm, nhưng lướt thấy KUMI đã tham gia 1 khoá VBA HN nên chắc không cần giải thích bài #9 trên, vì ở đó toàn dùng range , offset bình thường
trước đây đúng là em có đăng kí khóa học vba của Thầy Hướng vì yêu thích nhưng tìm mãi không có lớp nên cố gắng đăng kí ạ. Hì do con nhỏ và công việc bận rộn nên em không tham ra được mà đã bảo ông xã đi rồi về truyền đạt lại nhưng xã em đi được đúng 2 buổi rồi vì bận quá nên cũng không theo được.. ngại thật.
Cảm ơn anh đã quan tâm ạ.
 
Upvote 0
Xin phép nhờ giúp đỡ thêm ạ:
Trong trường hợp em muốn chuyển việc chọn dữ liệu trong list từ cell sang ComboBox thì phải làm thế nào ạ.
Rất mong lại nhận được sự giúp đỡ.
Em xin cảm ơn.
 

File đính kèm

Upvote 0
Xin phép nhờ giúp đỡ thêm ạ:
Trong trường hợp em muốn chuyển việc chọn dữ liệu trong list từ cell sang ComboBox thì phải làm thế nào ạ.
Rất mong lại nhận được sự giúp đỡ.
Em xin cảm ơn.

Vi dụ với hàng:

vào developer / bấm Design mode

Chọn combobox,
right click --> chọn properties
LinkedCell gõ F8
ListFillRange gõ F9:F19

bấm vào Designmode để hủy chế độ này
--------
tương tự cho combobox còn lại
 
Upvote 0
Vi dụ với hàng:

vào developer / bấm Design mode

Chọn combobox,
right click --> chọn properties
LinkedCell gõ F8
ListFillRange gõ F9:F19

bấm vào Designmode để hủy chế độ này
--------
tương tự cho combobox còn lại

Hi cảm ơn anh đã giúp đỡ nhưng em thấy chạy không có tác dụng gì không biết còn phải thiết lập gì không ạ.
Còn cái combox cột em làm tương tự nó không ra list danh sách.
Với lại em gửi nhầm mẫu, phải lài mẫu gộp ô mới phải. hì anh xem file kèm nhé.
Cảm ơn rất nhiều.
 

File đính kèm

Upvote 0
Hi cảm ơn anh đã giúp đỡ nhưng em thấy chạy không có tác dụng gì không biết còn phải thiết lập gì không ạ.
Còn cái combox cột em làm tương tự nó không ra list danh sách.
Với lại em gửi nhầm mẫu, phải lài mẫu gộp ô mới phải. hì anh xem file kèm nhé.
Cảm ơn rất nhiều.

Đúng là combox Listfillrange phải theo ROW

Như thế bạn nên chuyển thành vùng (range) dọc phụ/tạm đi (vì ngay với combobox của phần các hàng nếu merged cell vậy thì dữ liệu cũng bị cách xa nhau, nên cần phải làm vùng phụ cho nó liên tục), hoặc dùng VBA đặt vào combobox list của nó

Và muốn hide hide sử dụng combobox thì phải gắn code vba (sub) vào combobox luôn, thay vì sự kiện _Change của sheet.

Nên chuyên nghiệp hóa việc code, đã dùng combobox thì dùng luôn, đã validation thì dùng luôn

Code hide row, column của bạn vẫn đang error nhé,

cuối, bạn tham gia nhiều rồi cũng biết trong Excel chúng ta nên hạn chế merged cell các ô tính toán hay điều khiển (chỉ nên đặt vào ô trang trí tiêu đề mà thôi, song cũng hạn chế) - chắc bạn quá biết điều này.

Vậy nên cần thay đổi lại cách đặt vấn đề và bố trí bảng biểu, vì bạn chỉ đưa vài dữ liệu giả quá giả luôn, nên chỉ góp ý vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng là combox Listfillrange phải theo ROW

Như thế bạn nên chuyển thành vùng (range) dọc phụ/tạm đi (vì ngay với combobox của phần các hàng nếu merged cell vậy thì dữ liệu cũng bị cách xa nhau, nên cần phải làm vùng phụ cho nó liên tục), hoặc dùng VBA đặt vào combobox list của nó

Và muốn hide hide sử dụng combobox thì phải gắn code vba (sub) vào combobox luôn, thay vì sự kiện _Change của sheet.

Nên chuyên nghiệp hóa việc code, đã dùng combobox thì dùng luôn, đã validation thì dùng luôn

Code hide row, column của bạn vẫn đang error nhé,

cuối, bạn tham gia nhiều rồi cũng biết trong Excel chúng ta nên hạn chế merged cell các ô tính toán hay điều khiển (chỉ nên đặt vào ô trang trí tiêu đề mà thôi, song cũng hạn chế) - chắc bạn quá biết điều này.

Vậy nên cần thay đổi lại cách đặt vấn đề và bố trí bảng biểu, vì bạn chỉ đưa vài dữ liệu giả quá giả luôn, nên chỉ góp ý vậy.
Cảm ơn anh đã góp ý,cũng không còn cách nào khác để thay đổi format nữa anh ạ,vì nó cũng liên quan đến cả hệ thống khác nữa...
Với file đính kèm gần nhất phiền anh có thể làm giúp em cụ thể được không ạ,, mặc dù tham gia diễn đàn khá lâu nhưng trong đầu em hiện giờ vẫn còn rất mịt mù, thật xấu hổ &&&%$R&&&%$R&&&%$R...
 
Upvote 0
Cảm ơn anh đã góp ý,cũng không còn cách nào khác để thay đổi format nữa anh ạ,vì nó cũng liên quan đến cả hệ thống khác nữa...
Với file đính kèm gần nhất phiền anh có thể làm giúp em cụ thể được không ạ,, mặc dù tham gia diễn đàn khá lâu nhưng trong đầu em hiện giờ vẫn còn rất mịt mù, thật xấu hổ &&&%$R&&&%$R&&&%$R...

Thì đơn giản bạn làm tạo 2 vùng phụ

vùng 1 gồm các dòng liền chứa các giá trị C1, C2....
vùng 2 gồm các dòng liền chứa các giá R1 , R2, ...

rồi gắn vào combobox là xong, code thì cũng vào design mode rồi double click lên combobox đó rồi gắn code vào,

Hoặc cứ giữ VALIDATION cho nó như đã có code xong,
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom