Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
シート部分入力許可、他は保護してVBA実行させたい
投稿日時: 19/12/02 10:52:26
投稿者: Yoasn_3218

マクロを含むアンケートシートを作成し、
 
・ユーザー入力項目(セル)だけを手入力許可、その他(マクロコード含め)変更できないよう保護する
・ユーザーが必要項目を入力後にマクロ実行・処理させる
 
のようにするには何か良い方法があるでしょうか?
 
UserInterfaceOnly  はシート全体の保護前提の一部をVBAから実行
 
であり、意図することは実現できないと思われます。
 
VBAの辞書みたいな解説本をパラパラと立ち読みしてみただけなのですが、
目的に適うような項目がなかったような..。
 
 
どうかご教授下さい。
 

回答
投稿日時: 19/12/02 12:54:53
投稿者: よろずや

シートの保護では、ロック指定されたセルのみが保護されます。

投稿日時: 19/12/02 16:36:12
投稿者: Yoasn_3218

(コメントだと自分の希望する設定は本来可能であると受け取りましたが)
 
通常のExcelシートのユーザ入力させる部分をロック解除設定、その上でシート保護をかけてます。
 
自分もこの理解でいたのですが..
希望セル箇所も入力不可となってしまっているのですが?
 
どこか間違った操作しているのでしょうか?
再度順を追って確認してみます。

回答
投稿日時: 19/12/02 19:42:20
投稿者: simple

どこかで、間違いをしていると思われます。

投稿日時: 19/12/03 15:05:52
投稿者: Yoasn_3218

先の問題、
 
入力を許可するセルの保護チェックボックスを外しOKを押したつもりでいたのですが、
どうやらそのOKを押し忘れたのか甘かったのか...
 
まず、マクロ実行無しで
 
チェック外す→しっかりOK確認する→シート保護
 
で目的のシート保護ができました。
 
次にこのシートのマクロコード実行させるべく
ThisWorkbook・WorkSheets(”Sheeet名”)・Protect.UserInterfaceOnly:=True
とコードの先頭行に置いて実行したところ、
 
シート保護解除のPW入力を求めるウインドウが出現、PWを入れたら目的の処理が
完結させることができました。
 
すぐにシート保護時にPWをかけた為と察知できたので、シート保護時にPWをかけないで
VBA実行させたら何も訊かれず、目的処理が完結できました。
 
できればシート保護解除PWを設定した上で実行させ、保護解除のPWを求められること
なく完結まで実行させる方法はないものでしょうか?
(原理的に何となく不可能な気がしていますが)
 
 

回答
投稿日時: 19/12/03 15:50:04
投稿者: simple

引用:
できればシート保護解除PWを設定した上で実行させ、保護解除のPWを求められること
なく完結まで実行させる方法はないものでしょうか?
(原理的に何となく不可能な気がしていますが)
勘違いしているのかもしれないが、
一般ユーザーではなく、自分が、ということですね。
パスワードを指定して保護解除するコード(Unprotectメソッド)を
実行すればよいだけだと思いますが。
むろん、マクロの最後で、パスワード付きで保護を掛けます。
これが一番簡明な方式だと思います。

投稿日時: 19/12/03 16:50:42
投稿者: Yoasn_3218

頂いたコメントを元に
 
Sub 
ActiveSheet Unprotect Passwaord:="○○” ’○○はシート保護解除に設定したPW"
 
を冒頭に、コードの最後で
 
’次にファイルを開いたときにもVBAからは実行可能とするため
ThisWorkbook・WorkSheets(”Sheeet名”)・Protect.UserInterfaceOnly:=True
 
Application.Quit
ThisWorkbook.Close True
 
End Sub
 
とすれば良いと理解しましたが..。
 

回答
投稿日時: 19/12/03 18:07:28
投稿者: simple

私は、
「その都度、@保護解除、A処理、B再度保護 を実行する」のが
間違いないと思います。マクロに書いておけば、手間はかかりませんし、
ユーザーには影響は及びません。
という考え方を採っていますが、
どうしても UserInterfaceOnly:=True を使いたいのであれば、
下記の記事を参照してください。
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_030_040.html
 
特に、最後のくだりが重要です。

引用:
「UserInterfaceOnly:=True」の有効期間はそのワークブックを閉じるまでで、
開いた時には再設定が必要です。このため、立ち上げ時のマクロに記述しています。

 
私はここまでとします。

投稿日時: 19/12/04 11:38:50
投稿者: Yoasn_3218

 simple さん
 
ThisWorkbook・WorkSheets(”Sheeet名”)・Protect.UserInterfaceOnly:=True
 
ありきで考え始めたところから間違っていましたね。
 
simpleさんのお考えが、第一優先の正しい設計だと思います。
修正して動作確認してみたいと思います。
 
コメント、アドバイスどうもありがとうございました。