Làm sao để nhận biết sheet đang hiện hành?

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,615
Được thích
16,675
Giới tính
Nam
Tôi muốn tạo một code như sau:

Nếu sheet1 active thì bỏ qua, khác thì xóa sheet, vậy code viết như thế nào vậy?
Xin các Thầy Cô, Anh Chị hướng dẫn ạ.
Cảm ơn rất nhiều.
 
Đơn giản code là vầy thôi.
Mã:
Sub xoa()
Dim wb As Worksheet
Application.DisplayAlerts = False
For Each wb In ThisWorkbook.Worksheets
If ActiveSheet.Name <> wb.Name Then
wb.Delete
End If
Next
End Sub
Thân.
 
Anh dùng lập trình sự kiện trong các Sheet đó, cẩn thận lưu lại không xóa nhầm nhé.

Mã:
Private Sub Worksheet_Activate()
    On Error Resume Next
    Application.DisplayAlerts = False
    If ActiveSheet.Name <> "Sheet1" Then
        ActiveSheet.Delete
    End If
    Application.DisplayAlerts = True
End Sub

Đầy đủ hơn là dùng sự kiện này trong Workbook, thay ActiveSheet ở trên bằng Sh.

Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)

End Sub
 
Lần chỉnh sửa cuối:
Đơn giản code là vầy thôi.
Mã:
Sub xoa()
Dim wb As Worksheet
Application.DisplayAlerts = False
For Each wb In ThisWorkbook.Worksheets
If ActiveSheet.Name <> wb.Name Then
wb.Delete
End If
Next
End Sub
Thân.
Xin lỗi lại làm phiền Po_Pikachu, nếu như các sheet không được xóa là sheet1, sheet2, sheet3 thì phải làm sao?
 
Anh dùng lập trình sự kiện trong các Sheet đó, cẩn thận lưu lại không xóa nhầm nhé.

Mã:
Private Sub Worksheet_Activate()
    On Error Resume Next
    Application.DisplayAlerts = False
    If ActiveSheet.Name <> "Sheet1" Then
        ActiveSheet.Delete
    End If
    Application.DisplayAlerts = True
End Sub

Đầy đủ hơn là dùng sự kiện này trong Workbook, thay ActiveSheet ở trên bằng Sh.

Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 
End Sub

Cho em hỏi tại sao lại dùng sự kiện "Private Sub Worksheet_Activate" này trong Macro? Em đang muốn code chạy trong Module mà?
 
Với trường hợp nhiều sheet mà biết trước là cố định thì có 2 trường hợp. Một là lấy tên sheet loại bỏ đó nếu nó it so với tổng số các sheet. Còn nếu ngược lại thì những sheet nào thỏa cần xóa thì mình xóa thôi, lúc đó điều kiện sẽ là dấu bằng và mệnh đề nối là "OR". Vậy thôi.
Đây là TH1:
Mã:
Sub xoa()
Dim wb As Worksheet
Application.DisplayAlerts = False
For Each wb In ThisWorkbook.Worksheets
If wb.Name <> "Sheet1" and wb.Name <> "Sheet2" and wb.Name <> "Sheet3" Then
wb.Delete
End If
Next
End Sub
Đây là TH2:
Mã:
Sub xoa()
Dim wb As Worksheet
Application.DisplayAlerts = False
For Each wb In ThisWorkbook.Worksheets
If wb.Name = "Sheet4" or wb.Name = "Sheet5" or wb.Name = "Sheet6" Then
wb.Delete
End If
Next
End Sub
Thân.
 
Cám ơn Po_Pikachu rất nhiều, vấn đề là sau khi mình chọn lựa các sheet không được xóa, mình chỉ xóa 1 cái sheet hiện hành khác với các sheet không cho xóa thôi, còn Code của bạn là xóa tất cả các sheet ngoài cái lựa chọn. Vậy phải làm sao?
 
Cho em hỏi tại sao lại dùng sự kiện "Private Sub Worksheet_Activate" này trong Macro? Em đang muốn code chạy trong Module mà?

Anh dùng lập trình sự kiện là hay nhất, không phải chạy code (nó tự động chạy), sửa lại code theo đúng yêu cầu của bác nhé:

Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    On Error Resume Next
    Application.DisplayAlerts = False
    If Sh.Name <> "Sheet1" and Sh.Name <> "Sheet1" and Sh.Name <> "Sheet1" Then
        Sh.Delete
    End If
    Application.DisplayAlerts = True

