いたちめです。
エクセルで、必要なセル以外に触れさせたくない。
ユーザー登録しないと、利用できない様にしたい。
エクセルの「印刷」から印刷できない様にしたい。
などなど思うことが、あると思います。
使う人も作る人もストレスフリーなフォーマットを作りましょう
触って欲しいところ以外は全て、セルとシートをロックする
折角作ったのはいいけど、
触って欲しくないところってありますよね。
セルロックは、セルを右クリックしてプロパティから設定して下さい。
では、シートのロック(保護)と解除です。
Sub シートの保護を設定する()
Dim sh1 As Worksheet
Set sh1 = ThisWorkbook.Sheets(“Sheet1")
Dim パス As String
パス = “password”
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:= True, Password:=パス
End Sub
になります。
解除は後半2行を
ActiveSheet.Unprotect Password:=パス
に変更してあげるだけです。
では、なぜVBA上でロックをかけたり解除したりするのか?
という疑問があるかもしれませんが
後述する印刷の制限することで、
入力必須なセルの色塗りだとか、入力漏れの色塗りとか
印刷時に色を全て外したり
をVBA上でやってしまえるからです。
なお、このモジュールはパスワードを変数にぶちこんでますが
もちろん直でPassword:=”password”
としてもOKです。
これを作っておけば、シートがアクティブになる度に
シートを保護することもできます。
あと、余談ですが、僕は容易にパスワードが推測できない
小さな工夫をしています。
Dim パス As String
パス = sh1.Range("AA10") & sh1.Range("AA20") & sh1.Range("AA12") & sh1.Range("AA21") &sh1.Range("AA13") & …
なんじゃこれ?と思いませんか?
これは、標準モジュールをみない限り、シート毎セルをコピーしても
パスワードがわからない様にしています。
VBA自体もロックをかけるので2重ロックになります。
利用者登録しないと、エクセルを強制終了させる
作成者が名簿と仮パスワードを作って配付しても
様式エクセルファイルを利用者登録しない人もいます。
データベース化したとき、これ誰のデータ?
ってなると非常に困ります。
じゃあ、どこでもいいのでセルを指定して
その指定セル(利用者登録セル)が空欄だったら
エクセルファイルを終了させてしまいましょう。
このSUBは「利用者登録が必要なSheet」に記入します。
Private Sub Worksheet_Activate()
Dim ant As Range
Set ant = ThisWorkbook.Sheets("sheet1").Range("A1")
If ant = "" Then
antQ = MsgBox("利用者登録が完了していません。登録して下さい。", vbYesNo)
If antQ = vbYes Then
利用者登録.Show
Else
Dim WSH As Object
Set WSH = CreateObject("WScript.Shell")
WSH.Popup "本エクセルの利用を終了します", 3, "終了します", vbInformation
Set WSH = Nothing
ThisWorkbook.Close SaveChanges:=False
End If
End If
End Sub
ざっと、こんな感じです。ただ、これだけだと弱いので
一行目を変えてもう一つ作ります。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
という、セレクションチェンジを利用して、
セルをクリックなどする度に表示させるという
利用者からすると、クソ鬱陶しいことを追加しておきます。
Set ant = ThisWorkbook.Sheets("sheet1").Range("A1") のシート名とセルは
各人の都合のよいものへ変更して下さい。
俺がルールだ!印刷はこのボタンを押すしかできない!
先のセルロックとシートロックに書いた
「セルの色をVBAで指示する」
ことと
データベースにいつ印刷したか、を記録させるために
印刷一つもルール化させます。
これは「ThisWorkbook」に入力します。
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If Sheets(“sheet1”).Range(“A1”)= "" Then
MsgBox "このファイルは印刷できません。" & vbCrLf & "稟議書タブの中の印刷ボタンを押下て下さい。", vbCritical
Cancel = True
Else
Cancel = False
End If
End Sub
これだけです。
これを入力することで、ファイル→印刷の流れがストップします。
シートにフォームコントロールでボタンを設置し
印刷の流れを登録しましょう。
今回はちょっと短いですが、以上です。
難しいと感じる方がいらっしゃるかも知れません。
とりあえず、コピペから始めてみて下さい。
失敗しても、VBAに怒られるだけです。
楽しんで改良してみましょう☆