参考文献
最終イメージ
・同じA列に描画していた月と日と曜日を仕様通りA〜C列に別々にわけて描画するようコードを変更する
まずは罫線と列幅を使用通りに描画
・A~Dの4列の表にする
・前の回で学んだ列幅を設定するColumnWidthプロパティを用いてA~D列の列幅を使用通り設定、罫線も仕様通りひく
やり方についてはこちらを参照
(作成イメージ)
※A列は「8/26(水)」という形式を表示するには幅が足りなくなり、
###と表示されているが、問題ない
(コード)
Public Sub スケジュール表描画() Workbooks.Add '新規ブック追加 Range("A1").Value = "2009/8/26" ’A1セルに2009年8月26日の文字列を入力 Range("A1").NumberFormatLocal = "m/d(aaa)" ’表示形式を設定 'オートフィルで連続した月日曜日を描画 Range("A1").AutoFill Destination:=Range("A1:A32"), Type:=xlFillSeries Range("A1:D32").Borders.Weight =xlThin '格子状の細線を引く Range("A1:D32").BorderAround Weight:=xlThick '周囲に太線をひく Range("A1").ColumnWidth = 3 'A列の列幅を3に設定 Range("B1").ColumnWidth = 3 'B列の列幅を3に設定 Range("C1").ColumnWidth = 3 'C列の列幅を3に設定 Range("D1").ColumnWidth = 40 'D列の列幅を40に設定 End Sub
変数のより高度な使い方にチャレンジ
・次に月と日と曜日をA〜C列に分けて描画するようコードを追加・変更する
⇨それぞれの数値や文字列を日付から取得する必要がある
⇨日付データから月の数値を取り出すにはMonth関数を使う。同様にDay関数、Weekday関数とWeekdayName関数を組み合わせることで描画できるが、オートフィルで一旦入力した日付データを取り出し関数で処理した後、月の数値で上書きすることになる。そうなると日付データを各列に入力する処理は全く無駄になる
⇨A列に各セルに入力した日付データを一度どこか別の列に取り出しておく手法でも、できるが無駄があり処理が面倒になる
⇨そこで、今回はオートフィルではなく、変数とループを組み合わせた手法で、月と日と曜日を列を分けて描画する
(ポイント)
・日付データはセルに一旦入力せず、変数としてプログラム内で直接扱う
⇨その変数は日付データを扱うということで日付型Date型として宣言して用意する
Date型変数を宣言
👇
Date型変数に2009年8月26日を代入
👇
Do Until…Loopステートメントにて繰り返す中で、Date型変数を1日ずつ進めながら、スケジュール表のA〜C列に月と日と曜日を1行ずつ入力
👇
2009年9月26日に達したらループ終了
コードの変更
Option Explicit Public Sub スケジュール表描画() Dim myDate As Date '処理中の日付を表す変数 Workbooks.Add '新規ブック追加 'Range("A1").Value = "2009/8/26" ’A1セルに2009年8月26日の文字列を入力 'Range("A1").NumberFormatLocal = "m/d(aaa)" ’表示形式を設定 'オートフィルで連続した月日曜日を描画 'Range("A1").AutoFill Destination:=Range("A1:A32"), Type:=xlFillSeries myDate = #8/26/2009# 'myDateを2009年8月26日にセット Range("A1").Value = Month(myDate) 'A列に月を入力 Range("B1").Value = Day(myDate) 'B列に日を入力 Range("C1").Value = WeekdayName(Weekday(myDate),True) 'C列に曜日を入力 Range("A1:D32").Borders.Weight =xlThin '格子状の細線を引く Range("A1:D32").BorderAround Weight:=xlThick '周囲に太線をひく Range("A1").ColumnWidth = 3 'A列の列幅を3に設定 Range("B1").ColumnWidth = 3 'B列の列幅を3に設定 Range("C1").ColumnWidth = 3 'C列の列幅を3に設定 Range("D1").ColumnWidth = 40 'D列の列幅を40に設定 End Sub
(ポイント)
・曜日の文字の取得は日付データから取得できるVBA関数はないので、2段階を踏む
⇨Weekday関数で曜日を表す整数値を取得『Weekday(日付データ)』、
取得した曜日を表す数値からWeekdayName関数を使って曜日名の文字列に変換する『WeekDayName(曜日を表す整数値), 曜日名の省略』
⇨第2引数には、省略した曜日名の文字列を取得するならTrueを指定
⇨Weekday(myDate),True
コードの整理・改良
(ポイント)
- 数値や文字列などを直接記述している箇所を呈すに置き換える
- セルのアドレスを直接記述している箇所を、基点セルを基準に指定するよう変更
- Withステートメントを使い、同じオブジェクトに関する処理の記述をまとめる
先に変数などの命名ルールを決めておく
(例) ・英数字記号のみで命名 ・英単語で命名 ・変数と定数の区別 ①プロシージャレベル変数 ⇨アルファベット小文字で始まり、複数の単語で構成される定数名は、当たらな単語の冒頭1文字のみ大文字 (例):myDate ②モジュールレベル変数 ⇨アルファベット小文字の「m」を必ず頭につける (例):mMyDate ③定数 ⇨全てアルファベット大文字、複数の単語で構成される定数名は、単語の区切り毎に「_(アンダースコア)」を入れる (例):MONTH_WIDTH
Option Explicit Const ORG_DATE As Date = #8/26/2009# '開始年月日 Const DST_DATE As Date = #9/26/2009# '終了年月日 Const DAY_OFST As Integer = 1 '日を描画する列の位置 Const WEEKDAY_OFST As Integer = 2 '曜日を描画する列の位置 Const MONTH_WIDTH As Integer = 3 '月の列幅 Const DAY_WIDTH As Integer = 3 '日の列幅 Const WEEKDAY_WIDTH As Integer = 3 '曜日の列幅 Const SCHDL_WIDTH As Integer = 40 'スケジュール欄の列幅 Public Sub スケジュール表描画() Dim myDate As Date '処理中の日付を表す変数 Workbooks.Add '新規ブック追加 myDate = ORG_DATE 'myDateを開始年月日にセット Range("A1").Activate 'A1セルをアクティブセル化 Do Until myDate > DST_DATE '処理中の日が終了年月日に達するまでループを回す ActiveCell.Value = Month(myDate) '左端の列に月を入力 ActiveCell.Offset(0, DAY_OFST).Value = Day(myDate) '月の1列右隣に日を入力 ActiveCell.Offset(0, WEEKDAY_OFST).Value _ = WeekdayName(Weekday(myDate), True) '月の2列右隣に曜日を入力 myDate = DateAdd("d", 1, myDate) '処理中の日付を1日進める ActiveCell.Offset(1, 0).Activate 'アクティブセルを1行進める Loop Range("A1:D32").Borders.Weight = xlThin '格子状の細線を引く Range("A1:D32").BorderAround Weight:=xlThick '周囲に太線を引く Range("A1").ColumnWidth = MONTH_WIDTH '月の列幅を設定 Range("B1").ColumnWidth = DAY_WIDTH '日の列幅を設定 Range("C1").ColumnWidth = WEEKDAY_WIDTH '曜日の列幅を設定 Range("D1").ColumnWidth = SCHDL_WIDTH 'スケジュール欄の列幅を設定 End Sub
開始/終了年月日から日数を求め、スケジュール等のセル範囲を取得するよう改良! Withステートメントでまとめる
Option Explicit Const BASE_ADRS As String = "A1" '基点セルのアドレス Const ORG_DATE As Date = #8/26/2009# '開始年月日 Const DST_DATE As Date = #9/26/2009# '終了年月日 Const DAY_OFST As Integer = 1 '日の列の位置 Const WEEKDAY_OFST As Integer = 2 '曜日の列の位置 Const SCHDL_OFST As Integer = 3 'スケジュール欄の列の位置 Const MONTH_WIDTH As Integer = 3 '月の列幅 Const DAY_WIDTH As Integer = 3 '日の列幅 Const WEEKDAY_WIDTH As Integer = 3 '曜日の列幅 Const SCHDL_WIDTH As Integer = 40 'スケジュール欄の列幅 Const SCHDL_DAYS As Integer = 32 'スケジュール表の期間の日数 Public Sub スケジュール表描画() Dim myDate As Date '処理中の日付を表す変数 Dim baseCell As Range '基点セル Dim tableArea As Range 'スケジュール表の範囲 Workbooks.Add '新規ブック追加 Set baseCell = Range(BASE_ADRS) '基点セルをセット myDate = ORG_DATE 'myDateを開始年月日にセット '------------- 月と日と曜日を描画 ------------- baseCell.Activate '基点セルをアクティブセル化 Do Until myDate > DST_DATE '処理中の日が終了年月日に達するまでループを回す With ActiveCell .Value = Month(myDate) '左端の列に月を入力 .Offset(0, DAY_OFST).Value = Day(myDate) '月の1列右隣に日を入力 .Offset(0, WEEKDAY_OFST).Value _ = WeekdayName(Weekday(myDate), True) '月の2列右隣に曜日を入力 myDate = DateAdd("d", 1, myDate) '処理中の日付を1日進める .Offset(1, 0).Activate 'アクティブセルを1行進める End With Loop '------------- 罫線を描画 ------------- Set tableArea = Range(baseCell, _ baseCell.Offset(SCHDL_DAYS - 1, SCHDL_OFST)) 'スケジュール表の範囲を設定 tableArea.Borders.Weight = xlThin '格子状の細線を引く tableArea.BorderAround Weight:=xlThick '周囲に太線を引く '------------- 列幅を設定 ------------- With baseCell .ColumnWidth = MONTH_WIDTH '月の列幅を設定 .Offset(0, DAY_OFST).ColumnWidth = DAY_WIDTH '日の列幅を設定 .Offset(0, WEEKDAY_OFST).ColumnWidth = WEEKDAY_WIDTH '曜日の列幅を設定 .Offset(0, SCHDL_OFST).ColumnWidth = SCHDL_WIDTH 'スケジュール欄の列幅を設定 End With End Sub
次は
月の変わり目の日のみ、月と罫線を描画するように変更します!
コメント