プロが教えるわが家の防犯対策術!

お世話になっております。

表題の件で ご相談が御座います。

現状、住所録のようなリストを担当者毎に名前を付けて担当者のローカルに保存してもらって
管理・入力してもらっています。(仮にbook ABC~Jとして)

そのリスト(book ABC~J)を毎日メールに添付して送信してもらい、自分の保管している大元のbookに移しています。(仮にbook「あ」とします)

その時に各担当者が おかしな入力をして寄越したら修正して送り返したいのですが
自分が いちいち全員のシート(book ABC~J)にパスワード付の保護を掛けてしまったので編集する際に保護を解除してから やらなければいけないはめになりました。

保護を掛けないのは方法の1つとしてありますが それはあまりにもリスキーなのでやりたくありません。

VBAに不可能は無いと信じておりますが マクロを実行する度にbook ABC~Jのシートの保護を解除し、閉じる時には自動的にパスワード付で保護を掛けて閉じる(アクティブになっているブックを)というような事は可能でしょうか?

イメージとしては 自分の管理するbook「あ」にVBAを登録しておき、開いている全てのブックに有効になるようにしたいと考えているのですが
どなたか お分かりになる方、ご教示いただけますでしょうか。

現在「かんプロVBA」勉強中で御座いますが「基礎編」なので色々ご迷惑をお掛けするかと存じますが
何卒宜しくお願い致します。

A 回答 (3件)

コンピューター名の説明が欠けていました、失礼いたしました。


マイコンピューターのプロパティからコンピュータ名を見れます。

ookami1969さんのPCだけでなく各担当者でも開けるようにしたければ、
Const AdminName As String = "コンピュータ名称"を変数化して、
Dim NameList As Variant
NameList = Array("PC名1", "PC名2", "PC名3")
上記のような感じであらかじめ登録しておくなどの手段があります。
dim i as long
for i = 0 to ubound(Namelist)
If ret = 0 And retstr = Namelist(i) Then
ActiveSheet.Unprotect ("abc")
End If
Next i

もしくは各担当者のコンピュータ名を同じコンピュータ名に変更してもらえばよいともいえます。
ただネットワーク参照時に見づらくなってしまいますが、共有などしていなければ手軽な方法といえます。
    • good
    • 0
この回答へのお礼

ご回答 誠にありがとう御座います。

3度も回答いただきましてありがとう御座いました。

非常に分かりやすく教えていただきまして助かりました。

ありがとう御座いました。

お礼日時:2009/01/15 16:26

ActiveSheet.Protect "abc"


ActiveSheet.Unprotect ("abc")
この"abc"がパスワードになります、現在設定されているパスワードになさってください。
解除はパスワードが違えばエラーになります。
設定ですが、すでに保護が設定されていた場合、既存の設定とパスワードが異なるとエラーになります。


このマクロは全てのブックに登録することで、管理負荷を軽減できると考えて照会したに過ぎないので、実行して全てのブックの保護を解除するものではありません。
あくまでブックを開いた時点で処理が実行され、保護を自動的に解除するものです。
そこで誰が今ブックを開いたのかを特定することで、自動解除対象者と非対象者を区別します。
ここでコンピューター名称を使用して区別しようと考えたわけです。
Const AdminName As String = "コンピュータ名称"
"コンピュータ名称"に自動解除対象にしたいコンピュータの名称を入力してください。

以上が
>ワークブックオープン時にコンピュータ名を取得し、それがあらかじめ登録していたものと等しい場合、保護を解除します。
ブック名ではなくコンピューター名なのでしょうか?
への回答です。

>悪用できるので自己の責任で管理してください。
さてこのロジックですが、VBEを起動すればパスワードが丸見えで危ないというのが弱点です。
そこでVBAの保護を行いパスワードを設定してしまえば解決できますね。

他にはこのコードを流用すれば、パスワードを忘れてしまった、シートの保護のパスワードを求めることができてしまうロジックが組めてしまう点ですね。
    • good
    • 0

悪用できるので自己の責任で管理してください。


ワークブックオープン時にコンピュータ名を取得し、それがあらかじめ登録していたものと等しい場合、保護を解除します。
セーブ前にシートを保護します。
ThisWorkBook内に貼り付けてください。

'コンピューター名の取得
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

ActiveSheet.Protect "abc", DrawingObjects:=False, Contents:=True, Scenarios:= _
False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
AllowUsingPivotTables:=True
End Sub

Private Sub Workbook_Open()
Const AdminName As String = "コンピュータ名称"
'コンピューター名取得
Dim ret As Long
Dim retstr As String * 1024
ret = GetComputerName(retstr, 1024)
If ret = 0 And retstr = AdminName Then
ActiveSheet.Unprotect ("abc")
End If

End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとう御座います。

画面で見て文章の絶妙な改行に感服致しました。

何点か疑問点が御座いますので、もしよろしければ再度回答をいただけませんでしょうか。
宜しくお願い致します。

>悪用できるので自己の責任で管理してください。
ちょっと怖いのですが、具体的には どのような事に気を付ければ良いのでしょうか?
(どのように悪用されるのかを書いてしまったら、その時点で悪用される恐れがありますが。。。)
(でも どちらにせよPGのみなさまは上記モジュールをご覧になれば分かるんですよね?)

>ワークブックオープン時にコンピュータ名を取得し、それがあらかじめ登録していたものと等しい場合、保護を解除します。
ブック名ではなくコンピューター名なのでしょうか?
また、もしコンピューター名という事であれば、それは共有フォルダ等の時と同じ名前で良かったでしょうか。
(各担当者の端末名であるという事であればどこを見れば分かるかもご教示いただきたいのですが。。。)
あと、シートに掛けてある保護パスワードは無視して保護の解除が出来てしまうのでしょうか。
もし パスワードの入力が必要なのであれば、どこに入力したら良いかもご教示いただけませんでしょうか。

とりあえず 1点目、2点目の疑問が解決しないとテストもままならない状態ですので
是非とも再回答お願い致します。

お手数お掛けしまして誠に申し訳ありません。
何卒宜しくお願い致します。

お礼日時:2009/01/14 16:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!