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
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
受講生さんの投稿
(投稿ID: 3732)
お世話になっております。
本動画の内容に関して質問がありますので、投稿させて頂きます。
Q1の課題に関して、google等で検索を行い以下のプログラムを作成しました。
(結果に関しては、問題無いと思います。)
ここで気になったのが、変数"d"についてです。
この変数dに関しては、日付を格納する変数であるためDate型で宣言するのが妥当と思いましたが、
String型で実行しても問題なく実行できているように思われます。
詳しくは調べていないのですが、文字型を日付型に変換するには、CDate という関数を使うようですが、
本プログラムにおいては、CDateは使用しておりません。
これは、日付に関して、d="2015/1/1"のような記載をすれば、string型であったとしても、date型として
扱っているということなのでしょうか?
小川慶一さんのコメント
(コメントID: 5240)
> これは、日付に関して、d="2015/1/1"のような記載をすれば、string型であったとしても、date型として扱っているということなのでしょうか?
結論から言えば、そうです。
以下の動画をまずは参照してください。
○基礎講座第2章5 - 文字列の結合
https://forum.pc5bai.com/lesson/page/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等で検索を行い以下のプログラムを作成しました。
> (結果に関しては、問題無いと思います。)
> ここで気になったのが、変数"d"についてです。
> この変数dに関しては、日付を格納する変数であるためDate型で宣言するのが妥当と思いましたが、String型で実行しても問題なく実行できているように思われます。
>
> 詳しくは調べていないのですが、文字型を日付型に変換するには、CDate という関数を使うようですが、本プログラムにおいては、CDateは使用しておりません。
>
> これは、日付に関して、d="2015/1/1"のような記載をすれば、string型であったとしても、date型として扱っているということなのでしょうか?