プチIT化 PR

rangeクラスのlockedプロパティを設定できませんの対処

記事内に商品プロモーションを含む場合があります。
当サイトは、アフィリエイト広告を利用しています。

こんばんは、わたあめです。今日はExcelマクロVBAのエラーについての記事になります。特定のセルを入力できない状態にロックしようと、VBAでLockedプロパティを使用したら、以下のエラーが出ました。

RangeクラスのLockedプロパティを設定できませんのエラーダイアログ
実行時エラー'1004':
RangeクラスのLockedプロパティを設定できません。

このエラーをどう対処したかをこの記事にまとめました。それでは、いってみましょう!

事象:セルのロックを行うVBAで1004エラー

事象の詳細です。特定のセルの入力をできなくするために、特定セルのロックをVBAマクロで以下のように記載しました。セルA1からC2の6つのセルを結合したExcelを使っています。

Locked=Trueを設定しようとしたセル
ActiveSheet.Range("A1").Locked = True

A1のセルをLockedすれば、A1セルは入力できなくなるであろうと目論んだわけです。セル結合する際、値を取得するときは左上のRangeを指定しますから、今回そうしたのです。(そこが問題でした。)

マクロを実行すると、冒頭に記載したエラーが出ました。

実行時エラー'1004':
RangeクラスのLockedプロパティを設定できません。

原因・対処:セル結合時は範囲指定する

セルを結合している場合、結合しているセルすべての範囲を指定してあげなければならなかったです。例えば、A1からC2の6つのセルを結合した場合は、以下のように記載します。

ActiveSheet.Range("A1:C2").Locked = True

また、結合しているセル範囲を返却してくれるプロパティを使った書き方でも大丈夫でした。

ActiveSheet.Range("A1").MergeArea.Locked = True

これで、マクロ実行時エラーは出なくなったかと思います。

わたあめ
わたあめ
エラーは出ないけど、セルがロックされないよ?!

という事になりました。この状態で結合したセルにロックがかかったかと思いきや、普通に入力できてしまいました。この対処について次章に記載したいと思います。

Lockedプロパティでセルがロックされない場合

セルに対してLockedプロパティをTrueに設定したにも関わらず、セルがロックされないことがありました。これは、セルのロック設定は、シートが保護されている場合に有効になるからという仕様が原因のようです。詳しい理由は長くなるので、以下の別記事にまとめています。

【Excel】セルのロック設定をしているのに有効にならないのはなぜ?こんにちは、わたあめです!今日はExcel VBAマクロにおけるセルのロックについての記事になります。先日、VBAマクロを作成している時...

シートの保護についてのVBAマクロを追記ました。

Sub test()

 ' シート保護解除
  ActiveSheet.Unprotect
 ' 全てのセルのロックを解除
  ActiveSheet.Cells.Locked = False
 ' 指定セルのロック
  ActiveSheet.Range("A1").MergeArea.Locked = True
 ' シート保護
  ActiveSheet.Protect

End Sub

ワークシート自体を保護解除、全部のセルのロック解除して、ロックを掛けたいセルを指定してロック、シート全体を保護するという流れになっています。

わたあめ
わたあめ
これでA1は無事ロックされました!

さいごに

いかがだったでしょうか?セル結合の場合は、プロパティによってセル指定の仕方が異なる(Excel VBA全体で指定方法が統一されているわけではない)という事を新たに知りました。同じエラーに悩む人のお役にたてますように!それでは、また!