重要なお知らせ

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

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

あるシートにマクロが入っていて途中の文で
'シートクリア
Private Sub ClearSheet(ByVal sh As Worksheet, ByVal srow As Long, ByVal bcol As String, ByVal ecol As String, ByRef start_row)
Dim maxrow As Long '最大行番号
maxrow = sh.Cells(Rows.Count, bcol).End(xlUp).row '最終行を求める
If maxrow >= srow Then
'A~最後の列を最終行までクリア
sh.Range("A" & srow & ":" & ecol & maxrow).Value = ""
End If
start_row = srow
End Sub

というのが入っていますが、F列とO列はクリアにならないようにしたいのです。
事務の引継ぎでこのエクセルを修正したいのですがマクロの書き方が
分かりません。
どう書き直したらよいか修正後のマクロ分を張り付けて下さったらとても助かります。
お願いいたします。

A 回答 (4件)

検証していませんが、一例として



Private Sub ClearSheet(ByVal sh As Worksheet, ByVal srow As Long, ByVal bcol As String, ByVal ecol As String, ByRef start_row)
Dim maxrow As Long      '最大行番号
Dim ColNo As Long
Dim r1, r2
maxrow = sh.Cells(Rows.Count, bcol).End(xlUp).Row  '最終行を求める
ColNo = Range(ecol & "1").Column  'アルファベットを列番号に変換
  Set r1 = sh.Range("A" & srow & ":" & "E" & maxrow)
  Set r2 = sh.Range("G" & srow & ":" & "N" & maxrow)
  If maxrow >= srow Then  'F列=6 とO列=15 はクリアにならないように
    Select Case ColNo
    Case Is < 6
      sh.Range("A" & srow & ":" & ecol & maxrow).ClearContents
    Case Is = 6
      r1.ClearContents
    Case Is < 15
      r1.ClearContents
      sh.Range("G" & srow & ":" & ecol & maxrow).ClearContents
    Case Is = 15
      Union(r1, r2).ClearContents
    Case Is > 15
      Union(r1, r2).ClearContents
      sh.Range("P" & srow & ":" & ecol & maxrow).ClearContents
    End Select
  End If
  start_row = srow
End Sub
    • good
    • 0
この回答へのお礼

こんなに早くお答えして下さり有難うございました!!
実行してみたところ感動もので完璧にできました!

感謝いたします!

お礼日時:2020/04/07 08:57

#1です


>事務の引継ぎでこのエクセルを修正したいのですがマクロの書き方が分かりません。

処理できるであろうコードを示しましたが、このコードを弄るのは考え直した方が良いかも知れません。

引数があるプロシージャは、複数のプロセスから条件で使いまわしている可能性があります。
中身を弄ってしまうと、別のプロセスから呼んで実行した場合に不具合が発生する可能性が高いと思います。

示されているだけでしか分かりませんが、なんでstart_rowが返されているかもわからないので。。
処理の途中に限定的な処理を加えた方がまだ、安全です。
Dim sh As Worksheet
Dim maxrow As Long '最大行番号
Set sh = ActiveSheet 'など
maxrow = sh.Cells(Rows.Count, "A").End(xlUp).Row '最終行を求める
sh.Range("A" & srow & ":E" & maxrow).Value = ""
sh.Range("G" & srow & ":N" & maxrow).Value = ""
sh.Range("P" & srow & ":R" & maxrow).Value = ""   'R列まで消したいならR, P列より右なら良いです

いずれにしても、VBAの規模にもよりますが、一旦修正、改修を初めてどうにもならなくなるケースは
少なくないので、出来るだけリスクを回避して行った方が良いと思います。
    • good
    • 0
この回答へのお礼

アドバイスまでして下さり有難うございました!
その通りでこのマクロ以外にも色々なシートにマクロが作成されていて集計されているブックです。
NO1に書いてくださったマクロをそのまま入れて実行してみたところ、エラー等は出ずに実行できたので他のマクロに不具合はないかな?と思います。
エラーにならなくてもどこかの集計が出来なくなったりするのでしょうか?
素人なのでわかりませんが随時他の集計を確認しながら大丈夫か見ていきたいと思います。

またマクロ関係で質問した際にお暇なときに教えて下されば幸いです。
本当にありがとうございました。

お礼日時:2020/04/07 09:04

No.2の補足です。


もしクリアされる範囲の最終列が O列 の場合は、
以下の3行目(★)は削除して下さい。

sh.Range("A" & srow & ":" & "E" & maxrow).Value = ""
sh.Range("G" & srow & ":" & "N" & maxrow).Value = ""
★sh.Range("P" & srow & ":" & ecol & maxrow).Value = ""

せっかくO列を飛ばしても、3行目で
O列からP列を””にする、
という処理が走ってしまうので。
    • good
    • 0
この回答へのお礼

こんなに早くお答えして下さり有難うございました!!
実行してみたところ感動もので完璧にできました!

感謝いたします!

お礼日時:2020/04/07 08:58

sh.Range("A" & srow & ":" & ecol & maxrow).Value = ""



この行が、
A列の範囲最初の行 から 最後の列の最終行 を "" にする
という式なので、単純にF列とO列を除くためには

A~E列を""にする。
(F列はそのまま)
G~N列を""にする。
(O列はそのまま)
P~最終列を""にする。

という処理に変えればいいので

sh.Range("A" & srow & ":" & "E" & maxrow).Value = ""
sh.Range("G" & srow & ":" & "N" & maxrow).Value = ""
sh.Range("P" & srow & ":" & ecol & maxrow).Value = ""

と3つの式に書き換えれば良いですね。




Private Sub ClearSheet(ByVal sh As Worksheet, ByVal srow As Long, ByVal bcol As String, ByVal ecol As String, ByRef start_row)
Dim maxrow As Long '最大行番号
maxrow = sh.Cells(Rows.Count, bcol).End(xlUp).Row '最終行を求める
If maxrow >= srow Then
'A~最後の列を最終行までクリア(F,O列を除く)
sh.Range("A" & srow & ":" & "E" & maxrow).Value = ""
sh.Range("G" & srow & ":" & "N" & maxrow).Value = ""
sh.Range("P" & srow & ":" & ecol & maxrow).Value = ""
End If
start_row = srow
End Sub
    • good
    • 0

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