Chỉ hiện các sheet theo điều kiện các sheet còn lại thì ẩn đi

Liên hệ QC

Son-Thuy

Thành viên chính thức
Tham gia
15/8/19
Bài viết
65
Được thích
5
Các bạn giúp tôi trong trường hợp sau:
Tôi có 1 file có rất nhiều sheet, trong đó
1/ Có rất nhiều sheet mang mã cửa hàng : 001, 011 ...
2/ Và 1 sheet tên TH, trong đó cột B mang mã cửa hàng : 001, 011 ...và cột A là thứ mấy sẽ đến làm việc (từ thứ 2 đền thứ 7)
Yêu cầu: khi nhập số 2 vào ô A1 của sheet TH, thì chỉ hiện những sheet của ngày thứ hai như: 001, 007, 1001 và sheet TH, các sheet còn lại thì sẽ ẩn hết
Ví dụ khi nhập số 7 vào ô A1 của sheet TH, thì chỉ hiện những sheet của ngày thứ bảy như: 0079, 123654987 và sheet TH, các sheet còn lại thì sẽ ẩn hết
Mong các bạn hỗ trợ. Xin cảm ơn các bạn!
 

File đính kèm

  • Hien-An-Sheet.xlsm
    13.3 KB · Đọc: 10
Gửi lại bạn tham khảo
 

File đính kèm

  • Hien-An-Sheet.xlsm
    32.3 KB · Đọc: 15
Upvote 0
Gửi lại bạn tham khảo
Cảm ơn các bạn đã hỗ trợ
Từ code của bạn tôi đã áp dụng vào trong File nhưng vẫn chưa được, cụ thể:
Khi chạy code nó báo lỗi:
Run - time error 9
Subsript out of range

ở dòng
Sheets(Range("B" & i).Value).Visible = 0
Tối hôm qua, tôi đã dò tìm nhưng vẫn chưa biết tại sao lỗi
Nhờ các bạn xem file và hỗ trợ, xin cảm ơn
 

File đính kèm

  • SOS-Tam.xlsm
    36.1 KB · Đọc: 6
Upvote 0
Lỗi do không tìm thấy tên SHEET thôi bạn. Mình gửi lại bạn nhé
 

File đính kèm

  • SOS-Tam.xlsm
    42.8 KB · Đọc: 10
Upvote 0
Nhờ các bạn xem tại sao nó chạy sai
cụ thể A1 của TH thay đổi thì số lượng sheet ra nhiều hơn hoặc ít hơn so với list danh sách
Code ẩn và hiện sheet không bị làm sao đâu bạn ạ, code ở sheet "TH" của bạn hình như có vấn đề.
 
Upvote 0
Tôi nghĩ có thể vấn đề ở chỗ đó, nhờ các bạn giúp giùm!
Code ẩn, hiện sheet;
Mã:
Sub UnHidesheet()
    Dim i As Long
    Dim Rng As Long
        For i = 3 To Range("A65536").End(3).Row
        If Range("A" & i).Value = Range("A1").Value Then
            Sheets(CStr(Range("B" & i).Value)).Visible = 1
        End If
    Next
End Sub
Sub Hidesheet()
    Dim wks As Worksheet
    For Each wks In Worksheets
        If wks.Name <> "TH" Then
            wks.Visible = 0
        End If
    Next
End Sub
Và code của sheet("TH")
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim EndR As Long
    EndR = Range("A" & Rows.Count).End(xlUp).Row
    If Target.Address <> "$A$1" Then Exit Sub

    Call Hidesheet
    Application.EnableEvents = False
    Application.ScreenUpdating = False

    Range("A3:A" & EndR).AutoFilter Field:=1, Criteria1:=Range("$A$1").Text, Operator:=xlFilterValues
    Call UnHidesheet
    Application.ScreenUpdating = True
    Application.EnableEvents = True

End Sub
 
Upvote 0
Tôi nghĩ có thể vấn đề ở chỗ đó, nhờ các bạn giúp giùm!

Bạn thử đoạn code bên dưới (eo..sao mà dài dữ vậy) xem:

Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.count > 1 Then Exit Sub
    If Target.Address <> "$A$1" Then Exit Sub
    
    Dim r As Long, aloc(), rng As Range
    Me.Columns("A:A").EntireRow.Hidden = False
    r = Me.Cells(Me.Rows.count, "A").End(xlUp).Row
    If r < 3 Then Exit Sub
    
    On Error GoTo End_
    
    Speed_up True
    
    Set rng = Me.Range("A3:A" & r)
    rng.EntireRow.Hidden = True
 
    aloc = Me.Range("A1").Resize(r, 2)
    Set rng = Hide_Row(aloc, Target.Value)
    If Not rng Is Nothing Then rng.EntireRow.Hidden = False
    
    Dim book As Workbook, count As Long
    Set book = ThisWorkbook
    count = book.Worksheets.count
    
    AnSheet book, count
    HienSheet book, aloc, Target.Value, count
    
End_:
    Speed_up False
    
End Sub

Private Function Hide_Row(ByRef aloc(), ByVal Target As String) As Range
    Dim i As Long, k As Long, rng As Range
    For i = 3 To UBound(aloc, 1)
        If CStr(aloc(i, 1)) = Target Then
            Set rng = Cells(i, 1)
            If Not Hide_Row Is Nothing Then
                Set Hide_Row = Union(Hide_Row, rng)
            Else
                Set Hide_Row = Cells(i, 1)
            End If
        End If
    Next i
End Function

Private Sub AnSheet(book As Workbook, ByVal count As Long)
    Dim i As Long, shName As String, asheet()
    If count = 1 Then Exit Sub
    If Not Me.Visible = xlSheetVisible Then _
    Me.Visible = xlSheetVisible
    For i = 1 To count
        shName = Sheets(i).Name
        If SheetExists(book, shName) Then
            If shName <> Me.Name Then
                Sheets(shName).Visible = xlSheetHidden
            End If
        End If
    Next i
End Sub

Private Sub HienSheet(book As Workbook, ByRef aloc(), ByVal Target As String, ByVal count As Long)
    Dim i As Long, r As Long, asheet(), shName As String, sName As String
    ReDim asheet(1 To count)
    For r = 1 To UBound(aloc, 1)
        If CStr(aloc(r, 1)) = Target Then
            sName = aloc(r, 2)
            For i = 1 To count
                shName = Sheets(i).Name
                If SheetExists(book, shName) Then
                    If shName <> sName Then
                        Sheets(shName).Visible = xlSheetVisible
                    End If
                End If
            Next i
        End If
    Next r
End Sub

Public Function SheetExists(book As Workbook, sheetname As String) As Boolean
    Dim sht As Worksheet
    SheetExists = False
    For Each sht In book.Worksheets
        If sheetname = sht.Name Then
            SheetExists = True
            Exit Function
        End If
    Next
End Function

Public Function check_hide_sheet(book As Workbook, sheetname As String) As Boolean
    Dim sht As Worksheet
    Set sht = book.Worksheets(sheetname)
    If Not sht.Visible = xlSheetVisible Then
        check_hide_sheet = True
    Else
        check_hide_sheet = False
    End If
End Function

Public Function Speed_up(bln As Boolean)
    With Application
        .ScreenUpdating = Not (bln)
        .DisplayAlerts = Not (bln)
        .Calculation = IIf(bln, xlCalculationManual, xlCalculationAutomatic)
    End With
End Function
 
Upvote 0
Web KT

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

Back
Top Bottom