• 締切済み

エクセルのセルロック

エクセルのセルのロックについて質問です。 セルの参照、セルの選択、行の挿入のみを許可してロックをかけたシートに行を追加した際、その追加した行だけは編集可能な状態になっている、というステータスを作りたいです。 シートの保護で、ユーザに許可する操作のところで上記3つにチェックを入れた状態では、行の挿入はできますが、挿入した行が編集できません。 編集用の行を予めいくつか入れておいてその部分だけ編集可能にしておけば回避はできますが、上記設定が可能でしたらその設定をしたいと思います。 設定方法をご存じの方、いらっしゃいましたらご教示頂きたいと思います。

みんなの回答

回答No.3

#1です。... ? では、私が用意してあった簡易版暫定仕様のマクロも上げておくことにします。 現代版のExcelへの対応として(繰り返し処理しても負荷がかかり難いように)、 不必要な再設定処理(キャッシュへの影響)を極力排除するように書いてあります。 行をコピーした状態から[コピーしたセルの挿入]によって「行を挿入する」ような条件、 には対応していません(可能ですが簡単ではないので略)。 また、こういった処理は"行丸ごと"に対してではなくて、列範囲を限定してあげた方が、 トラブルフリーになりますので、特別な意図でもない限りは、列範囲を限定 することをお奨めします(未使用の列まで編集可能にする必要もないでしょうし)。 或いはもしかして、 挿入後の行は[セルのロック]以外の書式が初期化されているものがお望み、 とかいうことでしたら、それはそれで処理を追加する必要があります。 ということで、基本的にオンデマンドでの対応になりますので、 不足や新たなご要望でもあれば、補足欄にでも書いてみて下さい。 ■導入手順 対象シートのシートタブ(ウィンドウ下部にあるシート名表示)を右クリック ↓ ポップアップしたメニューにて[コードの表示]をクリック ↓ 表示されたシートモジュール(VBA編集画面上でアクティブな子画面) に、以下のスクリプトをコピペしたら、Excel画面に戻る。 ' ' //// Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Columns.Count <> Columns.Count Then Exit Sub   If Me.ProtectContents = False Or Me.ProtectionMode = False Then _       Me.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _           AllowInsertingRows:=True, UserInterfaceOnly:=True   If IsNull(Target.Locked) Or Target.Locked = True Then Target.Locked = False End Sub

Doctork1n4d1
質問者

お礼

ご回答頂きましてありがとうございます。 列を挿入する場所や作業場の大きさが確定できないエクセルですので、頂いたマクロのコードを読んで、ちょろちょろいじってみます。 まずは取り急ぎ御礼させて頂きます。 ありがとうございました。

回答No.2

シートのイベントプロシージャに、以下のように記述します。 Private Sub Worksheet_Change(ByVal Target As Range)  '「セルの値を普通に変更した時」を排除  If Target.Columns.Count = 256 Then   'シート保護解除   ActiveSheet.Unprotect   '行のロック解除   Target.Locked = False   'シート保護の再設定(選択範囲の変更と行挿入を許可)   ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _     , AllowInsertingRows:=True  End If End Sub これは「行挿入されたら、シート保護を解除して、挿入された行のロックを解除し、シート保護を再設定する」と言う事をしています。 エクセルでは「行挿入」すると、1つ上の行の書式が、挿入された行に複写されます。ロック状態も同様に複写されます。 なので、挿入前の行の状態が「ロック状態」だと、挿入された行もロック状態になります。ロックと非ロックが混在している場合は、混在した状態が「そのまま」複写されます。 そこで「行挿入されたらイベントプロシージャで書き換えてしまえ」と言う方法で、まとめて非ロック状態に書き換えてしまうのです。

Doctork1n4d1
質問者

お礼

ご回答頂きましてありがとうございました。 ロックされた行を挿入して、イベントプロシージャーでロックを外してしまうという理屈でいけるのですね。 ありがとうございました。

回答No.1

こんにちは。 ご質問の課題については、 「セルのロック」は「セルの書式」の一部である、という点を意識することで、 設計手段が見えてくるのではないかと思います。 「セルの塗りつぶし」で例えると、 A1:赤、B1:緑、C1:青、という状態から、 2行目を選択して「行の挿入」を実行した場合、 A2:赤、B2:緑、C2:青、という風に、 ひとつ上のセルの書式を参照し踏襲する仕様であることは既にご存じのことと思います。 行の挿入を許可したシートの保護を適用した場合の「セルのロック」についても同様、 A1:ロック、B1:非ロック、C1:ロック、という状態から、 2行目を選択して「行の挿入」を実行した場合、 A2:ロック、B2:非ロック、C2:ロック、、という風に、 ひとつ上のセルの書式を参照し踏襲する仕様であることは 変えられるものではありません。 挿入したい行位置のひとつ上の行がロックされていなければ、 お望みのように、挿入後の行での編集は可能です。 従って、 「行を挿入する位置を固定しておいて、ひとつ上の行は雛型として非ロックのしておく」 というようなシート設計にする、 ということが、ご質問への答えになります。 シート設計で対応する以外の、部分的な方法というのは考えられません。 無論、マクロを用意すれば容易に実現できることではあります。 お望みあれば、補足欄にでも書いて貰えればマクロ提示します。

Doctork1n4d1
質問者

お礼

ご回答頂きましてありがとうございます。

関連するQ&A