[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セルの書き込み後の変更不可』(りおん)
@ワークシート内のセルに入力します。空白の部分もあります。 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.