![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
いつも大変お世話になっております。
VBAによる月間カレンダーの作成についてVBAにお詳しい方のご教示をお願い致します。
添付画像の月間カレンダーをVBAで作成したいと思っております。
作成したいプログラムの構成を下記に記述させていただきます。
B5セルはE2セルと=で結ばれ、月間カレンダーの初日が始まりH5セルで折り返し、下に4セル降りたB10セルからH10セルまで入力を月末の日付まで繰り返し出力。
翌月は表示しない。
28日、29日、30日の月はそれに対応し罫線を引きまう。
B4セルにはE2セルの開始月からの曜日をH4まで出力。
また土曜日は青、日曜日は赤色を設定。
最後に各日付の下の4セルの中は結合し画像の様に罫線の処理をしたいプログラムになります。
以上が私の構築したいVBAプログラムになります。
誠に厚かましいお願いになりますが、どうかよろしくお願い致します。
![「VBAによる月間カレンダーの作成について」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/8/943663_594574bdd60f3/M.jpg)
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数指定セルの可視セルのみを別シートに転記するVBAについて 2 2022/05/27 21:19
- Visual Basic(VBA) 【再投稿】VBAのシフト表でバグが出て困っています 3 2022/09/24 08:29
- Excel(エクセル) エクセルについて教えてください。 1 2023/03/03 08:38
- Excel(エクセル) 条件付き書式の色付きセルのカウント方法について 2 2022/10/21 14:51
- Excel(エクセル) エクセルでカレンダーを作りたい 5 2023/05/16 07:32
- Excel(エクセル) エクセルの祝日に色が反映しない 4 2022/05/18 09:58
- Excel(エクセル) IF 関数で「〇〇 という文字を含む場合」の分岐処理で表示された数字はSUMで数字集計できますか? 3 2022/08/02 16:29
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Visual Basic(VBA) VBAで自動集計(特定セルコピー月ごとに値貼り付け)したい。 6 2023/06/25 11:37
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
EXCEL VBA 文中の書式ごと複写...
-
Excel 範囲指定スクショについ...
-
Excel UserForm の表示位置
-
【VBA】【ユーザーフォーム_Lis...
-
指定した文字から指定した文字...
-
エクセルVBA 配列からセルに「...
-
【Excel VBA】一番右端セルまで...
-
VBAコードについて教えてくださ...
-
C# DataGridViewで複数選択した...
-
特定の色のついたセルを削除
-
Excel VBAでCheckboxの名前を変...
-
VBAでユーザーフォームにセル値...
-
【VBA】写真の貼り付けコードが...
-
DataGridViewでグリッド内に線...
-
EXCELのフォーム上でリアルタイ...
-
入力規則のリスト選択
-
DataGridViewで指定したセルの...
-
エクセル、マクロで番号を読込...
-
【Excel VBA】マクロで書き込ん...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
エクセルVBA 配列からセルに「...
-
Excel UserForm の表示位置
-
Excelで空白セル直前のセルデー...
-
【Excel VBA】一番右端セルまで...
-
EXCEL VBA 文中の書式ごと複写...
-
VBA にて、条件付き書式で背景...
-
特定の色のついたセルを削除
-
【VBA】【ユーザーフォーム_Lis...
-
VBA 複数条件の分岐処理の上手...
-
入力規則のリスト選択
-
【VBA】写真の貼り付けコードが...
-
Excel VBA IF文がうまく動作し...
-
VBAでユーザーフォームにセル値...
-
VBA:日付を配列に入れ別セルに...
-
Excel VBAでCheckboxの名前を変...
-
エクセルの合計を自動で表示さ...
-
関数の引数でrangeを指定したとき
-
複数指定セルの可視セルのみを...
-
DataGridViewでグリッド内に線...
おすすめ情報