• ベストアンサー

【VBA】特定シート 名前編集・削除を禁止したい

いつも大変お世話になっております。 Excel2003を使用しております。 今回VBAでやりたいことは、 特定シートの名前編集・削除を禁止したいのです。 シート名 「データ」 シート名 「一覧」 この二つを名前編集・削除禁止にしたいと思っております。 保護する方法も考えたのですが、 現在様々なプログラムでシートを利用しており、 保護をかけると色んなフォーム上で保護解除をしないといけません。 データの参照・編集が出来ないと困るのです。 保護をかける 以外で何か、方法はありますでしょうか? 以上、 回答よろしくお願い致します。

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

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

こんにちは。 何年ぶりかで、このようなマクロを書いてみました。 普通は、ブックの保護のシート構成の保護だけで、良いはすですが、以下のようなマクロが可能かと思います。ただし、上位バージョン(2010)では、稼働しませんでした。また、2003では、現在、完全には試しておりません。たぶん、ご質問者さんでしたら、コードに間違いがあっても、修正できますでしょうから、今はヒントということだけにしてください。 また、本来は、FindControlsのID、847, 889が該当するのですが、バージョン2003ですと、Control配列になってしまいますので、その中を選択するという方法は、ちょっと手間が多すぎます。 '//ThisWorkbookに登録 Private Sub Workbook_SheetActivate(ByVal Sh As Object)  If Sh.Name = "データ" Or Sh.Name = "一覧" Then   With Application.CommandBars("Ply")    .Controls("削除&(D)").Enabled = False '削除    .Controls("名前の変更&(R)").Enabled = False '名前の変更   End With  End If End Sub Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) '戻し  If Sh.Name = "データ" Or Sh.Name = "一覧" Then   With Application.CommandBars("Ply")    .Controls("削除&(D)").Enabled = True    .Controls("名前の変更&(R)").Enabled = True   End With  End If End Sub 'ブックを開いたり閉じたりする場合 Private Sub Workbook_Activate()  If ActiveSheet.Name = "データ" Or ActiveSheet.Name = "一覧" Then   With Application.CommandBars("Ply")    .Controls("削除&(D)").Enabled = False '削除    .Controls("名前の変更&(R)").Enabled = False '名前の変更   End With  End If End Sub Private Sub Workbook_Deactivate() '戻し  If ActiveSheet.Name = "データ" Or ActiveSheet.Name = "一覧" Then   With Application.CommandBars("Ply")    .Controls("削除&(D)").Enabled = True '削除    .Controls("名前の変更&(R)").Enabled = True '名前の変更   End With  End If End Sub '//

satoron666
質問者

お礼

回答ありがとうございます! マウスで右クリックした時に 名前の変更・削除 ボタンが無くなるVBAでしょうか? "Ply" というのをはじめてみました^^ まだまだ、勉強していかなきゃだめですね! とて参考になりました! ありがとうございました^^ 早速試してみます!

satoron666
質問者

補足

回答ありがとうございました! 遅くなりましたが、試してみました。 …思い通りの結果です!感激しました!! 助かりました^^ありがとうございました! 補足にてお礼することになり、申し訳ありません。 ありがとうございました!

その他の回答 (4)

回答No.5

>ブックの保護(シート構成保護?)をしてしまうと新規シートは作成できないのですよね? はい。 >特定のシートのみ、名前の変更・シート削除ができないようにするには、この方法ではダメ…なのでしょうか? 特定シートのみ、とはならず、全シートですね。だからこその「ブックの」保護なのでしょうね。 ちょうど No.3 さんが Worksheet.Protect メソッドを紹介されていますが、それとは別に VBA には、Workbook.Protect メソッドというものも用意されています。 workbooks("保護.xlsm").Protect password:="abcd"  'ブックを保護 workbooks("保護.xlsm").unProtect password:="abcd"  'ブックの保護を解除 つまり、VBA でデータ処理するたびに手動で予め保護を解除しておくのは煩わしいということであれば、保護の解除と再設定についても、ついでにマクロで Excel に作業させてしまえばよいでしょう。 こうなると、マクロもパスワードで保護したい、となるかもしれません。しかしマクロのコードは、必ずしも同じブックに保存しておく必要はないのです。

satoron666
質問者

お礼

