[[20111106151907]] 『VBAによるセル入力制限について』(ひよ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAによるセル入力制限について』(ひよ)

 VBAでこのような事は可能でしょうか。

 1.通常にエクセルを開くと全てのセルに保護がかかっていて誰も触れない
 2.入力ボックスが起動し、パスワードAを入力するとセルA1〜A3に入力できる

 更に、このパスワードはA、B、C、Dとあり、
 パスワードごとに 入力できるセルが変更される。
 例えば、Aと入力された場合はA1〜A3に入力可能ですが、
 Bと入力された場合にはB10〜B13に入力可能
 Cと入力された場合にはB16、B20に入力可能
 Dと入力された場合には全てのセルが入力可能となる

 3.入力が終了すると、また全てのセルに保護をかけ誰も触れない状態で保存される。

 これをマクロの記録でやってみたのですが、
 シートの保護とセルのロックの組み合わせで保護されているようで、
 権限によって入力可能なセルを分ける、ということが出来ないようにも思えます。

 エクセルに最初から組み込まれた、上記の方法でなくVABコードによって、
 パスワードを入力させ、その値によって入力制限をかけることは可能でしょうか。
 どうぞ宜しくお願い致します。
  (ひよ)


 >これをマクロの記録でやってみたのですが、
 >シートの保護とセルのロックの組み合わせで保護されているようで、
 >権限によって入力可能なセルを分ける、ということが出来ないようにも思えます。

 うんにゃ、できるよ。
そもそも、シート保護の前に、セルの保護というものがある。(セルの書式設定)
初期は、すべてのセルが「保護」つまり「入力できない」、だけど入力できるのは、このセルの保護は
シートが保護されて初めて有効になるから。

 なので、
・まずInputBoxあたりでパスワードを入れさせて
・セルをすべて選んで、セル書式で「保護」
・次にパスワード毎に入力可能にしたい領域を選んで、セル書式で「非保護」
・こうした上でシートに保護をかける。

 なお、このシートは、基本的には、全セル保護でシート保護をかけておいて
 上記処理はWorkbook_Openあたりでシート保護をはずした上で実行。
 さらに、最後にWOrkbook_BeforeSave あたりで、もう一度
・シート保護をはずして
・全セルを保護にして
・シート保護

 追記)
 >上記処理はWorkbook_Openあたりでシート保護をはずした上で実行。
 あるいは、InputBoxを表示するマクロを呼び出してしょりさせてもいいね。
 そちらのほうが、要件にあうのかも。

 さらに追記)シート保護のUserInterfaceOnlyパラメータを使うと、上記より、少しすっきりした
構えにもできるけど、なずは、上記のような形で、がんばってみない?

 (ぶらっと)

 なかなかうまくいきません。
 Sub auto_open()

    Dim pas As String
    Dim ipas As String

    pas = Application.InputBox("パスワードは?", "パスワード入力", "")

    If pas = "1" Then
        ActiveSheet.Unprotect
        Range("C6,E6,G6").Locked = False
        Range("C6,E6,G6").FormulaHidden = False

' ipas = Application.InputBox("C6に入力してください", "入力", "")
' Range("C6").Value = ipas

' Cells.Select
' ActiveSheet.Unprotect
' Selection.Locked = True
' Selection.FormulaHidden = False
' ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
'

' ElseIf pas = "2" Then
'
' Else
' ThisWorkbook.Close False

    End If

 End Sub

 Sub Auto_Close()

    Cells.Select
    ActiveSheet.Unprotect
    Selection.Locked = True
    Selection.FormulaHidden = False
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

 End Sub

 とりあえずパスワード1だけでやってみましたが
 入力する時にはすべてのセルに入力できてしまいます。。。
 具体的に、どのようなコードを書けばよいか
 ご指南いただければと思います。
 よろしくお願い致します。 
 (ひよ)


 たとえば一例。
なお、当該のシートは、あらかじめ、全セルを保護にして、シート保護で、必要な許可条件を設定しておいて。
以下の例では、シート保護のパスワードを "abcd" にしている。
ここは別のパスワードでもパスワードなしでも、そちらの要件にあわせてなおしてね。
また、対象のシートを"Sheet1"にしている。ここも、実際のシート名に。

 ThisWorkbookモジュール

 Private Sub Workbook_Open()
    Sheets("Sheet1").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="abcd", UserInterfaceOnly:=True
 End Sub

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Sheets("Sheet1").Cells.Locked = True
 End Sub

 標準モジュール

 Sub シート保護()
    Dim pwd As String
    Dim myR As Range
    Dim ok As Boolean
    ok = True
    pwd = Application.InputBox("パスワードを入力してください", Type:=2)
    With Sheets("Sheet1")  '対象シート
        Select Case pwd
            Case "A"
                Set myR = .Range("A1:A3")
            Case "B"
                Set myR = .Range("B10:B13")
            Case "C"
                Set myR = .Range("B16,B20")
            Case "D"
                Set myR = .Cells
            Case Else
                ok = False
        End Select
        If Not ok Then
            MsgBox "正しいパスワードを入れてください"
        Else
            .Cells.Locked = True
            myR.Locked = False
        End If
    End With
 End Sub

 追記)上記コードは、開いた時点では、全セル入力不可。
   シート保護 プロシジャを呼び出して(ショートカットとかマクロボタンとかで)
   必要なパスワードを入力させて、それに応じたセルが入力可能になる。

 (ぶらっと)

 ぶらっとさん、ありがとうございました!
 イメージどおりのブックが出来上がりました!
 できないと諦めかけていたのに感涙です。。。
 本当にありがとうございました<m(__)m>
 (ひよ)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.