[[20050930211122]] 『セルの書き込み後の変更不可』(りおん) ページの最後に飛ぶ

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

 

『セルの書き込み後の変更不可』(りおん)
次のことがわかりません。初心者です。
  
@ワークシート内のセルに入力します。空白の部分もあります。
Aエクセルを閉じます。
Bエクセルを開きます。
C@で入力したセルは、変更、削除や上書きができないようにしたいのです。
Dでも他の空白セルには、入力したいのです。
Eエクセルを開いたときに、入力済みのセルの変更等がパスワードか何かでできないでしょうか。

簡単にいうと、前回入力した部分は、パスワードを知っている人以外は変更できなくて、空白部分には入力追加ができるようになればと思っています。
エクセルを閉じるまでは過去の入力セル以外の新規入力の変更できるが、いったん閉じると、次に開いたときには変更等ができないようにしたい。

VBAを勉強中です。
お願いします。


 VBA勉強中とのことなので考え方だけ。
 全セル対象にセルの書式設定で保護からロックを外す。
 全セル選択>編集>ジャンプ>セル選択>定数にチェック入れてOK後、セルの書式設定で保護からロックにチェック。
 全セル選択>編集>ジャンプ>セル選択>数式にチェック入れてOK後、セルの書式設定で保護からロックにチェック。
 これらを行った後、シートの保護

 以上をマクロの記録を行って、多少コードを修正(画面描画を停止させたり、パスを設定したり)
 出来たコードを開いたときに自動実行させる。(Auto_Open)

 (川野鮎太郎)

遅くなりました。
ちょっと作ってみました。
はじめに、保護解除し、川野様のヒントを頼りにマクロで設定しました。
セルの常駐場所は、Sheet1のB列の入力箇所の一つ下にしています。
最後に、また保護を設定しました。

 もし、よろしれば修正等あれば、また参考にさせていただきたいと思います。

Sub auto_open()

'

    Call Worksheets("入力").Unprotect(Password:="1234")

    Cells.Select
    Range("B1").Activate
    Selection.Locked = False
    Selection.FormulaHidden = True
    Selection.SpecialCells(xlCellTypeConstants, 23).Select
    Selection.Locked = True
    Selection.FormulaHidden = True
    ActiveWindow.SmallScroll Down:=-147
    Range("K4:K210,N4:N210,Q4:R210").Select
    Range("Q4").Activate
    Selection.SpecialCells(xlCellTypeFormulas, 23).Select
    Selection.Locked = True
    Selection.FormulaHidden = True
    ActiveWindow.SmallScroll Down:=117
     Range("B210").End(xlUp).Offset(1).Select
    Call Worksheets("Sheet1").Protect(Password:="1234")
End Sub


 スクロールや不要なSelectを消してみました。
 それと、マクロでは変更できるように、userInterfaceOnly:=True でパスを設定。
 SelectionをWith でくくることもできます。
 
Sub Auto_open()
Const MyPass As String = "Ayu" 
ActiveSheet.Unprotect Password:=MyPass
Cells.Locked = False
With Selection
    .SpecialCells(xlCellTypeConstants, 23).Locked = True
    .SpecialCells(xlCellTypeFormulas, 23).Locked = True
    ActiveSheet.Protect userInterfaceOnly:=True, Password:=MyPass
End With
Range("B65536").End(xlUp).Offset(1, 0).Select
End Sub

 (川野鮎太郎)

 マクロで、設定すると省略できる分があるんですね。
勉強になります。
川野様の訂正文と私の文とでは同じ結果となりました。
ありがとうございます。
 
さらに、次のように変更するには
@最終的に入力したセルは全て保護がかかっています。
A例えばE列からH列までは各列毎に別々のパスワードを設定する。
B入力する人が個別にパスワードを入力後セルの入力ができるようにする。
 何か良い方法がありますか。
C全体に保護がかかっているのに、各列毎にパスワードの設定など可能なんでしょうか。
 
 川野様 VBAを習得するのに参考となる図書等があればご紹介下さい。
 よろしくお願いします。


 ひとつ質問です。
 各列にパスワードを掛けて保護するのは、すでに入力されたセルだけでしょうか。
 それとも空白セルも含めて保護? ←この場合、最初の質問と矛盾してしまいます。

 すでに入力されたセルだけでよければ、以下のようにしてみてください。
 上記のコードも少し変更です。
 Module1のコード
Public MyPass As String
Sub Auto_Open()
MyPass = "Ayu"
ActiveSheet.Unprotect Password:=MyPass
Cells.Locked = False
With Selection
    .SpecialCells(xlCellTypeConstants, 23).Locked = True
    .SpecialCells(xlCellTypeFormulas, 23).Locked = True
    ActiveSheet.Protect userInterfaceOnly:=True, Password:=MyPass
