2017-12-13 6 views
1

私はいくつかのワークシートを含むExcelブックを持っています。Excel - certianユーザーにワークシートの表示を制限

私がやりたいことは、ユーザフォームなどのメカニズムを持つことです。ユーザーが複数の可能なユーザのいずれかに認証されることになります。

指定されたユーザー名に基づいて、特定のワークシートを表示して他のシートを非表示にし、ユーザーが表示できないはずのワークシートにアクセスしないようにします。

誰もがExcelでこのようなことをしましたか?

任意の考えが ショーン

+0

_ "ユーザーが認証する場所..." _ - Authenticate、** how **? Active Directory?どこかハードコーディングされたリストに対して? – gravity

+0

1.ブックを読み込むときにShiftキーを押すと、マクロが無効になります。 2. Excel設定でマクロを無効にすることができます。 – JohnyL

+0

ええ、申し訳ありません、認証は、4人または5人のハードコードされたユーザーのセットに対してだけです。 – Stiley

答えて

2

私は実際にこれを入力する作業を楽しんでいました。 VBEはこのコードでは保護されていないので、何らかの保護を追加することもできますが、これは必要な処理を行う必要があります。

一般的なワークシートも作成する必要があります。これは、パスワードが入力される前に開いている唯一のシートになります。これはエラーを投げずにすべてのシートを隠すことができないので不可欠です。 (目に見えるシートが1枚必要です)。

WARNING:このコードは、軽度テストです。パスワードの忘れなど、以下のコードを使用するためのデータの損失は、お客様が負うものとします。あなたは警告されている!!

1.ワークブックを開く、その後、コールが

Option Explicit 

Private Sub Workbook_Open() 

    GetLogin 1 

End Sub 

2.ログインコード

Private Sub GetLogin(ByVal AttemptNumber As Integer) 

    Dim Sheet As Worksheet 

    With ThisWorkbook.Worksheets("Login") 
     .Visible = xlSheetVisible 
     .Activate 
    End With 

    For Each Sheet In ThisWorkbook.Sheets 
     If Not Sheet.Name = "Login" Then 
      Sheet.Visible = xlSheetVeryHidden 
     End If 
    Next Sheet 

    Dim Password As String 
    Password = Application.InputBox("Please enter your password") 

    Select Case Password 
     Case "Ma$terPas$" 
      For Each Sheet In ThisWorkbook.Sheets 
       Sheet.Visible = xlSheetVisible 
      Next Sheet 
      ThisWorkbook.Worksheets(1).Activate 'For when you hide login sheet 
     Case "Oth3Rpa$$" 
      With ThisWorkbook 
       .Worksheets(1).Visible = xlSheetVisible 
      End With 
      ThisWorkbook.Worksheets(1).Activate 'For when you hide login sheet 
     Case Else 
      If AttemptNumber <= 3 Then 
       If MsgBox("You entered an incorrect password", vbRetryCancel, "Attempt # " & AttemptNumber) = vbRetry Then 
        AttemptNumber = AttemptNumber + 1 
        GetLogin AttemptNumber 
       Else 
        ThisWorkbook.Saved = True 
        ThisWorkbook.Close 
       End If 
      Else 
       ThisWorkbook.Saved = True 
       ThisWorkbook.Close 
      End If 
    End Select 

    ThisWorkbook.Worksheets("Login").Visible = xlSheetHidden 

End Sub 

3.閉じるにgetloginするワークブック

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    If ThisWorkbook.Saved = False Then 
     If MsgBox("Would you like to save?", vbYesNo) = vbYes Then 
      ThisWorkbook.Save 
     End If 
    End If 

    Dim Sheet As Worksheet 
    With ThisWorkbook.Worksheets("Login") 
     .Visible = xlSheetVisible 
     .Activate 
    End With 

    For Each Sheet In ThisWorkbook.Sheets 
     If Not Sheet.Name = "Login" Then 
      Sheet.Visible = xlSheetVeryHidden 
     End If 
    Next Sheet 

    'Prevent from being asked to save the fact you just hid the sheets 
    ThisWorkbook.Saved = True 

End Sub 

を作ります

Workbook_OpenWorkbook_Closeがブックのモジュールに含まれていることを確認してください。

+0

ありがとう@ K.Davis私が必要としたもの。非常に感謝し、水曜日の夕方に楽しい何かをあなたに与える:-) – Stiley

2

を高く評価しているあなたは、おそらくこれはあなたがすべての人のユーザー名を見つける必要があるだろう考えると多くの仕事を取るのAuto_Openイベントにもちろん

Function Auto_Open() 
    Select Case True 
    Case InStr(Application.UserName, "Dan Smith") > 0 
     ActiveWorkbook.Sheets(1).Visible = xlSheetVeryHidden 
    Case InStr(Application.UserName, "Jon Doe") > 0 
     ActiveWorkbook.Sheets(1).Visible = True 
    End Select 
End Function 

を使用することによって、これを達成できますあなたがそれらから隠そうとしているシートが、それは私が考えたものです

+0

おかげさまで、私は別のソリューションを使いましたが、あなたが取った時間を感謝します。 – Stiley

関連する問題