• ベストアンサー

エクセルで変則的な暦を作る

 クライアントから聞かれてできるでしょうと答えたのですが、うまくいかないのでどなたかお知恵をお貸し下さい。  その企業はタイムカードを長く使っていたのですが、今回昔ながらの出勤簿にかえることにしたそうです。ワープロのテンプレートは私が作ったのですが、日付の生成がエクセルで自動でできないものかという相談です。  用紙はA4横で毎月1枚とし、21日から始まり20日で終わる暦です。曜日は横方向に配置し月曜日から日曜日の順番で固定されます。表題や手書きの日数記入欄、上長らの印鑑の枠は適当に配置しますので日付の自動配置について、おわかりの方いらっしゃいましたらよろしくご教授下さい。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • comv
  • ベストアンサー率52% (322/612)
回答No.3

こんばんは >らの印鑑の枠は適当に配置しますので日付の自動配置について とのことなので説明し易い表構成で   A B C D E F G H 1 2   月 火 水 木 金 土 日 3   式1→ → → → → → 4   式2式3→ → → → → 5   ↓ ↓ ↓ ↓ ↓ ↓ ↓ 6   ↓ ↓ ↓ ↓ ↓ ↓ ↓ 7   式4↓ ↓ ↓ ↓ ↓ ↓ 8   式2↓ ↓ ↓ ↓ ↓ ↓ A1に年 B1に月を入力 表示形式はユーザー定義 m (A1は 西暦 2003 か 和暦 H15 のように記入)  式1  =IF(TEXT($A1&"/"&$B1&"/21","aaa")=B2,($A1&"/"&$B1&"/21")*1,IF(A3="","",A3+1)) 式2  =H3+1 式3  =B4+1 式4  =TEXT(H6,"d")+1 ・B3:H6を選択 ・書式設定 表示形式 分類 ユーザー定義  種類欄に d ・B7:H8を選択 ・書式設定 表示形式 分類 ユーザー定義  種類欄に [>20]"";0 印刷用とのことなので作成が簡易で表示だけ (値としては日付形式だったり数値だったり ゴチャゴチャ)ちゃんとしたものです。

poor_Quark
質問者

お礼

 せっかくいただいた回答ですので、お礼は十分回答の内容を理解してからと考えておりまして、折りしも仕事がはいってしまい、そういった事情で、お礼が遅れたことをお詫びします。いただいた回答のおかげで解決しそうです。本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.5

>質問内容からは、21日から始まる点だけで、変則的に 思えません。 (1)B1に2003とかの年、C1に5月とかの月を入れます。月は毎月変えます。 <日付け設定> 早期に日付けシリアル値に持っていくことです。 翌日は+1足し算で出ますし、月末から月初のおり返し の心配も要りません。曜日もWeekday関数で出せる からです。 (2)A2に=DATE(B1,C1,21)と入れます。書式をユーザー定義で「d」(dの一文字)と入れます。21となります。 B2に=A2+1と式を入れます。 C2以右に複写します。(AE列まで) 31の右列は1になってくれます。6月だと30の次ぎに1が来ます。だだAEが21になってしまいますが、その対策は別にします。 <曜日設定> (3)A3に=TEXT(WEEKDAY(A2),"aaa")といれ、B3以下AE列まで複写します。水木・・・・が出ます。 これで骨子は解決するのではないでしょうか。

poor_Quark
質問者

お礼

>これで骨子は解決するのではないでしょうか。 ですね。あとは行の頭に月曜日を持ってくることや、週の変わり目で行を落とすだけですね。質問文がわかりにくかった上に、お礼が遅れてたいへん申し訳ありません。ご回答いただきありがとうございました。

すると、全ての回答が全文表示されます。
noname#11856
noname#11856
回答No.4