End With
Range("B65536").End(xlUp).Offset(1, 0).Select
End Sub

 該当シートのシートモジュールに
Dim MyPass As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Const MyPass_E As String = "Ayutaro"
Const MyPass_F As String = "Rion"
Const MyPass_G As String = "Kawano"
Const MyPass_H As String = "Mufufu"
If Target.Column < 5 Or Target.Column > 8 Or Target.Value = "" Then Exit Sub
If MyPass = "" Then
    MyPass = Module1.MyPass
End If
ActiveSheet.Unprotect Password:=MyPass
Select Case Target.Column
    Case 5
        MyPass = MyPass_E
    Case 6
        MyPass = MyPass_F
    Case 7
        MyPass = MyPass_G
    Case 8
        MyPass = MyPass_H
End Select
ActiveSheet.Protect userInterfaceOnly:=True, Password:=MyPass
End Sub

 VBAの勉強は、このような掲示板や、ネット上のVBA講座が参考になりますよ。
 6回目の使いまわし。(^_^A;
[[20040915221444]]『マクロ開始のボタンの作成』(T) 

 (川野鮎太郎)

お世話になります
エクセルを立ち上げるとデバッグがでます。
If Target.Column < 4 Or Target.Column > 8 Or Target.Value = "" Thenが黄色くなっています。中断すると保護が解除されている状況です。
その後、保護をかけると、数式の入った列が書き込みが可能ができる状態で他はロックがかかっています。(すべて空白以外はロックがかかっている状況がベスト)
別にE列からH列をクリックすると「”実行時エラー1004”入力したパスワードが違っています」と出ます。
パスワード入力画面がでません
該当シートのシートモジュールはSHeet1の名前を右クリックしてコードの表示内にいれればいいんですよね。
また、E列からH列は空白セルも含めて保護(パスワード入力で書き換え可能)を考えています。
『マクロ開始のボタンの作成』は勉強になります。
ありがとうございます


 >If Target.Column < 4 Or Target.Column > 8 Or Target.Value = "" Thenが黄色くなっています。

 私が書いたものと違いますが、どこに入れられましたか?
 これがσ(^_^;)の限界っぽいです。_/ ̄|○ il||li
http://skyblue123.hp.infoseek.co.jp/Excel/Protect1.xls

 (川野鮎太郎)


わかりませーん
大変ご迷惑をおかけします。
http://skyblue123.hp.infoseek.co.jp/Excel/Protect1.xls
で内容は思うとおりなんですが、何回かパスワードによりE列からH列に入力したんですが、突然A列の入力済みの変更を行おうとすると”Ayu”で保護解除できず、E列からH列のどれかのパスワードで解除できたりするんです。また、デバッグがでて
モジュール1のActiveSheet.Unprotect Password:=MyPassが黄色くなります。
最後にE列からH列をF列からH列からF列に変更したいんですが。
いろいろ、調べたんですが だめでした。どうぞ、御指南下さい。


ありがとうございました。
VBAちょっと楽しくなりました。
また、解らなかったらご迷惑をおかけします。
                     りおん


 返事が遅くなってすいません。
 原因がわかりました。
 標準モジュールのAuto_Openのコードを以下に変えてみてお試しください。
 
Public MyPass As String
Sub Auto_Open()
MyPass = "Ayu"
ActiveSheet.Unprotect Password:=MyPass
Cells.Locked = False
Columns("E:H").Locked = True
On Error Resume Next
Application.EnableEvents = False '追加しました。
With Selection
    .SpecialCells(xlCellTypeConstants, 23).Locked = True
    .SpecialCells(xlCellTypeFormulas, 23).Locked = True
    On Error GoTo 0
    ActiveSheet.Protect userInterfaceOnly:=True, Password:=MyPass
End With
Application.EnableEvents = True '追加しました。
Range("B65536").End(xlUp).Offset(1, 0).Select
End Sub

 (川野鮎太郎)


ありがとうございます。
川野様の
http://skyblue123.hp.infoseek.co.jp/Excel/Protect1.xlsに貼り付けました。
スムースに動いていたと思っていたら、H列のパスワードを入れ、入力後I列に
移動したときにそのままI列が変更でき、また別のところに行くと保護がかかったときに
パスワードがH列の分がが必要になるようです。
また、E列からH列のpassをD列をからH列に変更するにはどうすればよいのでしょうか。
よろしくお願いします


 これではどうでしょうか。
http://skyblue123.hp.infoseek.co.jp/Excel/Protect2.xls

 (川野鮎太郎)


ありがとうございました
失礼ですけど、検証させていただきました。
結果、E列からH列でパスワードを何回かした後、
他の列に行くとE列からH列でパスワードが生きていることがあります。
その時、閉じて、立ち上げるとE列からH列のパスワードの関係でデバッグが出ます。
その時、解除するときのパスワードを探すのが大変です。
各列でセルを移動したときに”Ayu”のパスワードに戻る方法は。
また、E列からH列に変更するときは、どうすれば?

川野様よろしくお願いします


 りおんさんの言われることが再現できませんね。
 こちらでは、今までのご希望のような動きになっているような気がします。

 ※ところで、当初の質問で、>VBAを勉強中です。
 ってことだったので、考え方のアドバイスはしましたが、その後は私の作ったものを動作確認するだけで、
 勉強のべの字もお見受けできないようですが・・・。

 (川野鮎太郎)

*************************************************

ありがとうございます。
川野様に甘えてしまって、申し訳ございません。
川野様のコードを分析させていただいておりました。
 VBAの本を参考に内容をみていたのですが思うようになりませんでした。
どうも、すみません。
 標準モジュール、シートなどコードに入れることは少し解ったんですが
 どう走ってくれるか、解りませんでした。
 もう少し勉強して、質問等を行いと思います。
 また「りおん」が解らなければ教えていただきたいと思います。
 ご迷惑をおかけしました。
 なお、先ほど、川野様のProtect2を見させていただきました。
 私の希望通りに走ってくれました。
 どうもありがとうございました。
 次に、まだ解析の途中で分からない点が多々ありますが
 掲載させていただきました。
 
Public MyPass As String
パブリック変数〜モジュール先頭の宣言オプション
Sub Auto_Open()
自動立ち上げ
'Stop
MyPass = "Ayu"
パスワード設定
ActiveSheet.Unprotect Password:=MyPass
シートの保護解除 パスワードは"Ayu"
Cells.Locked = False
セル全体のロック
Columns("D:H").Locked = True
D列〜H列をロックを解放
On Error Resume Next
エラーが発生したら次のステートメントから実行する
Application.EnableEvents = False
イベントプロシージャは、これ以降 発生しなくなる。
  EnableEventsプロパティーに、一旦 Falseを設定すると、処理が終了しても ずっとFalse
  のままです。イベントプロシージャは、Trueに設定し直すまで発生することはありません。必
  要な処理が終了した後に、必ずTrueに戻す。

With Selection
複数回実行する場合はWithステートメント

    .SpecialCells(xlCellTypeConstants, 23).Locked = True
   文字列や数値など数式以外の値が入っているセルの場合 解放
   23は何か?を合計したもの
    .SpecialCells(xlCellTypeFormulas, 23).Locked = True
   数式を含むセルの場合 解放
    On Error GoTo 0
  エラー処理を無効にする
    ActiveSheet.Protect userInterfaceOnly:=True, Password:=MyPass
  マクロからの変更は可能にし、パスワードをMyPassの値を入れる
End With

Application.EnableEvents = True
元通りイベントプロシージャが発生するようする。
Range("B65536").End(xlUp).Offset(1, 0).Select
B列のデータの入力されているセルのB65536(B列の最下端)から空白のセルを見つける
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ブックを閉じる前にすること。
Dim MyPass As String
文字列の変数をMyPassに代入する
'Stop

Range("B65536").End(xlUp).Offset(1, 0).Select
B列のデータの入力されているセルのB65536(B列の最下端)から空白のセルを見つける
ActiveWorkbook.Save
エクセルブックの上書き保存
End Sub

Dim MyPass As String
文字列変数をMyPassに入れる
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
処理をしなさい−−シート上で何かがあったら何かをしなさい
Const MyPass_D As String = "Taro"
MyPassのパスワード "Taro"がはいっている
Const MyPass_E As String = "Ayutaro"
Const MyPass_F As String = "Rion"
Const MyPass_G As String = "Kawano"
Const MyPass_H As String = "Mufufu"
'With Target

' If .Column = 1 Or .Column = 3 Or .Column = 4 Or .Column > 8 Then Exit Sub
    もし、1列又は3列又は4列又は8列以上
'End With
'Stop
If MyPass = "" Then
もし、MyPass = ""が正しければ次を実行しなさい。

    MyPass = Module1.MyPass
   モジュール1のパス "Ayu"
End If
ActiveSheet.Unprotect Password:=MyPass
シートの保護を解除する
Select Case Target.Column
      新しい列の選択範囲を指定する。      
    Case 4
        MyPass = MyPass_D
    4列目のパスワードはDのパスワード"Ayutaro"

    Case 5
        MyPass = MyPass_E
    Case 6
        MyPass = MyPass_F
    Case 7
        MyPass = MyPass_G
    Case 8
        MyPass = MyPass_H
    Case Else
        MyPass = "Ayu"
    上記以外はパスワード "Ayu"です
End Select

ActiveSheet.Protect userInterfaceOnly:=True, Password:=MyPass
シートを保護する。マクロからの変更は可能にする
End Sub


コメント返信:

[ 一覧(最新更新順) ]


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