goo blog サービス終了のお知らせ 

パソコンカレッジ スタッフのひとりごと

パソコンスクールのスタッフが、
初心者から上級者まで役立つ情報をお伝えします。

VBAでカレンダーを作成しよう(Excel2002以降)

2011-07-21 09:01:06 | ExcelVBA
毎日暑い日が続いていますね。体調を崩さないようにご注意ください。

さて、今日はカレンダーを作成します。
方法はたくさんあるでしょうが、今回は、VBAを使って作ってみましょう。
せっかくですから、年と月を自由に指定できるようにしますよ。

下の図が、今回のカレンダーです。
年と月を指定し、作成ボタンを押すと、カレンダーが自動的に作成されます。

あらかじめ、1行目の曜日の見出しと枠線は、作りこんでおいてください。





それでは、VisualBasicEditorを起動します。
Altキーを押しながらF11キーを押すと起動します。

挿入メニューから「標準モジュール」をクリックします。
これでコードを書く準備が整いました。

べたなプロシージャ名ですが、「カレンダー作成」とし、コードを記述してください。

Sub カレンダー作成()
  Range("A2:G7").Value = ""
  MakeCalendar
End Sub



画像も載せておきます。




処理内容としては、日付をクリアして、MakeCalendarというプロシージャを呼び出すだけです。
つまり、カレンダー作成のメインプログラムは、MakeCalendar なのです。


それでは、その MakeCalendar のコードを書きましょう。


Sub MakeCalendar()
  '条件分岐を使ったプロシージャ

  Dim nen As Integer, tsuki As Integer
  nen = Range("J1").Value
  tsuki = Range("L1").Value

  Dim FirstDay As Date
  'ユーザーが指定した年月の1日目を日付として生成
  FirstDay = DateSerial(nen, tsuki, 1)
  Dim lastDay As Integer
  lastDay = Day(DateSerial(nen, tsuki + 1, 1) - 1)

  Dim RowNo As Integer
  Dim ColumnNo As Integer

  RowNo = 2
  ColumnNo = Weekday(FirstDay, vbSunday)

  Dim i As Integer
  For i = 1 To lastDay
    Cells(RowNo, ColumnNo).Value = i
    If ColumnNo = 7 Then
      ColumnNo = 1
      RowNo = RowNo + 1
    Else
      ColumnNo = ColumnNo + 1
    End If
  Next

End Sub





繰り返し処理と条件分岐を駆使します。
列番号が7になると、次の行の1列目に移動する点がポイントです。





これでめでたしめでたし、といきたいところですが、これでは、短すぎて、ケンさんに怒られてしまうので、
もう少し、お付き合い下さい。

カレンダーのように、一定の周期で繰り返されるデータに関しては、工夫すると条件分岐を使わないで済む場合があります。
少しばかり、頭を使いますが、これもパズルのようで楽しいもんです。

周期のある場合、よく使うのが割り算です!
それも、余り(剰余)が大活躍します。
今回も、基本的には、7で割った余りをうまく使います。これが列を特定するのに役立ちます。
行は、割り算の商を活用します。

それでは、MakeCalendar1 という名前でプロシージャを書いてみましょう。

Sub MakeCalendar1()
  '条件分岐を使用しないでカレンダーを作成

  Dim nen As Integer, tsuki As Integer
  nen = Range("J1").Value
  tsuki = Range("L1").Value

  Dim FirstDay As Date
  'ユーザーが指定した年月の1日目を日付として生成
  FirstDay = DateSerial(nen, tsuki, 1)

  Dim k As Integer
  'ユーザーが指定した年月の1日目の曜日を取得
  '日曜:1 月曜:2 火曜:3 ・・・
  k = Weekday(FirstDay, vbSunday)

  Dim lastDay As Integer
  'ユーザーが指定した年月の末日を取得
  '翌月1日の前日が、当月の末日
  lastDay = Day(DateSerial(nen, tsuki + 1, 1) - 1)

  Dim i As Integer
  Dim r As Integer, c As Integer
  For i = k To k + lastDay - 1
    '行番号を算出
    '7で割った商に補正係数の2を加算
    r = Int((i - 1) / 7) + 2
    '列番号を算出
    '7で割った余りに1を加算
    c = (i - 1) Mod 7 + 1
    '上記の行列番号の番地のセルに数字の1から順番に代入
    Cells(r, c).Value = i - k + 1
  Next

End Sub




解説は、コードに書いておきました。

行も列も、商や剰余を使って、どうやったらカレンダーができるか、考えてみると面白いですよ。

ループのカウンター変数iの設定を
For i= 1 to 31
にして、
Cells(r, c).Value = i
にしてから実行すると、仕組みが分かりやすいでしょう。



なお、このMakeCalendar1 を使ってカレンダーを作成するには、ボタンにこのプロシージャを登録してください。


ちなみに、今日から50年後の2061年7月のカレンダーを作成してみました。
なんと!今年と同じ曜日でした!!





だい

コメント (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« シート別の表にページ番号を... | トップ | 今週のおすすめ記事 »
最新の画像もっと見る

2 コメント(10/1 コメント投稿終了予定)

コメント日が  古い順  |   新しい順
すごすぎます (long_way_to_go)
2011-07-22 04:43:39
いつも思うのですが、本当にコンピューターに関する知識が膨大なんですね。すごすぎます・・・。
返信する
long_way_to_goさんへ (だい)
2011-07-29 13:02:35
コメントありがとうございます。
励みに今後もがんばります。
でも、私もまだまだ駆け出しです。毎日が勉強です。
返信する

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。

ExcelVBA」カテゴリの最新記事