回答ありがとうございます。 どう対応するのがいいか、色々考えましたが… その場合ですと、たくさんのフォームプログラム上に 保護解除プログラムを入れないといけません。 そうなってしまうと、20以上?のフォームプログラムに 保護解除、終了時に保護 を入れなければならず 少し面倒だと思っております…

回答No.4

質問文を読んでいて、ちょっと腑に落ちないのは、質問者さんは「シートの保護」と「ブックの保護」を区別されていますか?という点です。 「シートの保護」をすると、ロックのかかっているセルの編集・削除ができないようにできますが、シート名の編集・削除はできます。逆に「ブックの保護」をすると、シート名の編集・削除ができないようにできますが、セルは編集・削除ができます。どちらの機能も、パスワードを設定することも可能です。 「データの参照・編集が出来ないと困る」というのは、セルの参照や編集ができさえすれば保護が存在していても問題ないという意味であれば、ブックを保護すれば解決のような感じもしたのですが、いかがでしょうか。ま、保護を解除させないためにパスワードを設定したいが、その管理が煩わしいと言われたら、採用できない案かもしれませんが。

satoron666
質問者

お礼

回答ありがとうございます^^ 確かに、「シート保護」と「ブック保護」の違いが 良く分かっておりませんでした。 詳しい説明ありがとうございます。 ブックの保護(シート構成保護?)をしてしまうと 新規シートは作成できないのですよね? 色々情報不足で申し訳ないのですが、 新規シートを使うときに作成し、編集したり…という こともVBAでしています。(保護したいシート以外のシート) 特定のシートのみ、名前の変更・シート削除ができないように するには、この方法ではダメ…なのでしょうか? 回答ありがとうございました!

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.3

No1です。 では、もう一案 フォーム上のコードを変更せずに保護の解除と保護を行う案として 目的のシートには保護をかけておいて フォーム上に、ユーザーフォームを表示させるボタンがあると思いますので フォームの表示 .show の前に Unprotect .Show の後に Protect Sheets(保護がかかっているシート).UnProtect Password:="pass" Userform1.Show Sheets(保護がかかっているシート).Protect Password:="pass" といった感じではどうでしょうか。 必要なコードはマクロの記録でも出来ると思います。

satoron666
質問者

お礼

回答ありがとうございます^^

satoron666
質問者

補足

フォームは20種類くらいあるので、大変な作業になるかと思われます。 また、workbook_Open に Application.ScreenUpdating = False Worksheets("データ").EnableAutoFilter = True 'データのシート フィルター可能に Worksheets("データ").Protect Password:="pass", userinterfaceonly:=True, AllowFormattingCells:=True Application.ScreenUpdating = True 上記のような感じで、シートを3つ 保護かけています。 しかし、現状ではシート削除できてしまうので どうにかしたいと思いました。 この方法だと、VBAで データの編集・削除・追加ができるため あまり変えたくなく思っております。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

フォーム上から編集はしたいが 直接、シートを編集してもらっては困る ということでしょうか。 一案ですが、そのシートを非表示にしておくでは ダメなのでしょうか。

satoron666
質問者

お礼

回答ありがとうございます! おっしゃる通りかとは思いますが、 表示にしたら見えてしまうので、あまり良くないのです… ありがとうございました!

