Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
シート保護のままVBAを動かすには...
投稿日時: 19/09/04 17:49:47
投稿者: carter

下記のマクロを作成してみましたが上手く動きません。
 状況は、シートの保護をかけた状態だと、
 変更しようとしているセルは保護されているため、読み取り専用となっています。
 という内容が表示されます。下記のマクロで保護を解除せずに済む方法があれば
 何卒ご教授の程宜しくお願い致します。
  
   ActiveWindow.ScrollWorkbookTabs Position:=xlLast
    Sheets("各種フォーマット").Select
    ActiveWindow.SmallScroll Down:=-3
    Range("B19").Select
    Selection.Copy
    ActiveWindow.SmallScroll Down:=-15
    Range("C6:V6").Select
    ActiveSheet.Paste ←ここにエラーが出ます。

回答
投稿日時: 19/09/04 19:03:54
投稿者: simple

Sub test()
    With Sheets("各種フォーマット")
        .Protect UserInterfaceOnly:=True
    End With
End Sub
などとして処理実行すれば、
・ユーザーの手動での変更は保護されるが、
・マクロによる変更は許可される
ようにできます。(ネットなどで調べて見て下さい)
 
これがピッタリのような気が最初はしますが、
そのUserInterfaceOnly=Trueによる保護処理は永続的ではない、
つまり、閉じられると、UserInterfaceOnly=Trueの効果は無効になるので、
・Bookを開いたときなどに、
自動実行マクロで、その都度、UserInterfaceOnly=Trueによる保護処理
を実行する必要があります。
その点に注意が必要です。
マクロ無効で開かれることにも注意が必要かもしれません。
 
したがって、私は、そこに注意を向けるよりも、
「その都度、@保護解除、A処理、B再度保護 を実行する」のが
間違いないと思います。マクロに書いておけば、手間はかかりませんし、
ユーザーには影響は及びません。
 
-------------------
失礼ながら、
UserInterfaceOnly=Trueによる保護処理といったものに、
気を使うよりも、
Selectを使わないスタイルで書くことをマスターされるほうが
効果は大きいと思われます。
 
例えば、提示されたコードは
Sub test()
    With Sheets("各種フォーマット")
        .Range("B19").Copy .Range("C6:V6")
    End With
End Sub
などと Selectを使わずに書けます。

回答
投稿日時: 19/09/25 16:25:34
投稿者: loop

 
該当のセルだけ保護をはずし
    Range("C6:V6").Value=Range("B19").Value
では無理でしょうか?
 
よく覚えていないのですが、保護されたシートでも
マクロでなら書き込める方法があったと思います。
 
間違っていたらごめんなさい。

回答
投稿日時: 19/09/25 18:49:59
投稿者: simple

投稿ご苦労様です。

引用:
該当のセルだけ保護をはずし
    Range("C6:V6").Value=Range("B19").Value
では無理でしょうか?

それはセルのロックを外すという意味でしょうね。
そして、保護されたシートのロックを変更するには、
保護を外すなりが必要でしょう。
 
引用:
よく覚えていないのですが、保護されたシートでも
マクロでなら書き込める方法があったと思います。
そうですね。それが私が書いた
.Protect UserInterfaceOnly:=True
という仕組みです。

回答
投稿日時: 19/09/25 19:07:39
投稿者: simple

うーん、確かに、セルのロックをもし質問者さんがご存じなければ、
有益な助言とも言えるかも知れません。
書込む予定のセル範囲のロックは予めはずしてから保護を掛ければ良い、
という助言ですよね。
ご存じじゃないかなあ。

回答
投稿日時: 19/09/26 10:51:04
投稿者: WinArrow
投稿者のウェブサイトに移動

老婆心ながら、
 
(1)「シートの保護」と「セルのロック」について
まず、「セルを保護」という表現ですが、
「セルはロック」しますが、それを有効にするために「シート保護」します。
従って、
>該当のセルだけ保護をはずし
という表現は、文面からは、真意が伝わってきません。
 
>変更しようとしているセルは保護されているため
この表現からは、セルのロックを外しているようには、受取れません。
セルのロックを外して入れb、シートの保護を解除しなくてもよいです。
 
(2)コードの中の
  ActiveWindowオブジェクトを使ってイートを操作する命令がありますが
 この命令は手操作を想定したもので、マクロの中では、不要です。
 (わざわざレスポンスを落としてまで記述することはありません)
 シートやセルのSelectもレスポンスを落とすもので不要な命令です。
 
 

トピックに返信