質問: True End Sub コード ```
回答: とりあえずやりたいことをごちゃっと全部並べあげてしまうと、収集がつかなくなってしまいます。 まずは機能単位に整理して考えましょう。 大きく2つの機能(ブックオープン時の機能/保護ボタン押下時の機能)がありますよね? まずこの2つで、わけられる部分ははわけて考えましょう。 それぞれについて、具体的な機能をざっと洗い出すと 【ブックオープン時の処理】 ・パスワードのチェック処理 ・シートの表示/非表示 ・ブックの保護(非表示シートを再表示させないため) 【保護ボタン押下時の処理】 ・ロック対象範囲の取得(E列最終行の取得を含む) ・対象セル範囲のロック ・特定セル(空欄/サイン欄)のロック解除 ・シートの保護 ・保護状態の表示(B4セル) ※保護解除時に「解除」を表示する処理は【保護ボタン押下時の処理】とはタイミングが異なりますので別途処理を用意する必要があります。 といった具合でしょうか。 ただでさえ初心者さんがチョイチョイと作れる物量ではなさそうなのに、これをごちゃっとひとくくりに考えてしまっては、手の付けどころもわからなくなってしまいませんか? 細かな機能単位に絞って、ひとつひとつ実装を積み重ねていきましょう。 1について >検索方法は >Dim maxrow >maxrow=Range("E65536").End(xlUp).Row >で合っていますか? 検索方法はあっていますが、このコードの意味は理解できていますか? これはE列最終セル`Range("E65536")`から[Ctrl+↑]で移動`.End(xlUp)`したセルの行番号`.Row`を取得し、`maxrow`変数に格納しています。 あるセルから[Ctrl+↑]で移動すると、データが入力されているセルの端まで移動します。 つまりE列最終行までデータが詰まっていない状況であれば、このセルから[Ctrl+↑]操作を行うことで、E列のデータが入力されている最終セルまで移動できるというわけです。 上記コードでは、見つけたセルそのものではなく、セルの行番号を取得しています。 今回、E列の最終データセルそのものに何かをしたいわけではありませんので、セルを単体で持っていても意味はありません。 データ範囲の最終行を知るための素材として利用しているわけです。 今回ロックしたい範囲は、11行目から最終データ行の1行手前ですよね? これを取得したmaxrowを使用して表すと`Range(Rows(11), Rows(maxrow -1))`が対象の行範囲ということになります。 2について 私の手元の環境では`Columns(14).Interior.Locked = True`はエラーとなります。 Lockedプロパティは対象セル範囲(Range型)に対するプロパティですので、`Columns(14).Locked = True`のような記述になると思います。(Columnsは指定列を指すRange型を返す。) この記述で処理してもロックの状態がばらけるのであれば、ロックに失敗しているけどエラーを無視して処理を進めている可能性くらいしか原因が思いつきません。 3について シートを非表示にしてブックを保護すれば、保護を解除しない限りシートを再表示することはできなくなります。 ブックを保護する際にパスワードをかけることもできますが、やりたいことはそういったことでしょうか?