- Tham gia
 - 30/5/06
 
- Bài viết
 - 1,798
 
- Được thích
 - 4,707
 
- Giới tính
 - Nam
 
Chào các bạn,
Như các ứng dụng tôi đã giới thiệu với các bạn trong lớp VBA về kỹ thuật để bắt buộc người sử dụng phải Enable Macro khi sử dụng file của chúng ta.
Nay tôi thấy có một module viết về vấn đề này tôi xin giới thiệu với các bạn:
Đầu tiên các bạn hãy tạo một module và chép đoạn code này vào.
	
	
	
		
Sau đó ở các thủ tục sự kiện Workbook_BeforeClose và Workbook_Open các bạn gọi các thủ tục
	
	
	
		
Lê Văn Duyệt
				
			Như các ứng dụng tôi đã giới thiệu với các bạn trong lớp VBA về kỹ thuật để bắt buộc người sử dụng phải Enable Macro khi sử dụng file của chúng ta.
Nay tôi thấy có một module viết về vấn đề này tôi xin giới thiệu với các bạn:
Đầu tiên các bạn hãy tạo một module và chép đoạn code này vào.
		Mã:
		
	
	Option Explicit
'From http://www.cpearson.com/excel/EnableMacros.aspx
Private Const C_SHEETSTATE_NAME = "SheetState"  '<<<< Tinh trang cua worksheet, cac ban co the thay doi
Private Const C_INTRO_SHEETNAME = "Start"       '<<<< Ten worksheet muon hien ra, cac ban co the thay doi
Private Const C_WORKBOOK_PASSWORD = "abc"       '<<<< Passwork cua workbook, cac ban co the thay doi
Sub SaveStateAndHide()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' SaveStateAndHide
' This is called from Workbook_BeforeClose.
' This procedure saves the Visible propreties of all worksheets
' in the workbook. This will run only if macros are enabled. It
' saves the Visible properties as a colon-delimited string, each
' element of which is the Visible property of a sheet. In the
' property string, C_INTRO_SHEETNAME is set to xlSheetVeryHidden
' so that if the workbook is opened with macros enabled, that
' sheet will not be visible. If macros are not enabled, only
' that sheet will be visible.
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim S As String
    Dim WS As Object
    Dim N As Long
    ''''''''''''''''''''''''''''''''''''''''''''
    ' Protection settings. We must be
    ' able to unprotect the workbook in
    ' order to modify the sheet visibility
    ' properties. We will restore the
    ' protection at the end of this procedure.
    ''''''''''''''''''''''''''''''''''''''''''''
    Dim HasProtectWindows As Boolean
    Dim HasProtectStructure As Boolean
    Dim HasProtection As Boolean
    '''''''''''''''''''''''''''''''''''''''''''''''
    ' Save the workbook's protection settings and
    ' attempt to unprotect the workbook.
    '''''''''''''''''''''''''''''''''''''''''''''''
    HasProtectWindows = ThisWorkbook.ProtectWindows
    HasProtectStructure = ThisWorkbook.ProtectStructure
    If (HasProtectWindows = True) Or (HasProtectStructure = True) Then
        HasProtection = True
    End If
    ThisWorkbook.Unprotect Password:=C_WORKBOOK_PASSWORD
    '''''''''''''''''''''''''''''''''''''''''''''''
    ' Make the introduction sheet visible
    '''''''''''''''''''''''''''''''''''''''''''''''
    ThisWorkbook.Worksheets(C_INTRO_SHEETNAME).Visible = xlSheetVisible
    '''''''''''''''''''''''''''''''''''''''''''''''
    ' Delete the Name. Ignore error if it doesn't
    ' exist.
    On Error Resume Next
    '''''''''''''''''''''''''''''''''''''''''''''''
    ThisWorkbook.Names(C_SHEETSTATE_NAME).Delete
    Err.Clear
    On Error GoTo 0
    For Each WS In ThisWorkbook.Sheets
        '''''''''''''''''''''''''''''''''''''''''''''''
        ' Create a string of the sheet visibility
        ' properties, separated by ':' characters.
        ' Do not put a ':' after the last sheet. Always
        ' set the visible property of the Introduction
        ' sheet to xlSheetVeryHidden. Don't put a ':'
        ' after the last sheet visible property.
        '''''''''''''''''''''''''''''''''''''''''''''''
        S = S & IIf(StrComp(WS.Name, C_INTRO_SHEETNAME, vbTextCompare) = 0, _
                    CStr(xlSheetVeryHidden), CStr(WS.Visible)) & _
                    IIf(WS.Index = ThisWorkbook.Sheets.Count, "", ":")
        '''''''''''''''''''''''''''''''''''''''''''''''
        ' If WS is the intro sheet, make it visible,
        ' otherwise make it VeryHidden. This sets all
        ' sheets except C_INTRO_SHEETNAME to very
        ' hidden.
        '''''''''''''''''''''''''''''''''''''''''''''''
        If StrComp(WS.Name, C_INTRO_SHEETNAME, vbTextCompare) = 0 Then
            WS.Visible = xlSheetVisible
        Else
            WS.Visible = xlSheetVeryHidden
        End If
    Next WS
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Save the property string in a defined name.
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ThisWorkbook.Names.Add Name:=C_SHEETSTATE_NAME, RefersTo:=Chr(39) & S, Visible:=False
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Set the workbook protection back to what it was.
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    If HasProtection = True Then
        With ThisWorkbook
            If .HasPassword = True Then
                .Protect Password:=C_WORKBOOK_PASSWORD
            Else
                .Protect
            End If
        End With
    End If
