スケジュール表の描画(ステップ2)月と日と曜日を別々の列にわけて描画

このエントリーをはてなブックマークに追加
宇宙飛行士
VBA/マイクロソフトオフィス系

参考文献

最終イメージ

・同じ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

次は

月の変わり目の日のみ、月と罫線を描画するように変更します!

コメント

タイトルとURLをコピーしました