[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セルの書き込み後の変更不可』(りおん)
@ワークシート内のセルに入力します。空白の部分もあります。 Aエクセルを閉じます。 Bエクセルを開きます。 C@で入力したセルは、変更、削除や上書きができないようにしたいのです。 Dでも他の空白セルには、入力したいのです。 Eエクセルを開いたときに、入力済みのセルの変更等がパスワードか何かでできないでしょうか。
簡単にいうと、前回入力した部分は、パスワードを知っている人以外は変更できなくて、空白部分には入力追加ができるようになればと思っています。
エクセルを閉じるまでは過去の入力セル以外の新規入力の変更できるが、いったん閉じると、次に開いたときには変更等ができないようにしたい。
VBAを勉強中です。
お願いします。
VBA勉強中とのことなので考え方だけ。 全セル対象にセルの書式設定で保護からロックを外す。 全セル選択>編集>ジャンプ>セル選択>定数にチェック入れてOK後、セルの書式設定で保護からロックにチェック。 全セル選択>編集>ジャンプ>セル選択>数式にチェック入れてOK後、セルの書式設定で保護からロックにチェック。 これらを行った後、シートの保護
以上をマクロの記録を行って、多少コードを修正(画面描画を停止させたり、パスを設定したり) 出来たコードを開いたときに自動実行させる。(Auto_Open)
(川野鮎太郎)
もし、よろしれば修正等あれば、また参考にさせていただきたいと思います。
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が黄色くなっています。
私が書いたものと違いますが、どこに入れられましたか? これがσ(^_^;)の限界っぽいです。_/ ̄|○ il||li http://skyblue123.hp.infoseek.co.jp/Excel/Protect1.xls
(川野鮎太郎)
返事が遅くなってすいません。 原因がわかりました。 標準モジュールの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/Protect2.xls
(川野鮎太郎)
川野様よろしくお願いします
りおんさんの言われることが再現できませんね。 こちらでは、今までのご希望のような動きになっているような気がします。
※ところで、当初の質問で、>VBAを勉強中です。 ってことだったので、考え方のアドバイスはしましたが、その後は私の作ったものを動作確認するだけで、 勉強のべの字もお見受けできないようですが・・・。
(川野鮎太郎)
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.