[[20050225233050]] 『マクロで、パスワードつき保護の方法』(ちゅうねん) ページの最後に飛ぶ

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

 

『マクロで、パスワードつき保護の方法』(ちゅうねん)
 マクロ初心者です。
 【やりたいこと】
 ・あるシートの列を「隠す⇔隠さない」で、「公開用⇔自分用」としたい。
 ・マクロで、できるだけ簡単に操作したい。
 【試したこと】
 ・マクロの記録で、
  マクロA:列を選択→列を非表示→シートの保護を実行(パスワードを入れる)
  マクロB:シートの保護を解除→全選択→列を表示
  を試しました。
 【できなかったので質問したいこと】
 1)マクロの記録の時にシートの保護でパスワードを入力したが、記録には反映されませんでした。
  →パスワードはどのように記述すれば良いでしょう?
 2)シートの保護をしても、マクロは(VisualBasicEditorで)参照できました。
  →パスワードを埋め込んでもそのリストを参照されると意味がなくなるので、
   マクロの参照を制限する(参照できなくする)にはどうすれば良いでしょう?
 3)誤ってマクロAを2度実行すると、エラーが発生します。
  →保護済みかどうかを判定して、保護済みなら終了する分岐を先頭に加えたいがどう記述すれば良いでしょう?

 Excel2002、WindowsXPです。
 以下に記録したマクロ(一部手修正済み)を記します。
Sub A()
    Range("B:C,E:F").Activate
    Selection.EntireColumn.Hidden = True
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFiltering:=True
    Range("A1").Select
End Sub
'
'
Sub B()
    ActiveSheet.Unprotect
    Cells.Select
    Range("D1").Activate
    Selection.EntireColumn.Hidden = False
    Range("A1").Select
End Sub

 ご教授ください。よろしくお願いします。


 こんばんは。
 以下のようなことでご希望通りになりますでしょうか。
 
Sub A()
Const MyPass As String = "aaaa" 'パスワードがaaaaの場合
 
If Range("B:C,E:F").EntireColumn.Hidden = False Then
    Range("B:C,E:F").EntireColumn.Hidden = True
End If
    ActiveSheet.Protect Password:=MyPass
    Range("A1").Select
End Sub
'
'
Sub B()
    ActiveSheet.Unprotect
    Cells.EntireColumn.Hidden = False
    Range("A1").Select
End Sub

 ※マクロAを2度実行したときのエラーは、保護があるなしではなく、
 非表示の列を再度非表示にしようとしていたからのようですね。
 非表示かどうかの分岐にしてみました。

 ひとつ抜けていました(^_^A;
 VBAの参照不可にするためには、VBEの画面でツール>VBAProjectのプロパティで
 保護タブを選択し、プロジェクトのロックにチェックを入れて、パスを設定してください。
 (川野鮎太郎)

 おはようございます。横からお邪魔します。。。
「パスワードを設定しても見られてしまう」
ということですよね?。
ちょっと別案を考えてみました。
シートにコントロールツールボックスからテキストボックスを一つ書きます。
そこに、パスワードを入力してそれを参照する様にしてはどうでしょうか?
これなら、誰からもみれません。
また、保護も
Me.Protect MyPas, , , , True
の様に設定すればマクロには保護が掛かりませんので解除の必要もありません。
ただ、パスワードを忘れると解除出来ませんので注意してください。
Option Explicit
Sub A()
Dim MyPas As String
    Me.Protect MyPas, , , , True
    MyPas = Me.TextBox1.Value
    MsgBox MyPas
    Range("B:C,E:F").EntireColumn.Hidden = True
    Range("A1").Select
End Sub
Sub B()
    Cells.Select
    Range("D1").Activate
    Selection.EntireColumn.Hidden = False
    Range("A1").Select
End Sub
Private Sub TextBox1_Change()
    Me.TextBox1.PasswordChar = "*"
End Sub
 >(1)と(2)の順番が逆だと、ブックを再度開いたときにエラーが出るようです。
 失礼!訂正しておきました。m(._.)m ペコッ
(SoulMan)


 おはようございます。
 昨日のは( -.-)ノ⌒-~ポイしてください。
 > ※マクロAを2度実行したときのエラーは、保護があるなしではなく、
 >非表示の列を再度非表示にしようとしていたからのようですね。
 >非表示かどうかの分岐にしてみました。
 間違いでした。保護が掛かっているのに表示させようとしてたからで合ってました。(^_^A;
 マクロからの操作は可能なようにすれば良かったですね。
 
Sub A()
Const MyPass As String = "aaaa"  'パスワードがaaaaの場合 
    ActiveSheet.Protect userInterfaceOnly:=True, Password:=MyPass '・・・・(1)
    Range("B:C,E:F").EntireColumn.Hidden = True          '・・・・(2)
    Range("A1").Select
End Sub
 
 (1)と(2)の順番が逆だと、ブックを再度開いたときにエラーが出るようです。
 
Sub B()
    ActiveSheet.Unprotect
    Cells.EntireColumn.Hidden = False
    Range("A1").Select
End Sub

 (川野鮎太郎)


 ひとつ気になったんですが、今回の目的はどのようなものでしょう。

 >「公開用⇔自分用」
 とのことですが、単純に非表示にした列が作業列として使っているだけとかなら良いとおもいますけど、
 人に知られたくないようなデータを隠すためとしたら、上記のようなことでは全く意味を成しません。

 仮にB,C列が非表示にしているとします。Bマクロで実行してもパスを入れないと表示できない。
 ここまでは良いのですが、A列からF列まで選択して、コピー
 別のブックやシートに貼り付けで、全部貼り付いちゃいます_/ ̄|○ il||li

 ということで、上記のパスによる表示、非表示はセキュリティを目的としたものでないことをご理解ください。

 (川野鮎太郎)ちゅうねんさんのことだから、その辺は重々お解りかもしれませんが(^_^A;

 みなさんありがとうございました。
 [川野鮎太郎]さんにご心配いただいた通り、セキュリティを意図していました。
 Excel2002には、「ロックされたセル範囲の選択」、や「ロックされていないセル範囲の選択」
 を許可しない方法があるのでこれでいけるかなぁと軽く考えていました。
 (マクロAだけでは、ここは明確になっていませんでした)…反省!
 その後検討したところ、他のシートから、あるいは別ファイルから非表示にした
 セルを参照できる(見える)ことが分かりました。
 というわけで、この非表示作戦はあきらめることとしました。

 列を削除すると参照の関係が崩れる可能性を嫌ったのですが、致し方ありません。
 列を削除して、別名のファイルを作るマクロで、「自分用→公開用」を作ろうと思います。

 回答をくださった[川野鮎太郎]さん、[SoulMan]さん、考えてくださった皆さん、
 ありがとうございました。
 (ちゅうねん)

コメント返信:

[ 一覧(最新更新順) ]


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