プロが教えるわが家の防犯対策術!

月の集計の表を作っています。
31日分の列(複数列から構成)をテンプレートにしているため、
各セルに日付を入れていくと、小の月の末に次の月の日付が入ってしまいます。
次月の日付が表示される列自体が削除されるよう、以下のように書いてみました。
当然でしょうが、エラーになりました。
F2セルにはシリアル値を入れました。
ご教示お願いします。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub deleteAfterEOM()

'28のとき
If Day(EoMonth(Range("F2"))) = Range("EK1") Then
Range("EP1:FC41").EntireColumn.delete

'29のとき
ElseIf Day(EoMonth(Range("F2"))) = Range("EP1") Then
Range("EU1:FC14").EntireColumn.delete

'30のとき
ElseIf Day(EoMonthRange(("F2"))) = Range("EU1") Then
Range("EZ1:FC14").EntireColumn.delete

End Sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

A 回答 (3件)

ワークシート関数の「EoMonth」に手がかりを掴んでいたようでしたので、


こちらを使うようにすると・・・

先の回答に書いた 「EOM = 」の行をこちらに置き換えて見てください。

EOM = Day(Application.WorksheetFunction.EoMonth(Range("F2"), 0))


WorksheetFunction ワークシート関数の・・・
EoMonth を使います。
という具合にちょっと特殊な書き方になります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
EoMonthと唐突に書いてもダメなんですね。
Application…から指定してやらないと辿れないとわかりました。

お礼日時:2023/02/05 11:58

F2には今日の日付か何かが入ってるんですよね?


質問内容に書かれてた、ご自身で考えられた内容を完全無視でつくってみました。

お試しください。

処理では、削除ではなく「削除対象を選択状態」としています。
実際に動作を確認してみて、問題が無いようでしたら、
「.Select」 → 「.Delete」
と書き換えてください。


Sub deleteAfterEOM()
'EOM に F2の月の最終日を入れます
  Dim EOM As Long
  EOM = Day(DateSerial(Year(Range("F2")), Month(Range("F2")) + 1, 0))
'29日 EP列 は Colunm146
'30日 EU列 は Colunm151
'31日 EK列 は Colunm156
'月末日以降に消す先頭列は以下の式になる
' 161 - ( 31 - [月末日] )×5
'削除最終列 FC列 は Column159
'なので・・・
  If EOM < 31 Then
    Range(Columns(161 - (31 - EOM) * 5), Columns(159)).Select
  End If
End Sub
    • good
    • 0
この回答へのお礼

少し時間をください。試してみます。

お礼日時:2023/02/05 08:58

すみません。


'28のとき
If Day(EoMonth(Range("F2"))) = Range("EK1") Then
の文を日本語で説明していただけませんでしょうか。

EK1には、どのような値が設定されていますか。
F2にはシリアル日付ということですが、F2がどのような値で、
EK1がどのような値の時、この条件が成立しますか?
    • good
    • 0
この回答へのお礼

"f2"はその月の1日のシリアル値を入れてあります。
読み下すと、「もし、シリアル値で入れた日を含む月の月末日と、EK1(28という数値が入っているセル)が同じ値なら」という意味で書いたんですけど…。
あまり基本を勉強はしていませんので、文法やら間違っていると思います。
よろしくお願いします。

お礼日時:2023/02/05 11:57

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