重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

いつもお世話になっています。2点ばかりエクセルマクロについてご教示ください。

現在、私の職場では、集計表と日計表からなるブックを作成しており、日計表のシート名は1から31という名(半角)であり、順番に並んでいます。日計表に必要なデータを入力すれば、集計表に記載されている関数で、自動的に転記されるようになっています。月がかわるときに日計表の入力部分をマクロでクリアしています。しかし、消去のマクロの記述としては毎日の日計データシートを直接アクティブにして、毎月の変動箇所を消去するという不恰好なことをやっています。ソースは下記のとおりです。

Sheets("1").Select
Range("C5:F47").Select
Selection.ClearContents
Sheets("2").Select
Range("C5:F47").Select
Selection.ClearContents
  ~
Sheets("31").Select
Range("C5:F47").Select
Selection.ClearContents

シート名を変数にしてFor Next文などを使ってもっとスマートにできると思うのですが、いろいろ試行錯誤をやってみてもうまくいきません。ご教示いただければ幸いです。

もうひとつの質問は、日計シートには数字以外の場所を保護したいのですが、あらかじめ入力部分セルをロックしてシートを保護すると、ロックしている部分のみ消去を指定しているにもかかわらず「シートが保護されている」とでて、マクロが停止されてしまいます。この方法についてもご教示いただければ幸いです。

OSは windows7
エクセルは 2013です。

A 回答 (3件)

こんにちは。


各シートの同じ範囲をクリアしたいということですよね?

方法はいろいろあると思いますが、以下一例です。
Sub Sample1()
 Dim i As Integer
 For i = 1 To 31
  Worksheets(i).Range("C5:F47").ClearContents
 Next i
End Sub

>あらかじめ入力部分セルをロックしてシートを保護すると、
>ロックしている部分のみ消去を指定しているにもかかわらず~~
え~と。ちょっと勘違いなさっているかも。
「ロックした」部分は、シートの保護をされた時にむやみに変更できなくなる部分ということです。
それなので、「ロックしている部分のみ消去」しようとすると警告が出るのは正しい応答だと思われます。

ついでですが、時にはロックした部分をマクロから操作可能にしたい場合がありますが、その場合は
 Workbook.Protect や Worksheet.Protect
を利用して、保護を一旦解除してから必要な操作を行い、終了後に元に戻すという方法をとることで可能になります。
    • good
    • 0
この回答へのお礼

早速のご教示ありがとうございます。
なるほど、Worksheets(i)でいけたのですね。難しく考えすぎていました。
ご教示ありがとうございました。
また機会があればよろしくお願いします。

お礼日時:2016/04/26 21:40

削除する範囲が決まっているなら、その範囲に名前をつけて、その範囲名で処理をしてはどうか。


そのほうがスマートな気がする。
マクロを使わなくても範囲名を指定することでDELキー一発で消せたりするし…。

ロックしたセルは保護対象なので、シートを保護すると削除やセルの変更はできなかった気がするんですけど。
マクロを使うときって関係なかったっけ?
    • good
    • 0
この回答へのお礼

なるほど、名前をつけるという手もあるのですね
その方がソースのドキュメント性がよくなりますね
ありがとうございました。

お礼日時:2016/04/26 21:41

ロックに関しては、状況がわかりかねるのですが、とりあえずの対策としては、マクロの最初と最後にProtectメソッドとUnprotectメソッドで制御するか、マクロの最初にprotectメソッドにUserInterfaceOnly:=trueを追加するといいかと思います。



for~next文ですが、次の様な感じにされるといいと思います。

dim i as integer
for i = 1 to 31
Sheets(i).Select
Range("C5:F47").Select
Selection.ClearContents
next

ただ、単純にデータを消すだけしたら、selectする必要もありませんので、以下の様にまとめることが可能です。

dim i as integer
for i = 1 to 31
Sheets(i).Range("C5:F47").ClearContents
next

あとは、Sheet(i)の上に、Sheets(i).protect UserInterfaceOnly:=trueを追加するれば、恐らく、入力はプロテクトされたままで、マクロが動くかと思います。
    • good
    • 0
この回答へのお礼

速のご教示ありがとうございます。
なるほど、sheets(i)でもいけたのですね。難しく考えすぎていました。
ご教示ありがとうございました。
また機会があればよろしくお願いします。

お礼日時:2016/04/26 21:40

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