- ベストアンサー
結合セルを含むロックしていないセルの値の削除を複数シートで行いたい
エクセルのマクロ(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)で出来たらいいなっと思っております。 教えていただけますでしょうか。 どうぞよろしくお願いいたします。
- みんなの回答 (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
その他の回答 (1)
- n-jun
- ベストアンサー率33% (959/2873)
検証してないのですが。 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 こちらで、どうでしょうか?
お礼
ご回答、ありがとうございます。 私も今は確認ができないので、大丈夫かどうかわからないのですが、試してみます。 教えてくださり、ありがとうございました。
お礼
ご回答およびご説明、ありがとうございます。 ご説明文を参考にして、今後の作成に役立てたいと思います。 教えてくださり、ありがとうございました。