End Sub
Sub UnHideSheets()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' UnHideSheets
' This is called by Workbook_Open to hide the introduction sheet
' and set all the other worksheets to their visible state that
' was stored when the workbook was last closed. The introduction
' sheet is set to xlSheetVeryHidden. This maro is executed only
' is macros are enabled. If the workbook is opened without
' macros enabled, only the introduction sheet will be visible.
' If an error occurs, make the intro sheet visible and get out.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim S As String
    Dim N As Long
    Dim VisibleArr As Variant
    Dim HasProtectWindows As Boolean
    Dim HasProtectStructure As Boolean
    Dim HasProtection As Boolean
    
    '''''''''''''''''''''''''''''''''''''''''''''''
    ' Save the workbook's protection settings and
    ' attempt to unprotect the workbook.
    '''''''''''''''''''''''''''''''''''''''''''''''
    HasProtectWindows = ThisWorkbook.ProtectWindows
    HasProtectStructure = ThisWorkbook.ProtectStructure
    
    If (HasProtectWindows = True) Or (HasProtectStructure = True) Then
        HasProtection = True
    End If
    ThisWorkbook.Unprotect Password:=C_WORKBOOK_PASSWORD
    
    On Error GoTo ErrHandler:
    Err.Clear
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Get the defined name that contains the sheet visible
    ' properties and clean up the string.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    S = ThisWorkbook.Names(C_SHEETSTATE_NAME).RefersTo
    S = Mid(S, 4, Len(S) - 4)
    
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Set VisibleArr to an array of the visible properties,
    ' one element per worksheet.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    If InStr(1, S, ":", vbBinaryCompare) = 0 Then
        VisibleArr = Array(S)
    Else
        VisibleArr = Split(S, ":")
    End If
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Loop through the array and set the Visible propety
    ' for each sheet.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    For N = LBound(VisibleArr) To UBound(VisibleArr)
        ThisWorkbook.Sheets(N - LBound(VisibleArr) + 1).Visible = CLng(VisibleArr(N))
    Next N
    
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Set the workbook protection back to what it was.
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    If HasProtection = True Then
        With ThisWorkbook
            If .HasPassword = True Then
                .Protect Password:=C_WORKBOOK_PASSWORD
            Else
                .Protect
            End If
        End With
    End If
    
    Exit Sub
    
ErrHandler:
    ThisWorkbook.Worksheets(C_INTRO_SHEETNAME).Visible = xlSheetVisible
    
End Sub
	Sau đó ở các thủ tục sự kiện Workbook_BeforeClose và Workbook_Open các bạn gọi các thủ tục
		Mã:
		
	
	Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ''''''''''''''''''''''''''''''''''''''''''''''''
    ' Lưu tình trạng visibility của các worksheet
    ' và dấu tất cả các worksheet ngoại trừ worksheet introduction
    ''''''''''''''''''''''''''''''''''''''''''''''''
    SaveStateAndHide
End Sub
Private Sub Workbook_Open()
    ''''''''''''''''''''''''''''''''''''''''''''''''
    ' Unhide các worksheet. Sự kiện này 
    ' chỉ thực hiện khi Enable Macro
    ''''''''''''''''''''''''''''''''''''''''''''''''
    UnHideSheets
End Sub
	Lê Văn Duyệt
			
				Lần chỉnh sửa cuối: 
			
		
	
								
								
									
	
								
							
							
	
	  
