私は、月曜から日曜までの7列×(最大)6行の、よくあるカレンダーみたいな形に、前月の21日始まりで出力したい、と言うことだと読み取りました。違っていたら無視してください。(^-^;
それもVBAでやっちゃいましたが・・・ダメなのかな?
----------
2003 5
月 火 水 木 金 土 日
21 22 23 24 25 26
27 28・・・
----------
(・・・レイアウトくずれるかな・・・)
前提条件:カレンダーの形式は上記、年月指定はA1に年、B1に月を入力する。4行目のA~G列に月~日と固定で指定されているとする。
1. Worksheet_ChangeでA1、B1が変更された時のみ、カレンダーの設定を行う。
2. 前月の21日を算出。(指定月の21日でいいのかな?なにが普通かわからない(笑))
3. Weekday関数で算出した日付の曜日を計算。
4. 開始行の設定。(前提条件から今回は4。)
5. 該当の曜日に日を出力。
6. DateAdd関数で1日加算。(日付系の計算でないとうるう年等の判断が面倒だから。)
7. 指定月の21日になったら終了。(指定月から始めた場合は翌月です。)
8. 列を1加算。7より大きくなった場合は1に戻し、行を1加算。
9. 5に戻る。
例えば、曜日間、週間に入力欄が欲しければ、加算の数値を増やせば対応できます。
以下、(くずれて見にくくなると思いますが)私がテストしてみたロジックです。サンプル程度にご参照ください。。。
Private Sub SetCal(ByVal strYear As String, ByVal strMonth As String)
Dim CalDate As Date
Dim intCol As Integer
Dim intRow As Integer
Dim intStartCol As Integer
Dim intColAdd As Integer
Dim intRowAdd As Integer
intStartCol = 0 '開始列がBなら1、Cなら2・・・
intColAdd = 0 '曜日間に空けたい列数
intRowAdd = 0 '週間に空けたい行数
'イベント起動を不可に
Application.EnableEvents = False
Range(Cells(4, 1 + intStartCol), Cells(9, 7 + intStartCol)).ClearContents
CalDate = DateAdd("m", -1, strYear & "/" & strMonth & "/21") '前月の21日
intRow = 4 '開始行を指定
intCol = Weekday(CalDate, vbMonday) + intStartCol '開始列算出
Do
Cells(intRow, intCol) = Day(CalDate)
CalDate = DateAdd("d", 1, CalDate)
If Day(CalDate) = 21 Then Exit Do
intCol = intCol + 1 + intColAdd
If intCol > 7 + intStartCol Then
intCol = 1 + intStartCol
intRow = intRow + 1 + intRowAdd
End If
Loop
Application.EnableEvents = True
End Sub
お礼
せっかくいただいた回答ですので、お礼は十分回答の内容を理解してからと考えておりまして、折りしも仕事がはいってしまい、そういった事情で、お礼が遅れたことをお詫びします。いただいた回答のおかげで解決しそうです。本当にありがとうございました。