EXCEL VBAで特定セルの保護を解除する方法

このQ&Aのポイント
  • EXCELの保護されたシートで特定のセルを解除する方法について、VBAを使用して自動化することができます。現在は手動で行っているため手間もかかり、間違いも起こりやすいですが、VBAを使用すれば確実かつ効率的に解除できます。具体的な処理のイメージや手順をまとめました。
  • まず、全てのセルをロックします。次に、固定された行の特定の列(XX列)で、「調整」という文字があるセルを見つけます。そのセルの一つ下のセルから順に、特定の行(XX8, XX10, XX14, XX16, XX18, XX28)を保護解除したいセルとします。また、D20を起点にして右に2列ずつ移動しながら、特定の列(E列)に到達するまで保護解除したいセルを探します。同様に、D24を起点にして右に2列ずつ移動しながら保護解除したいセルを探します。
  • 手動で特定のセルの保護解除を行うのは手間がかかり、間違いが生じやすいため、VBAを使用して自動化することをおすすめします。VBAを使用すれば確実かつ効率的にセルの保護解除ができます。上記の手順に従って、特定のセルの保護解除を行うVBAコードを作成しましょう。
回答を見る
  • ベストアンサー

EXCEL VBA 特定セルの保護解除したい

お世話になります。田中ともうします。 EXCELのあるシートを一度全て保護して、特定セルの解除をVBAで実現したいのです。 現在、上記処理を毎回手動でやっており、手間もそうですが間違いも多くなり困っています。 イメージとしましては[保護]というボタンをクリックしたら上記処理がVBAで実行されるようにしたいのです。どなたかご教授いただけませんでしょうか。 以下処理の順番イメージです。 ■全てのセルをロック ■保護解除したいセル その(1) 行は決まっていますが列(XX)は可変です。 XX7行目に[調整]という文字がありますのでそのXX列の、XX8行目、XX10行目、XX14行目、XX16行目、XX18行目、XX28行目が保護解除したいセルになります。 ■保護解除したいセル その(2) D20を起点にして、F20、H20、J20・・と2列ずつ右に移動して保護解除したいのです。 ある程度右いにいくと"E"という文字にあるので、この"E"にぶつかるまで上記のように2列ずつ解除したいのです。 ■保護解除したいセル その(3) D24を起点にして、F24、H24、J24・・と2列ずつ解除したいのです。 条件はその(2)と同じです。 これを毎回手でやっているため結構大変で困っています。 どなたかお助けいただけませんでしょうか? よろしくお願い致します。 EXCEL2013

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは。 sheet.Protect メソッド の 名前付き引数 UserInterfaceOnly の扱いについては、 VBAのヘルプ等で、確認してください。 一度 UserInterfaceOnly:=True を設定しておけば、ブックを閉じるまでの間、 シート上でのユーザー操作についてはロックされたものを保護しますが、 VBAからの処理については、これを許容して保護を適用しません。 UserInterfaceOnly:=True を設定した状態でブックを保存した場合、 次にそのブックを開いた場合は通常の保護と同じ状態になります。 一般的には、ブックを開いたタイミングで、 UserInterfaceOnly:=True を設定するマクロを実行するように設定しておいて、 sheet.Unprotect メソッドを頻繁に実行するような煩雑さを回避するように 使います。 sheet.Unprotect → sheet.Protect のように2回処理が必要なところを、 sheet.Protect UserInterfaceOnly:=True のように1回で済ませられるだけでも 扱うメリットはありますから、この機会に、VBAヘルプ等々を確認した上で、 覚えてみて下さい。 (#尚、回答No.1様が唱える異論、については私には理解できません。  私自身は仕事上の経験として、ご質問と同様のニーズに添ったマクロ  を提供したこともありますし、それが何故必要なのかも理解しているつもりです。  加えて、質問者さんが提示されている設計自体は、完成度の高い、適切なものであると  私は考えますので、  回答の内容としては回答No.1とNo.2では相容れない対称的なものになっています。) 以下、細かい点で、こちらが適当に仕様を選定し補って書いています。 そちらで、指定(または確認)するべきポイントを★印でマークしています。 それでも、うまく行かないことがあったり、疑問が残った場合は、 補足欄にでも詳しく書き込んでみて下さい。 ' ' /// Sub Re8977659() Dim Target As Range   With Sheets("Sheet1") ' ★シート名を正しく指定する   ' ' シートの保護を VBAからの操作を除外する形で再設定。     .Protect UserInterfaceOnly:=True ' ★Password 他、必要な引数がある場合は自分で指定すること ' ' ■全てのセルをロック     .Cells.Locked = True ' ' ■保護解除したいセル その(1)     With .Range("7:7")     ' ' XX7行目に[調整]という文字がありますのでそのXX列 ... < "[調整]"という文字列値であるセルを検索       Set Target = .Find(What:="[調整]", After:=.Cells(.Cells.Count), _               LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext)     End With     If Not Target Is Nothing Then     ' ' ...そのXX列の、XX8行目、XX10行目、XX14行目、XX16行目、XX18行目、XX28行目が保護解除したいセル ...       Target.EntireColumn.Range("A8,A10,A14,A16,A18,A28").Locked = False     End If ' ' ■保護解除したいセル その(2) ■保護解除したいセル その(3) Dim arr, v, i As Long     arr = Array(20, 24) ' その(2) その(3) の行位置を配列で指定     For Each v In arr ' その(2) その(3) の行位置を総当たりでループ     ' ' ある程度右*にいくと"E"という文字にあるので、この"E"にぶつかる ... セルを検索       With .Rows(v).Range("D1:XFD1")         Set Target = .Find(What:="E", After:=.Cells(.Cells.Count), _               LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext)       End With       If Not Target Is Nothing Then       ' ' (2) D20を起点にして、F20、H20、J20・・と .... この"E"にぶつかる【手前】まで... 2列ずつ右に移動して保護解除したいのです。       ' ' (3) D24を起点にして、F24、H24、J24・・と2列ずつ解除したいのです。条件はその(2)と同じです。         For i = 4 To Target.Column - 1 Step 2 ' ★もしも"E"のセルを【含める】場合は左の記述中の -1 を削除           .Cells(v, i).Locked = False         Next i       End If     Next   End With End Sub

yakkun2338
質問者

お礼

realbeatin さん、ありがとうございました!!

その他の回答 (4)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 取り敢えずVBAも作ってみました。  尚、下記のVBAでは、「保護解除したいセル その(2)」が存在する列と「保護解除したいセル その(3)」が存在する列は、どちらも同じ列(最終列は、20行目も24行目も同じ列)であるものとして処理を行う様になっておりますので、もし20行目の最終列の列数と、24行目の最終列の列数が異なっている事があり得る場合には、その旨を御知らせ願います。 Sub QNo8977659_EXCEL_VBA_特定セルの保護解除したい() Dim myRange As Object Cells.Locked = True 'シート上の全てのセルをロック Set myRange = RowS(7).Find(what:="調整", LookIn:=xlValues, lookat:=xlWhole) '7行目において「調整」と入力されているセルを検索 '7行目において「調整」と入力されているセルが存在している列の8,10,14,16,18,28行目のセルのロックを解除 If Not myRange Is Nothing Then _ Intersect(Columns(myRange.Column), _ Range("8:8,10:10,14:14,16:16,18:18,28:28")).Locked = False '20行目においてF列以降に「E」と入力されているセルを検索 Set myRange = Range(Range("F20"), Cells(20, Columns.Count)) _ .Find(what:="E", lookat:=xlWhole, MatchByte:=False) '20行目と24行目において、「E」と入力されているセル If Not myRange Is Nothing Then With Range("F20") .Locked = False 'F20セルのロックを解除 .Offset(4).Locked = False 'F20セルの4行下のセルのロックを解除 .Resize(4, 2).Copy 'F20:G:24の範囲をコピー 'F20:「20行目において『E』と入力されているセルの4行下/1列右にあるセル」のセル範囲に、値のみ貼り付け Range(.Offset(0, 2), myRange.Offset(4, 1)).PasteSpecial _ Paste:=xlPasteFormats End With Application.CutCopyMode = False 'コピーモード解除 End If End Sub

yakkun2338
質問者

お礼

kagakusukiさん、ご連絡ありがとうございます! 遅い時間にも関わらず何度もご対応いただきましてありがとうございました。 さきほど会社で使っていたEXCELで試しました結果、ご教授いただきました方法で実現できました!!!ありがとうございました! ご指摘いただきました通り、もしかしますとVBAである必要のないのかもしれませんが練習のためにわざとVBAでやろうとしていました。^^; 細かなご説明+ロジックまでご提示いただきまして本当にありがとうございました! とても参考になりました。 このたびは本当にありがとうございました!!

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

>1) 【ロックされていないセル】については必要な編集が済んだという前提で、 >    【ロックされているセル】へと設定を変更し、以後編集出来ないようにしたい > そして、 > 2) 次に編集を加えるべき候補となるセル範囲を    新たに【ロックされていないセル】へと設定を変更し、編集可能にする > というニーズであった場合、 >    一旦すべてのセルをへと設定を【ロック】してから、 >    【ロックされないセル】を設定する > という手順を選べば処理が簡潔なものになるであろう  「一旦すべてのセルをへと設定を【ロック】」は、8:28の行範囲をまとめて選択してから[ロック]をONにすれば出来ます。  又、「【ロックされないセル】を設定する」は XX8セルのロックをOFF   ↓ XX8:XX9のセル範囲をコピー   ↓ XX8:XX28のセル範囲を範囲選択([Sheft]キーを押しながらXX28セルをクリック)   ↓ 20行目全体を選択   ↓ Excelの検索機能(ショートカット:[Ctrl]キー+[F]キー)で"E"が入力されているセルを検索   ↓ 「"E"が入力されているセル」のロックをOFF   ↓ 「"E"が入力されているセル」をコピーして、その4行下のセル(同じ列の24行目のセル)に書式設定のみ貼り付け   ↓ 「"E"が入力されているセル」:「『"E"が入力されているセル』の右隣の列の24行目のセル」のセル範囲をまとめて範囲選択   ↓ 選択範囲をコピー   ↓ 名前ボックスにD20:「『"E"が入力されているセル』の右隣の列の24行目のセル」のセル範囲を入力するか 或いは [Sheft]キーを押しながらD20セルをクリック   ↓ 選択範囲に書式設定のみ貼り付け という操作を行えば済む事です。  文章に記述しますと長くなりますが、十枚以上のシートに対して同じ操作を行うというのであれば兎も角、1枚(或いは少数の枚数)のシートに対して行うのであれば、さほど大変な作業になる訳でもない様な気が致します。  勿論、VBAを使った方が多少は楽になりますが、VBAを組むための労力の事を考えますと、どちらが得なのか微妙な気が致します。