End Sub
 
Anh dùng lập trình sự kiện là hay nhất, không phải chạy code (nó tự động chạy), sửa lại code theo đúng yêu cầu của bác nhé:

Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    On Error Resume Next
    Application.DisplayAlerts = False
    If Sh.Name <> "Sheet1" and Sh.Name <> "Sheet1" and Sh.Name <> "Sheet1" Then
        Sh.Delete
    End If
    Application.DisplayAlerts = True
 
End Sub

Dạ, giờ em đã hiểu vấn đề của Thầy rồi ạ, nhưng yêu cầu của em đặt ra là:
Cám ơn Po_Pikachu rất nhiều, vấn đề là sau khi mình chọn lựa các sheet không được xóa, mình chỉ xóa 1 cái sheet hiện hành khác với các sheet không cho xóa thôi, còn Code của bạn là xóa tất cả các sheet ngoài cái lựa chọn. Vậy phải làm sao?
 
Anh cứ thử thì biết mà.

Nói như vầy cho các Thầy dễ hiểu, em có một File cho mọi người dùng chung, và muốn bảo vệ cấu trúc sheet, em sẽ tạo một macro, nếu có nhu cầu thêm sheet thì chạy macro:
Mã:
Sub ThemSheet()
Call MoCauTruc
Sheets.Add
Call KhoaCauTruc
End Sub

Và nếu muốn xóa 1 (chỉ 1 sheet hiện hành) trong những Sheet đã tạo mới thì dùng cái Macro này:

Mã:
Sub XoaSheet()
Call MoCauTruc
Nếu sheet hiện hành không phải là sheet không được xóa thì:
ActiveWindow.SelectedSheets.Delete
Call KhoaCauTruc
End Sub

Vậy thì viết Code XoaSheet này như thế nào?
 
Vậy thì viết Code XoaSheet này như thế nào?

Anh chỉ cần sửa đoạn code của Po picachu 1 chút là ổn (sẽ xóa sheet hiện hành ko phải là Sheet1, Sheet2, Sheet3):

Mã:
Sub xoa()
Application.DisplayAlerts = False
with Activesheet
    If .Name <> "Sheet1" and .Name <> "Sheet2" and .Name <> "Sheet3" Then
         .Delete
    End If
end with
Application.DisplayAlerts =TRue
End Sub
 
Anh chỉ cần sửa đoạn code của Po picachu 1 chút là ổn (sẽ xóa sheet hiện hành ko phải là Sheet1, Sheet2, Sheet3):

Mã:
Sub xoa()
Application.DisplayAlerts = False
with Activesheet
    If .Name <> "Sheet1" and .Name <> "Sheet2" and .Name <> "Sheet3" Then
         .Delete
    End If
end with
Application.DisplayAlerts =TRue
End Sub

Vâng, cảm ơn Thầy, bây giờ Code này mới là cái em đang cần đây.

Chúc Thầy và các Anh Chị có một đêm thật ngon giấc!
 
Vâng, cảm ơn Thầy, bây giờ Code này mới là cái em đang cần đây.

Chúc Thầy và các Anh Chị có một đêm thật ngon giấc!
Tôi không nghĩ là code này đã đáp ứng được yêu cầu của bạn. Bạn hãy kiểm tra lại tất cả các trường hợp xem sao. Vấn đề ở đây là xác định được những sheet nào đang được chọn. AcviveSheet không phải là những sheet được chọn đâu.
 
Tôi không nghĩ là code này đã đáp ứng được yêu cầu của bạn. Bạn hãy kiểm tra lại tất cả các trường hợp xem sao. Vấn đề ở đây là xác định được những sheet nào đang được chọn. AcviveSheet không phải là những sheet được chọn đâu.

Đã kiểm tra rất nhiều lần rồi Hữu Thắng à, đúng theo yêu cầu của mình đặt ra là xóa sheet hiện hành nếu sheet đó không phải "trong vùng quy hoạch".

Bạn có ý kiến gì khác không?
 
Theo tôi anh vẫn nên nghiên cứu lập trình sự kiện như đã nói, nó rất tiện đó.

Dạ, em đã lưu lại sự kiện của Thầy vào máy rồi ạ, em biết sẽ có lúc cần đến nó trong trường hợp khác. Đó cũng là một bài học mới Thầy ạ.

Em cảm ơn Thầy nhiều ạ!
 
Web KT
Back
Top Bottom