|
・すべてのシートをパスワード付で保護しておく。
・許可されたユーザーが開いた場合のみ、シートの保護を解除して開いてやる。
・ブックの保存のオペレーションをした場合には、
強制的に各シートへのパスワード保護をかけた上で保存するようにする。
(前提)
マクロ無効で開けば、シートの保護が有効のままで編集できないという理屈。
シートの保護パスワードは、許可されたユーザー以外は知らない前提です。
ブックモジュールに、
Option Explicit
Const cnsOkId As String = "xxxxxxx"
Const cnsPathWd As String = "pasword"
>Private Declare Function GetUserName Lib "ADVAPI32.dll" _
> Alias "GetUserNameA" _
> (ByVal lpBuffer As String, nSize As Long) As Long
Private ColShts As Collection
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim sh As Object
'保存する時は、シートのパスワード保護をかけてから保存する。
Set ColShts = New Collection
For Each sh In Me.Sheets
If Not sh.ProtectContents Then
sh.Protect cnsPathWd
'保存後に保護解除する為保護されていなかったシートを覚えておく
ColShts.Add sh
Else
On Error Resume Next
sh.Unprotect cnsPathWd
sh.Protect cnsPathWd
On Error GoTo 0
End If
Next
Application.OnTime Now(), Me.CodeName & ".AfterSaveProc"
End Sub
'保存した後に、保護してなかったシートの保護を解除してやる。
Private Sub AfterSaveProc()
Dim sh As Object
Application.ScreenUpdating = False
For Each sh In ColShts
sh.Unprotect cnsPathWd
Next
Application.ScreenUpdating = True
Me.Saved = True
Set ColShts = Nothing
End Sub
>Private Sub Workbook_Open()
> Dim strBuffer As String
> Dim lngLngs As Long
> Dim lngRet As Long
> Dim myID As String
Dim sh As Object
>
> ' Bufferを確保
> strBuffer = String(256, Chr(0))
> lngLngs = Len(strBuffer)
>
> ' ログインユーザー名取得
> lngRet = GetUserName(strBuffer, lngLngs)
> ' Null文字の手前までを有効として表示
> myID = Left$(strBuffer, InStr(1, strBuffer, Chr(0)) - 1)
>
If myID = cnsOkId Then
'許可されたユーザーだったら、シートのパスワード保護を解除する
Application.ScreenUpdating = False
On Error Resume Next
For Each sh In Me.Sheets
sh.Unprotect cnsPathWd
Next
Application.ScreenUpdating = True
Me.Saved = True
End If
>End Sub
落ち度がありそうですが、ある程度希望に適いませんかね。
|
|