参考文献

最終イメージ
・同じ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
次は
月の変わり目の日のみ、月と罫線を描画するように変更します!
コメント