• ベストアンサー

結合セルを含むロックしていないセルの値の削除を複数シートで行いたい

エクセルのマクロ(VBA)に関して、ご質問いたします。 私のレベルは入門編で、いろんなサイトや本を見て、そのまま利用しているくらいのものです。 次のコードは、他人様のサイトで見つけたものです。 Sub 結合セルを含むロックしていないセルの値の削除() Dim c As Range With ActiveSheet .Unprotect For Each c In .UsedRange If Not (c.Locked) Then c.MergeArea.ClearContents Next .Protect UserInterfaceOnly:=True End With End Sub この処理を複数シートに行いたいので、次のコードを(これも他人様のサイトからお借りしています)、上のコードの「Dim c As Range」の後に追加しましたが、アクティブシートは処理されましたが、全部のシートとはいきませんでした。 Dim Sh As Object For Each Sh In Sheets 単純に足しただけでは、だめなのでしょうか。 参考になるかどうかわかりませんが、シートの中には、値を削除しなくてもいいものも含まれています。 シートが全部で40枚弱あるので、全部のシートをチェックして、ロックされていないセル(結合セル含む)に値が入っていたら、値を削除する処理を、マクロ(VBA)で出来たらいいなっと思っております。 教えていただけますでしょうか。 どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 For Each Sh In Sheets Next にして、 With ActiveSheet  を With Sh に変えればよいわけです。 「シートの中には、値を削除しなくてもいいものも含まれています。」 消されていけないものはロック設定してあると考えてよいなら、以下のようなコードはいかがでしょうか?ただし、ワークシート自体を保護してある必要はないです。セルのプロパティ自体が、ロック設定してあればよいわけですから。 以下のようにすれば、UsedRangeの中を全部、しらみつぶしにアクセスする必要はなくなると思いますね。それと、結合セルは、もともと、Area なのですから、Area を単位とすれば、セルひとつと関係なくなります。ちょっと範囲の選択が変わってくるわけです。 また、元のコードでは、 .Protect UserInterFaceOnly:=True と、意味が分かりませんね。マクロ処理が過ぎ去った後では、マクロのアクセス許可は、あまり役には立たないだろうと思います。 今は、消す対象とする「値」は、定数の文字列と数字になっています。 他の定数(論理値とエラー値)も含めるなら、  .UsedRange.SpecialCells(xlCellTypeConstants, 23).Areas になります。 -------------------------------------------------------------- Sub ClearValueMacro()   Dim a As Range 'エリア   Dim ws As Variant 'シート   On Error Resume Next   Application.ScreenUpdating = False   For Each ws In ActiveWorkbook.Worksheets     With ws       .Unprotect       For Each a In .UsedRange.SpecialCells(xlCellTypeConstants, _         xlNumbers + xlTextValues).Areas         If a.Locked = False Then           a.ClearContents         End If       Next a       .Protect     End With   Next ws   Application.ScreenUpdating = True   On Error GoTo 0 End Sub

hotcoco
質問者

お礼

ご回答およびご説明、ありがとうございます。 ご説明文を参考にして、今後の作成に役立てたいと思います。 教えてくださり、ありがとうございました。

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

検証してないのですが。 Sub 結合セルを含むロックしていないセルの値の削除()   Dim Sh As Worksheet   Dim c As Range   For Each Sh In Worksheets       With Sh            .Unprotect                        For Each c In .UsedRange                If Not (c.Locked) Then c.MergeArea.ClearContents            Next            .Protect UserInterfaceOnly:=True       End With   Next End Sub こちらで、どうでしょうか?

hotcoco
質問者

お礼

ご回答、ありがとうございます。 私も今は確認ができないので、大丈夫かどうかわからないのですが、試してみます。 教えてくださり、ありがとうございました。

関連するQ&A