いつも大変お世話になっております。
VBAによる月間カレンダーの作成についてVBAにお詳しい方のご教示をお願い致します。

添付画像の月間カレンダーをVBAで作成したいと思っております。
作成したいプログラムの構成を下記に記述させていただきます。

B5セルはE2セルと=で結ばれ、月間カレンダーの初日が始まりH5セルで折り返し、下に4セル降りたB10セルからH10セルまで入力を月末の日付まで繰り返し出力。
翌月は表示しない。
28日、29日、30日の月はそれに対応し罫線を引きまう。
B4セルにはE2セルの開始月からの曜日をH4まで出力。
また土曜日は青、日曜日は赤色を設定。
最後に各日付の下の4セルの中は結合し画像の様に罫線の処理をしたいプログラムになります。
以上が私の構築したいVBAプログラムになります。

誠に厚かましいお願いになりますが、どうかよろしくお願い致します。

「VBAによる月間カレンダーの作成について」の質問画像

A 回答 (2件)

こんにちは



>VBAの勉強なので~~
とのことなので、丸投げ的に作ってもらっても勉強にならないでしょう。
コードは人によって、考え方によって千差万別なので、回答されたコードが良いとは限りませんし、それが唯一の解決方法というわけでもありません。
まずは自分で作成してみて、うまくいかないところや調べてもわからないところについて質問なさったほうが、ご自身の向上に結び付くと思います。

>どの様な構成になるのかを知りたいので~~
上にも述べたように、考え方次第で構成は変わりますし、コードも別物になります。
同じ考え方であっても、人によって実際のコードは変わります。

また、エクセルの場合は、エクセルが持っている機能をどこまで利用するかによってもコードは大きく変わってきます。
例えば、日付は1、2、3・・・の文字(数値)を入れておくのか、日付型で実際の日付を入れて、セルの書式で日付のみ表示するようにするかとか、曜日の表示等についても同様ですね。その書式設定は、事前にセットしておくのかVBAで書式もセットするのかなど。
さらには、曜日の色付けやセルの枠線なども、エクセルの条件付き書式でやれば簡単ですが、VBAで直接設定することも可能です。
これらによっても、作成するコードの内容は変わってきますね。


例として、ご提示の図で日付の数値を表示する部分だけ考えてみると…
セルには日付型の数値を記入するものと仮定します。

考え方はいろいろあると思いますが、大きく分けて2通りの例を。
1)セル範囲でループする
 For rw = 5 To 20 Step 5
  For cl = 2 To 8
   'セルに日付を記入する処理
  Next cl
 Next rw
のような構文で、順に日付を設定して行く考え方。
途中で、日付がその月を超えたらブランクを記入します。

2)1日から順に記入して行く考えかた
 Do While tmpDay <= endDay
  'セルに日付を記入する処理
 Loop
のようなループで記入してゆく方法ですが、日付からセルの位置を計算する必要があるでしょう。

この他にも、考え方はいろいろあると思いますが、この2つだけでも作成されるコードは別の物になります。
1)の例
d = Range("E2").Value
tmpDay = DateSerial(Year(d), Month(d), 1)
endDay = DateSerial(Year(d), Month(d) + 1, 0)

For rw = 5 To 25 Step 5
 For cl = 2 To 8
  If tmpDay <= endDay Then
   Cells(rw, cl).Value = tmpDay
  Else
   Cells(rw, cl).Value = ""
  End If
  tmpDay = tmpDay + 1
 Next cl
Next rw

2)の例
d = Range("E2").Value
tmpDay = DateSerial(Year(d), Month(d), 1)
endDay = DateSerial(Year(d), Month(d) + 1, 0)
Set r = Range("B5")

Do While tmpDay <= endDay
 r.Value = tmpDay
 If Day(tmpDay) Mod 7 = 0 Then Set r = r.Offset(5, -6) Else Set r = r.Offset(, 1)
 tmpDay = tmpDay + 1
Loop

なお、2)のコードでは月末までしかループしていませんので、事前に全体をクリアしておくなどの処理が必要になります。
(ループ範囲を変えて、1)のように処理する方法もあるでしょう)
また、1)と2)では、記入するセルの指定方法の考え方もあえて変えています。

ご質問の内容ですと、実際には、1日~28日までの表示は固定でもよいので、先に(単純な数値型で)1~28を記入しておいて、5段目だけ処理すれば十分という考え方もできます。


※ ANo1様のご指摘にもありますが、普通のカレンダーは曜日が固定(「日月火・・・」または「月火水・・・」)なのが一般的な表示方法だと思いますので、そのような表示にするのが良さそうに思いますが・・・?
    • good
    • 0
この回答へのお礼

fujillin様二通りのプログラムコードありがとうございます。
参考に致します。
考え方次第で構成は変わり、コードも別物になるんですね。
自分の考えで少しずつプログラムを記述して行き勉強して行こうと思います。
ありがとうございました。

お礼日時:2017/06/20 03:08

B5は必ず1日になるということでいいでしょうか?


であれば、ほぼほぼVBAを使わなくてもできそうです。
VBAの勉強ということなら別ですが。。。

1日から28日はVBAではなく数字固定で大丈夫ですよね。
工夫が必要なのは29日~31日、ここは式で開始日から29日足して月が替わるかどうかで"29"を出力させるかどうかを決める、以降30日、31日も同様。
罫線は条件付き書式で日付が表示されてたら罫線を引くようにしてあればできそう。

曜日は、1日から7日までの曜日を文字列で出力し同じく条件付き書式で土曜日を青、日曜日を赤にすれば。
B2~C2までは書式でだせるので、E2に必ず1日を指定すれば。

VBAの勉強ということであれば、逆に曜日を固定して、1日をその曜日から開始するようなものを目指されたらいかがでしょうか?
    • good
    • 1
この回答へのお礼

genjitutouhi様回答ありがとうございます。
VBAの勉強なのでこの場合のカレンダー作成になりますと、どの様な構成になるのかを知りたいので他の回答者様の回答を待ってみます。
ありがとうございました。

お礼日時:2017/06/19 05:29

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


人気Q&Aランキング

おすすめ情報