回答No.3

回答No.2です。 > それが何故必要なのかも理解しているつもりです。 この表現だけでは、宜しくない態度であったと思いましたので補足させてください。 現在、保護されているシート上で、 【ロックされているセル】、と、【ロックされていないセル】、とに分かれていて、 編集できるセル範囲をユーザーに対して制限しているとします。 ここで、 1) 【ロックされていないセル】については必要な編集が済んだという前提で、    【ロックされているセル】へと設定を変更し、以後編集出来ないようにしたい そして、 2) 次に編集を加えるべき候補となるセル範囲を    新たに【ロックされていないセル】へと設定を変更し、編集可能にする というニーズであった場合、    一旦すべてのセルをへと設定を【ロック】してから、    【ロックされないセル】を設定する という手順を選べば処理が簡潔なものになるであろう、ということ。 、、、以上が私が「理解しているつもりです」と書いた意味内容でした。 失礼しました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

>これを毎回手でやっているため結構大変で困っています。 との事ですが、それは >■全てのセルをロック という操作を毎回行っている事が原因です。  一旦、保護解除したいセルのロックを解除しておいて、後はロックを掛けない様にしておきさえすれば、シートに保護を掛けたとしてもロックはされずに済みますし、シートの保護を解除した後でも、各セル毎の「保護を掛けた際にロックをする」/「保護を掛けた際にロックをしない」の設定は変わらずに残ったままとなっているのですから、ロックを解除したいセルが毎回同じセルという事であれば、 >■全てのセルをロック などという事を行う必要など無い筈です。  従いまして、最初に一度手作業にてロックを解除しておきさえすれば、VBAなど使う必要もないと思われます。  それとも、「保護を掛けた際にロックをする」/「保護を掛けた際にロックをしない」という設定を行うための方法を御存じないという事なのでしょうか?  「保護を掛けた際にロックをしない」様にする際には、まず、その設定を行う対象のセル(或いはセル範囲)を選択して下さい。  次に、選択されているセル(或いはセル範囲)にカーソルを合わせてマウスを右クリックして下さい。  そうしますと幾つかの選択肢が現れますので、その中から[セルの書式設定]を選択してクリックして下さい。  すると「セルの書式設定」ダイアログボックスが現れますので、その中の[保護]タブをクリックして下さい。  そして現れた[ロック]という項目のチェックを外してから、「セルの書式設定」ダイアログボックスの[OK]ボタンをクリックして下さい。  これで少なくとも1つのセルに対して「保護を掛けた際にロックをしない」という設定がなされますが、複数のセル範囲に対して「保護を掛けた際にロックをしない」様に設定する際には、設定済みのセルの1つをコピーして、「保護を掛けた際にロックをしない」設定にしたいその他のセルに、「書式のみ貼り付け」を行う事で、書式と共に「保護を掛けた際にロックをする」/「保護を掛けた際にロックをしない」という設定も貼り付ける事が出来ます。  又、毎回新しいシートに対して同じ操作を行う様な場合には、まず、「保護を掛けた際にロックをする」/「保護を掛けた際にロックをしない」という設定と、各種の書式を設定し終えたシートを雛型のシートとしてどこかに保存しておき、御質問の件の作業を行う際には、その雛型のシートの全てのセル範囲をコピーして、作業の対象としているシートに書式のみを貼り付ければ良いと思います。

