dポイントプレゼントキャンペーン実施中!

エクセルのマクロ(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)で出来たらいいなっと思っております。

教えていただけますでしょうか。
どうぞよろしくお願いいたします。

A 回答 (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
    • good
    • 0
この回答へのお礼

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

教えてくださり、ありがとうございました。

お礼日時:2007/09/30 17:49

検証してないのですが。



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
こちらで、どうでしょうか?
    • good
    • 0
この回答へのお礼

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

教えてくださり、ありがとうございました。

お礼日時:2007/09/30 17:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!