[[20130409122231]] 『シート1枚で一ヶ月分の勤務表を印刷する方法』(オデッセイ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シート1枚で一ヶ月分の勤務表を印刷する方法』(オデッセイ)
エクセル2010を使用しています。
セルE1に年(2013)セルG1に月(5)と入力してセルC5に平成25年5月1日(水)から一ヶ月分
が印刷できるようにマクロを組んだのですがセルC5が明治33年1月31日(水)となってしまいます。
何がいけないのでしょうか?

Sub AutoPrint()

 Dim i As Byte
    For i = 1 To Day(DateSerial(Range("E1"), Range("G1") + 1, 1) - 1)
        Range("C5") = i
    ActiveSheet.PrintOut

宜しくお願い致します。


 Range("C5") = i
 を
 Range("C5") = DateSerial(Range("E1"), Range("G1"), i)
 にするとうまくいくと思います。

 (se_9)

 >何がいけないのでしょうか?
の回答として、シリアル値というものをまず理解する必要があります。
エクセルシートで日付は1900年(明治33年)1月1日を1として
1日経過するごとに1を加算していく日付連番(シリアル値)で
日付を表現します。
 
しかるに、ご提示のコードでは「1から月末までの日付値」がC5に
入力されます。「1から31」がC5にループで入力されますよね?
シリアル値の考え方では1900/1/1〜1900/1/31のシリアル値を入力して
いることになります。
  
セルに「2013/5/31」と入力し、表示形式を数値に変更した時に表示される
数値が「2013/5/31のシリアル値」です。
全然違うのが分かると思います。
 
そのセルに「日付」を表示したいだけなら、表示形式を標準や数値に。
平成25年5月31日のような表示にしたいのであれば、
日付に見合ったシリアル値を入力する必要があるので、
Range("C5") = i
  ↓
Range("C5") = Format(DateSerial(Range("E1"), Range("G1"), i), "ggge年m月d日")
 
(みやほりん)


 衝突。かつ、同じようなことだけど、メモしたので。

 >何がいけないのでしょうか?

 まず、本題としては、たとえば i は、最初 1 だよね。 で、日付というのは1900/1/1 を 1 としたシリアル値。
 だから、セルに 1 をいれると 1900/1/1 のことで、和暦表示すると、【正しく】明治33年1月31日 になる。

 本題とは離れるけど、 As Byte 。 う〜ん、あまり賛成できないなぁ。
 今回扱う数値はいくつまで、だから As Byte 。 今回は、いくつまで、だから As Integer。
 今回は、ちょっと大きめなので As Long。 こんなことに気を配っても、このご時世、【ご利益は全くない】
 逆にデメリットがあるかもね。

 整数は Long。小数ならDouble。もう、決め打ちして記述して、本来のコードロジック作成に注力したほうがいいね。

 (ぶらっと)

 >Dim i As Byte
 ぶらっとさんの回答見るまで気付かなかった…

 (se_9)

皆様ありがとうございました。
初心者なので、これから勉強したいと思います。

(オデッセイ)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.