12ヶ月分のシートを作りそれぞれに日付、曜日等を設定し、土日には色をつける

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

12ヶ月分のシートに日付を入れる演習

この教材についての過去の質問・感想

9596 : 小川慶一の回答 (2018-03-18 14:56:38)

受講生 さん:

おそくなりました。

> 日付の記載方法に関しては、ダブルクォートで囲む方法とシャープで囲む方法があるそうですが、

TypeName関数使ってデータ型を調べてみるとよいです。

Sub hoge()
    Debug.Print TypeName(#3/18/2018#)         'Date
    Debug.Print TypeName("2018/3/18")         'String

    Dim c As Long
    c = 3
    Debug.Print TypeName("2018/" & c & "/18") 'String
End Sub


ということで、ダブルクォートで囲ったものは、たとえば "2018/3/18" であれば、長さ9文字の、「2 0 1 8 / 3 / 1 8」という文字列です。
シャープで囲うと日付型の日付ですね。

変数を使って日付を指定したいのであれば...。例えば、以下の要領で。

Sub fuga()
    Dim c As Long
    c = 3
    
    Dim d As Date
    
    d = DateAdd("m", 3, #12/1/2014#)
    Debug.Print d
End Sub


> 逆に、シャープで囲んだ方が良いというメリット等ありましたら、ご教授下さい。

まずは、ご自身で考えてみてください。
そこから考察を進めましょう。


9588 : 受講生さんのコメント (2018-03-14 18:26:44)

小川先生

御回答頂きましてありがとうございます。
キャストの件了解しました。

また、日付の記載に関してもう一点質問がありますので、ご教授下さい。

日付の記載方法に関しては、ダブルクォートで囲む方法とシャープで囲む方法があるそうですが、
今回のプログラム作製におきまして、当初はシャープで囲んでおりましたが、日付の中に変数を組み込むと
エラーとなってしまうため(Sub test1)、ダブルクォートで囲んだという経緯があります(Sub test2)。

そこでお尋ねしたいのですが、test1のように日付の前後をシャープで囲んだ場合、
その中に変数を組み込んだ書き方というのは出来ないのでしょうか?

仮に、出来ないとするならば、(かなり主観的な考え方になりますが)ダブルクォートで囲んだ方が
扱いやすいのかなという気もします。
逆に、シャープで囲んだ方が良いというメリット等ありましたら、ご教授下さい。

以上、よろしくお願いします。

Option Explicit

Sub test1()
    
    Dim c As Long
    Dim d As Date
    
    c = 3
    d = "#2015/" & c & "/1#"

    Debug.Print d
    
End Sub


Sub test2()
    
    Dim c As Long
    Dim d As Date
    
    c = 3
    d = "2015/" & c & "/1"

    Debug.Print d
    
End Sub



9582 : 小川慶一の回答 (2018-03-14 07:43:20)

受講生 さん:

> これは、日付に関して、d="2015/1/1"のような記載をすれば、string型であったとしても、date型として扱っているということなのでしょうか?

結論から言えば、そうです。


以下の動画をまずは参照してください。

○基礎講座第2章5 - 文字列の結合
https://online.pc5bai.com/movie/index/25/113


2:13あたりから説明しているとおり、VBは、文字列として取扱いたいときには、その取扱対象がたとえ数値型のデータだったとしても、自動的(暗示的)に文字列とみなして取り扱ってくれます。
(そういう暗示的なデータ型変換のことを、IT用語で「キャスト」と言います)

同様に、VBは、日付として取扱いたいときには、その取扱対象がたとえ文字列型のデータだったとしても、自動的(暗示的)に日付に型変換して取り扱ってくれます。

CDate関数、 CStr関数等のデータ型変換関数は、明示的にデータ型を変換してくれます。
(発展編テキスト最終章参照ください)

ですので、上に挙げた動画で示したコードも、型変換を明示的に行うべく、以下のような書き方をすることも可能です。
"A" & CStr(3)

そもそも、セルの指定なども...、以下の[a], [b]では、[b]のように書くべきだという意見も聞きます。
僕自身は面倒なのでしませんが。

Dim cGyo As Long
cGyo = 5

[a] Range("A" & cGyo).Value = d '暗示的に型の変換を行う
[b] Range("A" & CStr(cGyo)).Value = d '明示的に型の変換を行う


ということで。

ここまでについてしっかり理解できれば、ご質問の件についても自動的に(暗示的に?w)理解・納得に至れるかな、とも思います。
まずは、どうでしょう?




> 小川先生
>
> お世話になっております。
> 本動画の内容に関して質問がありますので、投稿させて頂きます。
>
> Q1の課題に関して、google等で検索を行い以下のプログラムを作成しました。
> (結果に関しては、問題無いと思います。)

Sub rensyu17()

    Dim cMonth As Long
    Dim cGyo As Long
    Dim d As String
'    Dim d As Date
    
    For cMonth = 1 To 12
        cGyo = 2
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = cMonth & "月"
        
        Range("A1").Value = "day"
        Range("B1").Value = "wkday"
        Range("C1").Value = "todo"
        Range("D1").Value = "comment"
        
        d = "2015/" & cMonth & "/1"
        
        Do While Month(d) = cMonth
            Range("A" & cGyo).Value = d
            Range("B" & cGyo).Value = WeekdayName(Weekday(d), False)
            d = DateAdd("d", 1, d)
            cGyo = cGyo + 1
        Loop
        Columns("A:A").EntireColumn.AutoFit
    Next
End Sub


> ここで気になったのが、変数"d"についてです。
> この変数dに関しては、日付を格納する変数であるためDate型で宣言するのが妥当と思いましたが、String型で実行しても問題なく実行できているように思われます。
>
> 詳しくは調べていないのですが、文字型を日付型に変換するには、CDate という関数を使うようですが、本プログラムにおいては、CDateは使用しておりません。
>
> これは、日付に関して、d="2015/1/1"のような記載をすれば、string型であったとしても、date型として扱っているということなのでしょうか?


9581 : 受講生さんのコメント (2018-03-13 21:51:35)

小川先生

お世話になっております。
本動画の内容に関して質問がありますので、投稿させて頂きます。

Q1の課題に関して、google等で検索を行い以下のプログラムを作成しました。
(結果に関しては、問題無いと思います。)

Sub rensyu17()

    Dim cMonth As Long
    Dim cGyo As Long
    Dim d As String
'    Dim d As Date
    
    For cMonth = 1 To 12
        cGyo = 2
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = cMonth & "月"
        
        Range("A1").Value = "day"
        Range("B1").Value = "wkday"
        Range("C1").Value = "todo"
        Range("D1").Value = "comment"
        
        d = "2015/" & cMonth & "/1"
        
        Do While Month(d) = cMonth
            Range("A" & cGyo).Value = d
            Range("B" & cGyo).Value = WeekdayName(Weekday(d), False)
            d = DateAdd("d", 1, d)
            cGyo = cGyo + 1
        Loop
        Columns("A:A").EntireColumn.AutoFit
    Next
End Sub


ここで気になったのが、変数"d"についてです。
この変数dに関しては、日付を格納する変数であるためDate型で宣言するのが妥当と思いましたが、
String型で実行しても問題なく実行できているように思われます。

詳しくは調べていないのですが、文字型を日付型に変換するには、CDate という関数を使うようですが、
本プログラムにおいては、CDateは使用しておりません。

これは、日付に関して、d="2015/1/1"のような記載をすれば、string型であったとしても、date型として
扱っているということなのでしょうか?


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 1枚のシートに1年分または所定の月の分だけのカレンダーを作成する
    【動画1】 1枚のシートに1年分または所定の月の分だけのカレンダーを作成する 未習得
  2. 【動画2】 12ヶ月分のシートを作りそれぞれに日付、曜日等を設定し、土日には色をつける
    【動画2】 12ヶ月分のシートを作りそれぞれに日付、曜日等を設定し、土日には色をつける 未習得
  3. 【動画3】 1枚のシート内で12ヶ月を横に並べたカレンダーを作成する
    【動画3】 1枚のシート内で12ヶ月を横に並べたカレンダーを作成する 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