関連するQ&A

  • ExcelでVBAにおけるシートの保護に関して・・・

    ユーザーフォームで入力した値がシートのセルに入力 されるというものを作っています。 そこで、シートの列挿入及び列削除を禁止しておきたい のですが、そのままシートを保護してしまうとユーザー フォームが開かなくなるので、VBAにてユーザーフォーム が開く前に保護を解除し、閉じるときに再び保護をかける ようにしました。 ただ、この方法だと、シート保護の項目全て(初期設定) に対して保護されてしまうため、例えば行挿入や行削除、 あるいはオートフィルタや並べ替えといったことまでが 出来なくなってしまいます。(手動で保護を解除すれば できるのですが、一々解除しなければならないのは面倒 なので何とか避けたいのです。) 禁止したいのは、列削除及び列挿入のみなのですが、 他によい方法はないでしょうか。

  • VBAでのブック・シートの保護・解除について

    エクセル2010のVBAでのブック、シートの保護&解除の方法について教えて頂きたく、 質問させて頂きます。 消されては困るシートや数式がある関係で、ブックオープン時にVBAでブックとシートにそれぞれパスワードをかけて保護しています。 VBAではシートの削除、作成、コピーなどを行っているため、VBA実行時のみ、保護を解除させるようにしたいと思います。 ただ、対象のシート自体にも入力したい項目があるため、その箇所については保護を解除しておく必要があります。 そして、VBA実行後、再度、その箇所以外にパスワードで保護をかけ直します。 イメージとしては下記のような流れになります。 対象ブック:ブックA 対象シート:シート1 パスワード:1234(それぞれ) 常時保護を解除しておきたいセル:range("A6:H106") 1.(オープン時には、)ブック保護&特定のセル以外のシート保護 2.VBA実行時には全ての保護解除 3.VBA終了時に、1の状態に戻る どうぞよろしくお願い致します。

  • Excelのセルの保護

    Excelで自治会の会計処理する表を作成しています。 表はフィルタを使ってサブトータルで科目別に集計出来るようにしています。 また、報告書作成時に必要のない列と行を非表示にして印刷します。 大勢の人が使うために数式、他シートの参照いているセルなどを保護し変更できないようにしたいのですが、セルの書式設定⇒保護⇒ロック してシート保護をかけるとフィルタ機能や列、行の非表示などができなくなります。 特定のセルだけ変更できないようにして、フィルタや列、行の非表示などは可能なセルの保護方法があったら教えてください。

  • VBAで特定範囲のセルの平均値を順次出力したい

    VBAで特定範囲のセルの平均値を順次出力したい 前回の質問で誤りがあったため再投稿しました。 図のように各行列に値が出力されており,VBAで下記のように処理をしたいと考えています。 (1) 平均値を出すセルの範囲(例えば50X16)をVBAで指定できるようにし、その範囲の平均値を求める (2) (1)で求めた平均値を新しいSheetのあるセルに出力 (3) 上記の処理をある範囲(プログラムの中で変更)の列方向に適用していき,順次(2)のSheetに平均値を出力していく イメージとしては図のように黄(A2~J10)、青(A11~J20)、赤(A21~J30)の順に列方向の平均値を新たなSheetに出力したいのです。図では黄、青、赤の3領域しかありませんが、ここもプログラムで範囲指定をできるようにし、領域の数がいくらになってもよいようにしたいです。 どなたか上記の処理ができるプログラムを教えてください。よろしくお願いします。

  • Excel VBA セルの値を変更後にVBA作動

    Excel VBAを活用して、特定のセルの値が変更されたときに、VBA処理を発動させることになりました。 処理といたしましては、C列(3列目)の4行目以下の空白セルに数値を入力するか、セルに入力されている数値を変更した場合にVBAを発動させたいです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row >= 4 Then MsgBox "セルの値が更新されました" End If End Sub 上記のコードを実行してみたところ、3列目(C列)の4行目を選択した段階でVBAが作動してしまいます。 セルの値変更後に作動するようにするには、どう修正すればよろしいでしょうか?

  • エクセル2003 VBAで セル内を 一発呼び出し

    エクセル2003 オートフィルタではなく VBAで セル内を 一発呼び出ししたいので。  よろしく お願いします。 表 列A~E(結合2行) :商品名と内容   列H~K(結合2行) 住所氏名電話番号を記載してます。 1年分を オートフィルターで  氏名 や 商品名で 探すのは 結構 時間がかかります。 同じものが ほぼ少ないため。。。 そこで  たまに 同じ氏名  同じような 品を 検索する セルを 2個ほど作って  そこへ セル1へ 商品名を入力すると  該当する 行のみ 表示される。 セル2に 名前をを入力すると  該当する 行のみ 表示される。 また、セルを赤色に塗った部分の結合行(2~3行)を 赤色に塗りつぶした行のみ 表示も できれば うれしいです。 コマンドボタン等を使ってもいいので お願いします。 そんな VBAを 作っていただけませんでしょうか^^; お手数おかけしますが どなたか よろしく お願いします。 

  • エクセルで結合セルの内容を解除した各セルに転記する

    いつも大変お世話になっております。 過去にも同じ要求があり、何度か手作業で対処してきたのですが、今回は表が大きいので何とかならないかと。 具体的には特定の列(例えばA列)が3行から6行の接合セルになっている表で、A列の結合を解除したときにA1:A5、A6:A7と言った不規則に結合されている行の結合セルの内容を、結合を解除したときに各セルに転記したいのですが関数では無理なようで、当方のVBAの知識では解決できないのでどなたかお助けください。 尚、シート全体の結合セルを対象にするとまずいので、解除対象の列は指定した列のみで動くことが必要です。 複数列の結合列の解除の場合は、複数回に分けての実行もOKです。

  • エクセルVBAでセル結合

    いつもお世話になっています。 エクセル2003でVBAを使って下記をしたいのでその、VBA構文を教えて下さい。 特定の列のあるセルに文字が入っています。 (文字が入っている列は固定ですが、行番号はデータによって変わります。例えば、Aデータの場合は「J30」、Bデータの場合は、「J55」だったりします。) この文字が入っているセルをVBAで検索し、検索したセルを右隣のセルと結合します。(先ほどのAデータの場合、J30:Z30に結合します。) 更に、文字が入っているセルが2以上の複数の場合があります。(先ほどのAデータの場合、「J30」と「J40」と「J45」という感じです。文字が入っているセルの数はデータにより異なります。) 結合が終わり、このシートのデータがあるところだけに罫線を引きます。(このシートのデータというのは、前述の文字とそれ以外は、「数字」と「・」です。 ややこしいですが、よろしくお願いします。

  • シートの保護のあとセルの列、幅を動かせるようにしたい

    EXCELマクロでシートの保護はするがセルの行、列の幅を動かせるにしたいです。 シート1,2,3があり、シート2,3のデータをシート1に集約する処理を 行っています。 シート1,2,3は事前にシートの保護を設定し、シートの保護の設定で、ロックされたセル範囲の選択、セル書式設定、列の書式設定、行の書式設定は許可しています。 シート1にシート2,3のデータを設定する時にActiveSheet.Unprotect Password:="password"でシートの保護を解除し、設定後にActiveSheet.Protect Password:="password"を再度保護しています。 空の状態のシート1はセルの行、幅を動かすことはできるのですが、上記のシートの保護を解除し、データ設定後、ActiveSheet.Protect Passwordコマンドで保護するとシート1のセルの行、幅を動かすことができなくなります。 シートの保護設定のやり方があるのでしょうか。 ご指導のほど、よろしくお願いいたします。

  • VBAで保護セルのコピー

    セルA17:Q27の範囲にデータがあります。 この中の1部のセルは保護されており編集できません。 これを1セットし下にコピーしていきたいです。 最初はA28:Q38 次はA39:A49・・・ 11行ずつとなります。 VBAでやるとどのように書けばいいのでしょうか? SpecialCellsで最終行を取得していく方法もありますが ほかにうまい方法はありますか? マクロを使わずExcelでコピー&貼り付けではコピー先の 保護部分が無効になってしまうためVBAでやろうと思っています。 -------------- もう1つ手間をかけますがB列には平日の日が入ります。 その月のdayから曜日を取得できるのは知っていますが 祝日なども除いた日を入れていくことができるでしょうか? 5月で言うと3,4,5日はコピーしません

専門家に質問してみよう