Excel VBA質問箱 IV

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

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


3802 / 13645 ツリー ←次へ | 前へ→

【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 発言[未読]

【60062】ログインユーザー名を判定して、ファイル...
質問  viviko  - 09/1/26(月) 15:36 -

引用なし
パスワード
   ご助言お願いします。
過去ログをいろいろ検索してみたのですが、
ログインユーザー名を取得する方法まではわかったのですが、
それを使って、特定のユーザーのみに編集を許可する方法がわかりません。
編集をしようとした時点でエラーメッセージが出るといいのですが。
よろしくお願いします。

Private Declare Function GetUserName Lib "ADVAPI32.dll" _
  Alias "GetUserNameA" _
  (ByVal lpBuffer As String, nSize As Long) As Long


Private Sub Workbook_Open()
  Dim strBuffer As String
  Dim lngLngs As Long
  Dim lngRet As Long
  Dim myID As String

  ' Bufferを確保
  strBuffer = String(256, Chr(0))
  lngLngs = Len(strBuffer)

  ' ログインユーザー名取得
  lngRet = GetUserName(strBuffer, lngLngs)
  ' Null文字の手前までを有効として表示
  myID = Left$(strBuffer, InStr(1, strBuffer, Chr(0)) - 1)
End Sub

【60063】Re:ログインユーザー名を判定して、ファ...
発言  超初心者  - 09/1/26(月) 16:09 -

引用なし
パスワード
   ▼viviko さん:
シートを保護して

該当ユーザーだったら、解除(&閉じる時再保護)
というのはどうでしょう

【60065】Re:ログインユーザー名を判定して、ファ...
発言  ひげくま  - 09/1/26(月) 16:16 -

引用なし
パスワード
   vivikoさんの挙げたコードをよく理解できない程度の習熟度なので、見当外れかもしれませんが・・・

ユーザーがファイルを開くときに、マクロを無効にしてしまえば、マクロで制御できなくなってしまいますが、それは考慮していますか?

【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

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

【60067】Re:ログインユーザー名を判定して、ファ...
お礼  viviko  - 09/1/26(月) 18:02 -

引用なし
パスワード
   ▼ひげくま さん:

>ユーザーがファイルを開くときに、マクロを無効にしてしまえば、マクロで制御できなくなってしまいますが、それは考慮していますか?

ファイルを開く人が、あまりPCに詳しくない人なので(許可ユーザー外の人)、
できれば開いたときに読取専用にしようかなと思ってます。
もうちょっと考えますね。
ありがとうございます!

【60068】Re:ログインユーザー名を判定して、ファ...
お礼  viviko  - 09/1/26(月) 18:04 -

引用なし
パスワード
   ▼超初心者 さん:
>シートを保護して
>
>該当ユーザーだったら、解除(&閉じる時再保護)
>というのはどうでしょう

そうですねーーー
やってみます!
ありがとうございます。

【60069】Re:ログインユーザー名を判定して、ファ...
お礼  viviko  - 09/1/26(月) 18:07 -

引用なし
パスワード
   ▼ひつまぶし さん:
おおーー
詳細なコードありがとうございます。
やってみます!!

【60070】Re:ログインユーザー名を判定して、ファ...
回答  ひつまぶし  - 09/1/26(月) 18:21 -

引用なし
パスワード
   ブックを閉じる時に保存する場合の考慮が不足してますね。
(ブックが開き直されちゃいますね。)
失礼しました。
BeforeCloseイベントにも考慮が必要です。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ret As VbMsgBoxResult
Dim sh As Object
  If Not Me.Saved Then
    ret = MsgBox("'" & Me.Name & "' への変更を保存しますか?", _
      vbYesNoCancel + vbExclamation)
    Select Case ret
    Case vbYes
      For Each sh In Me.Sheets
        If Not sh.ProtectContents Then
          sh.Protect cnsPathWd
        Else
          On Error Resume Next
          sh.Unprotect cnsPathWd
          sh.Protect cnsPathWd
          On Error GoTo 0
        End If
      Next
      Application.EnableEvents = False
      Me.Save
      Application.EnableEvents = True
    Case vbNo
      Me.Saved = True
    Case vbCancel
      Cancel = True
      Exit Sub
    End Select
  End If
End Sub


同じようなコードはまとめてプロシージャ化した方がいいかもしれません。

【60121】Re:ログインユーザー名を判定して、ファ...
お礼  viviko  - 09/1/28(水) 9:32 -

引用なし
パスワード
   ▼ひつまぶし さん:
できました!
ご丁寧な回答、ありがとうございました!!

【60122】Re:ログインユーザー名を判定して、ファ...
発言  ひつまぶし  - 09/1/28(水) 10:14 -

引用なし
パスワード
   今更で恥ずかしいのですが、
定数名のスペルが間違えていてみっともなかったです。

>Const cnsPathWd As String = "pasword"
は、
Const cnsPassWd だったでしょうか。

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