これまでで一番「情けなかったとき」はいつですか?

エクセル2010のVBAでのブック、シートの保護&解除の方法について教えて頂きたく、
質問させて頂きます。

消されては困るシートや数式がある関係で、ブックオープン時にVBAでブックとシートにそれぞれパスワードをかけて保護しています。

VBAではシートの削除、作成、コピーなどを行っているため、VBA実行時のみ、保護を解除させるようにしたいと思います。

ただ、対象のシート自体にも入力したい項目があるため、その箇所については保護を解除しておく必要があります。

そして、VBA実行後、再度、その箇所以外にパスワードで保護をかけ直します。

イメージとしては下記のような流れになります。

対象ブック:ブックA
対象シート:シート1
パスワード:1234(それぞれ)
常時保護を解除しておきたいセル:range("A6:H106")

1.(オープン時には、)ブック保護&特定のセル以外のシート保護
2.VBA実行時には全ての保護解除
3.VBA終了時に、1の状態に戻る

どうぞよろしくお願い致します。

A 回答 (2件)

>worksheetクラスのvisibleプロパティを設定



そういうお話はありませんでしたが。典型的な二度手間ですね。

「ブックの保護」された状態のブックでは、シートの表示・非表示を操作することは当然できません。
この部分では、回答した「シートの保護」のようには、マクロ側で回避する手段はありません。

元のご相談で書かれている通り、
>VBA実行時のみ、保護を解除させるようにしたい

素直に「VBAで(対象の/問題となる)操作をする際に」そのようにしてください。


作成例:
private sub Workbook_Open()
 dim i as integer
 for i = 1 to 3
  worksheets(i).protect password:=1234, userinterfaceonly:=true
 next i

 thisworkbook.unprotect password:=1234
 for i = 4 to 20
  worksheets(i).visible = xlsheethidden
 next i
 thisworkbook.protect password:=1234
end sub
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事に動かすことができました。

しっかりやりたいことを考えてやらないといけないですね。
頑張りたいと思います。

ありがとうございました!

お礼日時:2013/12/04 23:02

保護する必要が無いA6:H106については、マクロ以前の問題として、セルの書式設定の保護でロックのチェックを外しておきます。




やるべきこと:
1.保護する必要が無いセル範囲のロックを外して置く
2.ブックを開いた際にブックの保護、並びに「手動操作に対する」シートの保護をマクロで行う
以上です。


ブックAのThisWorkbook:
private sub Workbook_Open()
 worksheets("Sheet1").protect password:=1234, Userinterfaceonly:=true
 thisworkbook.protect password:=1234
end sub

一応念のため繰り返しておきますが、「VBAの実行時」に「シートの保護をわざわざ解除」する必要はありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
ロックを外したいセルにまでロックがかかっていました。。

教えて頂いた内容を参考に書いてみたところ、無事に保護をかけることができたにですが、
「実行時エラー'1004':worksheetクラスのvisibleプロパティを設定できません」
と出てしまいました。

↓が実際にブックAのThisbookに書いた内容になります。
シートは全部で20シートあり、保護をかけたいシート(sheet1、2、3)は左から3つ順に並んでいます。

Private Sub Workbook_Open()

Dim i As Integer

For i = 4 To 20

Sheets(i).Visible = xlSheetHidden

Next

'ワークブックの保護
ThisWorkbook.Protect Password:="1234"

'ワークシートの保護
.Worksheets("sheet1").Protect Password:="1234", userinterfaceonly:=True
.Worksheets("sheet2").Protect Password:="1234", userinterfaceonly:=True
.Worksheets("sheet3").Protect Password:="1234", userinterfaceonly:=True

End Sub

他にも↓のような 内容で書いて見たのですが、
モジュール内でコンパイルエラーが発生しました~のようなエラーが出てしまいます。
Dim ws as worksheet
Dim wsname as string

Set wsname ="sheet1" or "sheet2" or "sheet3"

For each ws in thisworkbook.worksheets
If ws.name = wsname then

Sheets(ws).Visible = xlSheetHidden

next

以下、同じ


どのように書けばエラー無く処理出来るか、教えて頂けませんでしょうか。
宜しくお願い致します。

お礼日時:2013/12/03 22:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報