関連するQ&A

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

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

  • 特定のシートの削除を禁止したい(ブックの保護でなく)

    Excelについて教えて頂きたいことがあります。 シート名でマクロを組んでいるので、誤ってシートを消されてしまうとエラーになってしまいます。 但し、外部データ取り込む為に、一時的にシートを挿入し、既存のシートにデータを転記し終わったら挿入したシートを削除するという機能が必要であるため、ブックの保護が出来ません。 ブックの保護をして、上記部データ取り込みのマクロを実行したらやはりエラーになってしまいました。 ブックの保護ではなく、特定のシートのみ削除を禁止する方法をご存知の方がいらっしゃれば教えて頂けませんか? または、上記外部データ取り込み用のシートのみ挿入、削除を認めるという方法でも結構です。 “外部データ取り込み用のシートの挿入→削除”操作以外は、既存のシート構成を保護したいのですが、どうすれ良いか分からず困っています。 ご教授下さい。

  • Excelシートの保護以外で編集禁止は可能?

    Excelシート上でデータの編集禁止を行いたいのですが、シートの保護以外でできますでしょうか? 表があって、オートフィルタでデータの絞り込みが出来て、 セルをダブルクリックすると特定の処理が行われる、ということをやりたいのですが、 シートの保護をしてしまうと、オートフィルタの絞り込みが出来なくなります。 オートフィルタの代替として絞り込みのユーザインタフェースを 何かしら考える(VBA等で作成する)のは、出来ればやりたくないです。 何かしらの実現方法をご教示して頂けると非常に幸いではありますが、 取り敢えず、できる、できないという回答を頂けるだけで構いません。 まだ、方向性を考えている段階です。 以上、宜しくお願い致します。

  • EXCEL VBA 保護したシートを読込みしたい

    お世話になります。 EXCEL VBAで「データ」というシートあります。ここの100件ほどのデータが入っており、もう1つの「集計」というシートにフォームを作成してそのフォームからVBAを使って集計するのですが、この「データ」シートはユーザーにいじられたくないので保護もしくは非表示にしたいと思っています。 しかし「データ」シートを保護してしまうとVBAで「データ」シート読み込む際にエラーになってしまいます。 何かよい方法はありますでしょうか? 環境 WindowsXP SP3 Excel2003

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

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

  • 特定のシートを削除する

    いつもお世話になっています。 INパラメータがA~Zあり、各パラメータごとにシートを作成し、 その中に各パラメータごとのデータ表を作成しています。 このとき、表示するデータが全くないパラメータのシートを 削除したいのですが、出来るのでしょうか? 最初にシートをパラメータの数だけ作り、(シート名はパラメータの名前と同じ) そこでシート分ループさせています。 表示データの有無はプログラムにより、判断できます(Flg=1が返ってきます)。 Flg=1ならそのシート(パラメータA)を削除して次のシート(パラメータB)へ・・・ といった感じなのですが・・・。 シートの削除の仕方は載っているのですが、特定のシートを削除するには どうしたらいいのでしょう。 どなたか知ってる方、教えてください!!

  • 《エクセル2000》特定のセルだけ上書き禁止にしたい

    タイトルの通りですが、任意のシートの特定のセルのみ、変更禁止にしたいです。(数にして1シートあたり30くらい) ただし、「特定のセル」以外のセルは文字色やセルの色など、書式を変える必要があるので、「シートの保護」は使えません。 「セルのロック解除」+「シートの保護」以外の方法で、特定のセルのみを保護する方法はあるでしょうか。

  • エクセルVBA名前の定義特定のシートの名前のみ削除

    いつもお世話になってます。 Excel2013のVBAより、特定のシート、例えばデータというシートに付けられた名前の定義を消す事は出来るでしょうか?他のシートの名前の定義は残しておきたいです。 ActiveSheet.Namesで指定しても消去されませんでした。 Sub Sample1() Dim n As Name For Each n In ActiveSheet.Names n.Delete Next End Sub

  • VBAで特定のシート以外を削除する方法

    いつもたくさんのお知恵を貸してもらっています。 今回もよろしくお願いいたします。 ブックの構成は下記のとおりです。 Sheet1⇒名簿 Sheet2⇒チームメンバー表 Sheet3⇒営業月報の原版 Sheet3の原版はSheet2のメンバー表をもとにシート名にメンバーの氏名を使ってチームメンバーの分だけ自動で複製(シート名にメンバーの名前を反映)していくようにVBA処理しています。 この処理を終了した後に、上記のSheet1~Sheet3以外の複製したSheetのみをVBAで一括削除する方法はないでしょうか? 教えてください、よろしくお願いします。

  • Excel2007,VBA シートにロードする方法

    VBAのコードがあるファイル(入出力.xlsm)には "シートDATA" "参照データ1" "参照データ2" "参照データ3" "新規データ" ・・・・ というシート名があります。 フォームとボタンを作りました。 「ロード」「セーブ」 「ロード」ボタンをクリックすると ファイル名 "File0001.xlsx"を "シートDATA"というシート名のA5列を軸にしてロードしたいです。 存在しない場合、エラーの場合は"新規データ"というシート名を"ロードDATA"にコピーします。 フォームの「セーブ」というボタンを押すと"File0001.xlsx"というファイル名に "シートDATA"のシートのデータのみ上書きします。 A5列を軸にして保存。 どうしたらいいのでしょうか? A5列を軸にするというのは面倒ならなくてもかまいません。 File0001.xlsxには1シートのデータしかないことになっています。 ファイルに複数シートがある場合はまずいでしょうか? File0001.xlsx File0002.xlsx ・・・ と保存していく予定です。

専門家に質問してみよう