Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


22053 / 76734 ←次へ | 前へ→

【60066】Re:ログインユーザー名を判定して、ファイルへの書き込みを制御するには?
回答  ひつまぶし  - 09/1/26(月) 17:17 -

引用なし
パスワード
   ・すべてのシートをパスワード付で保護しておく。
・許可されたユーザーが開いた場合のみ、シートの保護を解除して開いてやる。
・ブックの保存のオペレーションをした場合には、
強制的に各シートへのパスワード保護をかけた上で保存するようにする。

(前提)
マクロ無効で開けば、シートの保護が有効のままで編集できないという理屈。
シートの保護パスワードは、許可されたユーザー以外は知らない前提です。

ブックモジュールに、
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

落ち度がありそうですが、ある程度希望に適いませんかね。

0 hits

【60062】ログインユーザー名を判定して、ファイルへの書き込みを制御するには? viviko 09/1/26(月) 15:36 質問
【60063】Re:ログインユーザー名を判定して、ファイ... 超初心者 09/1/26(月) 16:09 発言
【60068】Re:ログインユーザー名を判定して、ファイ... viviko 09/1/26(月) 18:04 お礼
【60065】Re:ログインユーザー名を判定して、ファイ... ひげくま 09/1/26(月) 16:16 発言
【60067】Re:ログインユーザー名を判定して、ファイ... viviko 09/1/26(月) 18:02 お礼
【60066】Re:ログインユーザー名を判定して、ファイ... ひつまぶし 09/1/26(月) 17:17 回答
【60069】Re:ログインユーザー名を判定して、ファイ... viviko 09/1/26(月) 18:07 お礼
【60070】Re:ログインユーザー名を判定して、ファイ... ひつまぶし 09/1/26(月) 18:21 回答
【60121】Re:ログインユーザー名を判定して、ファイ... viviko 09/1/28(水) 9:32 お礼
【60122】Re:ログインユーザー名を判定して、ファイ... ひつまぶし 09/1/28(水) 10:14 発言

22053 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free