
いつも大変お世話になっております。
VBAによる月間カレンダーの作成についてVBAにお詳しい方のご教示をお願い致します。
添付画像の月間カレンダーをVBAで作成したいと思っております。
作成したいプログラムの構成を下記に記述させていただきます。
B5セルはE2セルと=で結ばれ、月間カレンダーの初日が始まりH5セルで折り返し、下に4セル降りたB10セルからH10セルまで入力を月末の日付まで繰り返し出力。
翌月は表示しない。
28日、29日、30日の月はそれに対応し罫線を引きまう。
B4セルにはE2セルの開始月からの曜日をH4まで出力。
また土曜日は青、日曜日は赤色を設定。
最後に各日付の下の4セルの中は結合し画像の様に罫線の処理をしたいプログラムになります。
以上が私の構築したいVBAプログラムになります。
誠に厚かましいお願いになりますが、どうかよろしくお願い致します。

No.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様のご指摘にもありますが、普通のカレンダーは曜日が固定(「日月火・・・」または「月火水・・・」)なのが一般的な表示方法だと思いますので、そのような表示にするのが良さそうに思いますが・・・?
fujillin様二通りのプログラムコードありがとうございます。
参考に致します。
考え方次第で構成は変わり、コードも別物になるんですね。
自分の考えで少しずつプログラムを記述して行き勉強して行こうと思います。
ありがとうございました。
No.1
- 回答日時:
B5は必ず1日になるということでいいでしょうか?
であれば、ほぼほぼVBAを使わなくてもできそうです。
VBAの勉強ということなら別ですが。。。
1日から28日はVBAではなく数字固定で大丈夫ですよね。
工夫が必要なのは29日~31日、ここは式で開始日から29日足して月が替わるかどうかで"29"を出力させるかどうかを決める、以降30日、31日も同様。
罫線は条件付き書式で日付が表示されてたら罫線を引くようにしてあればできそう。
曜日は、1日から7日までの曜日を文字列で出力し同じく条件付き書式で土曜日を青、日曜日を赤にすれば。
B2~C2までは書式でだせるので、E2に必ず1日を指定すれば。
VBAの勉強ということであれば、逆に曜日を固定して、1日をその曜日から開始するようなものを目指されたらいかがでしょうか?
genjitutouhi様回答ありがとうございます。
VBAの勉強なのでこの場合のカレンダー作成になりますと、どの様な構成になるのかを知りたいので他の回答者様の回答を待ってみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel UserForm の表示位置
-
DataGridViewでグリッド内に線...
-
VBAを用いた散布図グラフの線種...
-
VBAについて
-
excelで結合セルの場合にエラー...
-
繰返し計算の高速化の方法をご...
-
セルの値を比較してセルの値の色を...
-
エクセルでシートを保護すると...
-
罫線の斜線を自動で引くマクロ
-
あああ..ああい..ああう とい...
-
「段」と「行」の違いがよくわ...
-
Excel VBAでのWorksheet_Change...
-
EXCELのダイアログシートって、...
-
Excelのフィルター後の一番上の...
-
vba マージエリアの行数を非表...
-
【エクセル】フリーワード検索...
-
マクロの相対セル参照記録って?
-
エクセルファイルを開いた回数...
-
ListViewで列を指定して表示さ...
-
アクティブになっている行をマ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel UserForm の表示位置
-
VBAマクロ実行時エラーの修正に...
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
特定の色のついたセルを削除
-
C# DataGridViewで複数選択した...
-
【VBA】【ユーザーフォーム_Lis...
-
データグリッドビューの結合セ...
-
【VBA】写真の貼り付けコードが...
-
VBA:日付を配列に入れ別セルに...
-
入力規則のリスト選択
-
セルの半透明着色処理
-
EXCEL VBA 文中の書式ごと複写...
-
Excel VBAでCheckboxの名前を変...
-
【ExcelVBA】値を変更しながら...
-
【Excel VBA】一番右端セルまで...
-
エクセルのカーソルを非表示に...
-
DataGridViewのフォーカス遷移...
-
DataGridViewでグリッド内に線...
-
Excel VBA でFunctionプロシジ...
おすすめ情報