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

家計簿を1年分作っています。
1日分は5列づつで横並びです。
テンプレートを作り、12ヶ月分を複写しました。
F2には、例えば2月には、2023年2月1日のシリアル値:44958が入っています。

テンプレートは、各月31日で作っていますので、小の月や2月の日数を調整しなければなりません。
そこで、以下のVBAを作りましたが、

Sub EOM()

If Day(EOMonth($F$2,0)) = 28 Then

Range("EP1:FC41").EntireColumn.Delete

ElseIf Day(EOMonth($F$2,0)) = 29 Then

Range("EU1:FC41").EntireColumn.Delete

ElseIf Day(EOMonth($F$2,0)) = 30 Then

Range("EZ1:FC41").EntireColumn.Delete

End Sub

ところが、If文とElseif文が赤字になってしまいます。
どこが間違っているのでしょうか。

A 回答 (5件)

以下のようにしてください。


Sub EOM()

If Day(WorksheetFunction.EoMonth(Range("F2"), 0)) = 28 Then

Range("EP1:FC41").EntireColumn.Delete

ElseIf Day(WorksheetFunction.EoMonth(Range("F2"), 0)) = 29 Then

Range("EU1:FC41").EntireColumn.Delete

ElseIf Day(WorksheetFunction.EoMonth(Range("F2"), 0)) = 30 Then

Range("EZ1:FC41").EntireColumn.Delete
End If
End Sub
    • good
    • 0
この回答へのお礼

うまくいきました。ありがとうございます。

お礼日時:2023/02/11 16:48

#1です


ご質問とは関係ない事ですが、表組を想像するに 分岐処理は要らないような気がします
Sub EOM_Test()
Dim n As Integer
n = Day(Application.EoMonth(Range("$F$2"), 0))
Range(Cells(1, n * 5 + 6), Cells(1, "FC")).EntireColumn.Delete
End Sub
とは言え #2様の後半部分の回答を強く支持します
    • good
    • 0
この回答へのお礼

ありがとうございます。別途試して、参考にさせてもらいます。

お礼日時:2023/02/11 11:43

end ifがないから?

    • good
    • 0
この回答へのお礼

ありがとうございます。修正しました。

お礼日時:2023/02/11 11:43

こんにちは



いろいろありますね・・

>If文とElseif文が赤字になってしまいます
赤字になるのは「構文エラー」です。

>EOMonth($F$2,0)
の「$F$2」部分に変数又は数値等が期待されていて、「おかしな文字がある」というエラーだと思います。
仮に、[$F$2」部分を Rangeを示す変数にするか、あるいは面倒なら「"$F$2"」とでもすれば、赤字は消えますけれど、実行時にエラーになります。

そちらは、「EOMonthなる関数はないよ」というエラーですね。
VBAでワークシート関数を使う場合は、WorksheetFunctionとして使う必要があります。
https://learn.microsoft.com/ja-jp/office/vba/api …

月末を得たいのであれば、ワークシート関数ではなくVBAの関数を用いても計算できます。
https://vbabeginner.net/find-number-of-days-in-m …


とはいえ、元のシートが1年分で日付にシリアル値を用いているのなら、シートの日付を+1で計算するようにしておけば済む話のように思われますが、わざわざ「後から削除する」ような方法を取る意味がわかりません。
ご提示のコードでは2月だけですけれど、その調子だと小の月も「31日」を削除しなければならないのでは?

ひとまず、ごく簡単なカレンダーの作成例をご参考までに。
https://exceljoshi.cocoo.co.jp/media/excel-calen …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
すみません。言葉が足りないことに気がつきました。シートはテンプレートを含めて13枚なんです。

お礼日時:2023/02/11 11:47

If Day(WorksheetFunction.EoMonth(Range("$F$2"), 0)) = 28


を参考に書き直してください
また、End If もお忘れなく・・・
    • good
    • 0
この回答へのお礼

みなさん同様な正答をご教示くさって、本当に助かります。ありがとうございました。

お礼日時:2023/02/11 11:46

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