私は、月曜から日曜までの7列×(最大)6行の、よくあるカレンダーみたいな形に、前月の21日始まりで出力したい、と言うことだと読み取りました。違っていたら無視してください。(^-^; それもVBAでやっちゃいましたが・・・ダメなのかな? ---------- 2003 5 月 火 水 木 金 土 日 21 22 23 24 25 26 27 28・・・ ---------- (・・・レイアウトくずれるかな・・・) 前提条件:カレンダーの形式は上記、年月指定はA1に年、B1に月を入力する。4行目のA~G列に月~日と固定で指定されているとする。 1. Worksheet_ChangeでA1、B1が変更された時のみ、カレンダーの設定を行う。 2. 前月の21日を算出。(指定月の21日でいいのかな?なにが普通かわからない(笑)) 3. Weekday関数で算出した日付の曜日を計算。 4. 開始行の設定。(前提条件から今回は4。) 5. 該当の曜日に日を出力。 6. DateAdd関数で1日加算。(日付系の計算でないとうるう年等の判断が面倒だから。) 7. 指定月の21日になったら終了。(指定月から始めた場合は翌月です。) 8. 列を1加算。7より大きくなった場合は1に戻し、行を1加算。 9. 5に戻る。 例えば、曜日間、週間に入力欄が欲しければ、加算の数値を増やせば対応できます。 以下、(くずれて見にくくなると思いますが)私がテストしてみたロジックです。サンプル程度にご参照ください。。。 Private Sub SetCal(ByVal strYear As String, ByVal strMonth As String) Dim CalDate As Date Dim intCol As Integer Dim intRow As Integer Dim intStartCol As Integer Dim intColAdd As Integer Dim intRowAdd As Integer intStartCol = 0 '開始列がBなら1、Cなら2・・・ intColAdd = 0 '曜日間に空けたい列数 intRowAdd = 0 '週間に空けたい行数 'イベント起動を不可に Application.EnableEvents = False Range(Cells(4, 1 + intStartCol), Cells(9, 7 + intStartCol)).ClearContents CalDate = DateAdd("m", -1, strYear & "/" & strMonth & "/21") '前月の21日 intRow = 4 '開始行を指定 intCol = Weekday(CalDate, vbMonday) + intStartCol '開始列算出 Do Cells(intRow, intCol) = Day(CalDate) CalDate = DateAdd("d", 1, CalDate) If Day(CalDate) = 21 Then Exit Do intCol = intCol + 1 + intColAdd If intCol > 7 + intStartCol Then intCol = 1 + intStartCol intRow = intRow + 1 + intRowAdd End If Loop Application.EnableEvents = True End Sub

poor_Quark
質問者

お礼

 たいへん勉強になりました。VBAに本格的に取り組む機会が今まであまりなかったので、いいきっかけになったと思います。内容がわかりやすいコードをご提供いただき感謝します。あわせてお礼が遅れたことをお詫びします。お骨折りいただきありがとうございました。

すると、全ての回答が全文表示されます。
  • coco1
  • ベストアンサー率25% (323/1260)
回答No.2

まず、ワークシートに次のように入力して下さい。 a1:2000 a2:10 a3:1 a4:=date(a1,a2,a3) a5:=weekday(a4) b1:年 b2:月 b3:日 b4:曜 ここまでは作業セルです。以下、下記のように入力します。 c4~am4の各セルに1、2、3、4、5、6、7、1、2、3、4...と入力し、かつ、セル書式で「表示形式」を「ユーザ定義」、「種類」にaaaと入力します。すると、この範囲に曜日が表示されます。 次に、数式です。数式は、全角文字以外は全て半角英数字です。 c3:=IF($A$5=C4,A4+20,"") d3~i3をドラッグした状態でカレントセルをd3にし(タブキーを押すと、カレントセルが移動します。)、=IF($A$5=D4,$A$4+20,IF(C4>=$A$5,C3+1,""))と入力した後、コントロールキーを押したままエンターを押します。すると、ドラッグした範囲に数式が一挙に入力されます※。 j3に=i3+1と入力し、これをam3までコピーします。※と同じ方法で入力しても構いません。 c2に=IF(C3<>"",MONTH(C3),"")と入力し、これをam2まで横にコピーします。※と同じ方法で入力しても構いません。 d2~am2の文字色を白にします。なおかつ、この範囲をドラッグしてd2をカレントセルにし、この範囲に次の条件付き書式を設定します。 セルの値が、次の値に等しくない、=c2、書式ボタンでフォントを黒に指定 これで、月の変わり目だけ、月が表示されます。 c3~am3のセル書式で、ユーザ設定とし、種類にdと入力します。これで、この範囲には日だけが表示されます。 ae3~am3をドラッグし、ae3をカレントセルにした状態で、条件付き書式を次のように設定します。 数式が、=day(ae3)>20、書式タブでフォント色を白に設定 この設定で、21日以降の日付が表示されなくなります。 あとは、a1~a3の年月日をあれこれいじってみて下さい。いかがでしょうか? ワークシートを直接お渡しできない関係上、説明に都合がいいように作業セルなどを多用し、かなり無駄な構成になっています。

poor_Quark
質問者

お礼

 お礼が送れて申し訳ありません、たいへん勉強になりました。たまたま大きな仕事がはいり時間的に余裕がなくなり、そのせいで検証がうまくいかないところもありますが、これからもう一度組み立ててみます。ありがとうございました。

すると、全ての回答が全文表示されます。
  • zealzany
  • ベストアンサー率35% (19/53)
回答No.1

変則的な暦という意図が汲み取れないのですが、良くあるパターンで暦を作成するパターンですとたとえばA1のセルに「2003」A2のセルに「5」と入力し datevalue関数で日付欄の最初のセル(例:B1)に「=datevalue(A1 & "/" & A2 "/" & "21")」それに続くセルに「=B1+1」と入力。曜日はセル書式で設定となるのですが。 

poor_Quark
質問者

お礼

 いきなり多忙モードに突入し、いただいた回答すべてを検証するのに時間がかかってしまい回答が送れたことをお詫びします。大きなヒントをいただきありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A