こんばんは、わたあめです。今日はExcelマクロVBAのエラーについての記事になります。特定のセルを入力できない状態にロックしようと、VBAでLockedプロパティを使用したら、以下のエラーが出ました。
このエラーをどう対処したかをこの記事にまとめました。それでは、いってみましょう!
事象:セルのロックを行うVBAで1004エラー
事象の詳細です。特定のセルの入力をできなくするために、特定セルのロックをVBAマクロで以下のように記載しました。セルA1からC2の6つのセルを結合したExcelを使っています。
A1のセルをLockedすれば、A1セルは入力できなくなるであろうと目論んだわけです。セル結合する際、値を取得するときは左上のRangeを指定しますから、今回そうしたのです。(そこが問題でした。)
マクロを実行すると、冒頭に記載したエラーが出ました。
原因・対処:セル結合時は範囲指定する
セルを結合している場合、結合しているセルすべての範囲を指定してあげなければならなかったです。例えば、A1からC2の6つのセルを結合した場合は、以下のように記載します。
また、結合しているセル範囲を返却してくれるプロパティを使った書き方でも大丈夫でした。
これで、マクロ実行時エラーは出なくなったかと思います。
という事になりました。この状態で結合したセルにロックがかかったかと思いきや、普通に入力できてしまいました。この対処について次章に記載したいと思います。
Lockedプロパティでセルがロックされない場合
セルに対してLockedプロパティをTrueに設定したにも関わらず、セルがロックされないことがありました。これは、セルのロック設定は、シートが保護されている場合に有効になるからという仕様が原因のようです。詳しい理由は長くなるので、以下の別記事にまとめています。
シートの保護についてのVBAマクロを追記ました。
Sub test()
' シート保護解除
ActiveSheet.Unprotect
' 全てのセルのロックを解除
ActiveSheet.Cells.Locked = False
' 指定セルのロック
ActiveSheet.Range("A1").MergeArea.Locked = True
' シート保護
ActiveSheet.Protect
End Sub
ワークシート自体を保護解除、全部のセルのロック解除して、ロックを掛けたいセルを指定してロック、シート全体を保護するという流れになっています。
さいごに
いかがだったでしょうか?セル結合の場合は、プロパティによってセル指定の仕方が異なる(Excel VBA全体で指定方法が統一されているわけではない)という事を新たに知りました。同じエラーに悩む人のお役にたてますように!それでは、また!