• ベストアンサー

エクセル2000で出勤簿の表示形式について

長文ですがよろしくお願いします。20日〆のカレンダー形式の出勤簿を作成しています。例えば8月分だとA1セルに7/21(木)、B1に22(金)・・G1に27(水)、A3に28(木)・・と7日間を同一行の7列に入力します。この中で21日と月初めの1日の表示は月/日(曜日)としたいのです。今はユーザー定義で21日のセルにm”/”d”(”aaa”)”の表示形式を、22日にはd”(”aaa”)”を入れ更新する度に23日以降にドラッグして後で1日のセルだけ21日の書式のみをコピーしています。1人分だけならこれでもいいのですが、ページ1として元データを作って約100名分のページを$A$1などの数式で自動反映していて、30日の月や31日の月があるため1日の位置がずれ、自動反映のページには7/31(日)、1(月)と表示されてしまい、今は結局1つ1つコピーし直していて自動反映の意味がありません。何か良い方法があれば教えていただけたら幸いです。よろしくお願いします。Windows98使用です。

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

  • ベストアンサー
  • nobuendo
  • ベストアンサー率47% (182/384)
回答No.6

ANo.4まで完成したものを、変更するかたちで説明します。 B3は、=DATE($A$1,$C$1,1) に変更。 C5からG5は、C3からG3をコピーする。 C5は、=B5+1 D5は、=C5+1 E5は、=D5+1 F5は、=E5+1 G5は、=F5+1 と式が入ります。 B11を、=IF(DAY(H9+1)=29,H9+1,"") に変更。 C11を、=IF(B11="","",IF(DAY(B11+1)=30,B11+1,"")) に変更。 D11を、=IF(C11="","",IF(DAY(C11+1)=31,C11+1,"")) に変更。 これでどうでしょう。

mayaweller
質問者

お礼

凄いです、バッチリです。関数を使いこなせたらこんなに便利なんですね~。自分で作れるようになったらいいのですが・・とりあえずこれを機会に色々試してみます。何度もお時間割いてくださって有り難うございました!またよろしくお願いいたします。

その他の回答 (5)

回答No.5

ANo.1です。 回答が遅くなって済みません。 すでに既出の回答で解決しているようなので、蛇足ですが、 ANo.1の回答で、#value!エラーになるとのこと。 A1セルの入力内容はどうなっていますでしょう? 文字列で入力していませんか? 例えば、7月21日とか全角になっているとか。 一度A1セルの内容をクリアして、書式を「標準」か、「日付」にして、「2005/7/21」と入力していただければ、エラーにならないと思いますが。 私の説明不足で、すみません。

mayaweller
質問者

お礼

ご丁寧にお返事を有り難うございます。実際はA1入力ではないので式を変えないといけなかったのですが、それを間違っていたようです。ただ、出勤簿の形が7日毎に下段に作らなければならないので、この方法だと週ごとに式をやりかえる手間から考えてNO.3の内容でやってみようと思います。N0.1の内容も活かされてとても助かりました。有り難うございます。またよろしくお願いします。

  • nobuendo
  • ベストアンサー率47% (182/384)
回答No.4

レイアウト的に変かも知れませんが、解りやすく説明する為、ANo.3をベースに説明します。 A1に、=A2+1988 と式を入力します。 A2を、和暦の年の入力欄とします。(今年なら 17) A3には、="平成"&A2&"年"&C1&"月分" と式を入力します。 B3は、貴方の言われるように =DATE($A$1,$C$1-1,21)に変更。 そして、A3からH11(日付のすぐ下が入力セルならH12まで)に印刷範囲指定をしておきます。 A1、A3には、セル保護をかけます。 A1は、非表示でもかまいません。 尚、年の入力を西暦にするなら、A1が入力セルとなり、 A2には、=A1-1988 の式を入力することになります。 こんなことでよろしいでしょうか。 余計なお世話かも知れませんが、この表を不特定多数の方が使用(入力から印刷まで)するのか、管理者に限定されるのかによって、間違いが起こらないように仕組むレベルが変わってきます。 不特定多数の方が使用するなら、入力できるセルを色分けし、変更不可のセルには保護を掛け、全シートに印刷範囲を正しく設定し、且つ正しく印刷されるように用紙設定等の印刷設定をしておくなど、細かな配慮が必要となってきます。  

mayaweller
質問者

お礼

何度も有り難うございます。今必死に作成中です。取扱うのは原則私だけなので大丈夫かと思いますが、何かの時に混乱しないように明確にしておくようにします。 もう一つだけ我侭言わせていただけるなら、2名分だけ末締めの出勤簿がありまして、最後の29日~31日を他の20〆のように2、4、6、9、11月毎に自動で入力されるようにしたいのですが、数式はどうなるのでしょうか?20〆のに手を加えて見たりしていますが、翌月の1日までが表示されてしまったりで悪戦苦闘しています。すみません、よろしくお願いします。

  • nobuendo
  • ベストアンサー率47% (182/384)
回答No.3

ANo.2の変更案をお知らせします。(関数式の入力が少し簡単になります。) ただし、変更しなくとも支障はありませんが。 ANo.1の方のTEXT関数を、C5からF5に応用します。 C5を =IF(DAY(B5+1)=29,B5+1,TEXT(B5+1,"m/d(aaa)")) に変更します。 D5を =IF(OR(DAY(B5+2)=30,DAY(B5+2)=2),B5+2,TEXT(B5+2,"m/d(aaa)")) に変更します。 E5を =IF(OR(DAY(B5+3)=31,OR(DAY(B5+3)=2,DAY(B5+3)=3)),B5+3,TEXT(B5+3,"m/d(aaa)")) に変更します。 F5を =IF(DAY(B5+4)<>1,B5+4,TEXT(B5+4,"m/d(aaa)")) に変更します。 上記以外は、ANo.2の通りです。 エクセルを立ち上げ、このページから、それぞれの関数式を該当セルにコピーすれば、簡単且つ間違えなく作成できますので試してみて下さい。

mayaweller
質問者

お礼

凄いです、感動です。こういうのを求めてました。ただもう一つ甘えさせていただけるなら、うちの年月表示が、例で言うとH2のセル内に「平成17年8月分」となってまして、7/21~8/20であれば「8月分」なんです。これは$C$-1とすれば解決しそうですが、せっかくならA1の2005を平成17年表示にして、この関数を生かす方法はありますか?DATEVALUEなど試したけどよく解らなくてすみません。もし教えていただけたら幸いです。なければA1の行を非表示で印刷して使おうと思います。

  • nobuendo
  • ベストアンサー率47% (182/384)
回答No.2

具体例を記述します。 A1に年(今年なら2005)、C1に月を入力するセルとします。 B3を21日として横に一週間、次の週は、一行あけてB5が28日、次の週も一行ずつあけて表記する例とします。 B3の表示形式は、当然 m”/”d”(”aaa”)”です。しかし、それ以外の日付の入るセル(ここではD11まで)は、すべて d”(”aaa”)”に設定します。 次に、各セルに入力する関数式を表記します。 B3には、=DATE($A$1,$C$1,21) C3には、=B3+1 D3には、=C3+1 と言うように、この行は規則正しく入力します。 次のB5からは、やや複雑ですが、一字一句間違えてはいけません。 B5は、=H3+1  C5は、=IF(DAY(B5+1)=29,B5+1,CONCATENATE($C$1+1,"/",1,CHOOSE(WEEKDAY(B5+1),"(日)","(月)","(火)","(水)","(木)","(金)","(土)"))) D5は、=IF(OR(DAY(B5+2)=30,DAY(B5+2)=2),B5+2,CONCATENATE($C$1+1,"/",1,CHOOSE(WEEKDAY(B5+2),"(日)","(月)","(火)","(水)","(木)","(金)","(土)"))) E5は、=IF(OR(DAY(B5+3)=31,OR(DAY(B5+3)=2,DAY(B5+3)=3)),B5+3,CONCATENATE($C$1+1,"/",1,CHOOSE(WEEKDAY(B5+3),"(日)","(月)","(火)","(水)","(木)","(金)","(土)"))) F5は、=IF(DAY(B5+4)=1,CONCATENATE(IF($C$1=12,1,$C$1+1),"/",1,CHOOSE(WEEKDAY(B5+4),"(日)","(月)","(火)","(水)","(木)","(金)","(土)")),B5+4) G5は、=B5+5 H5は、=G5+1 次のB7、B9の列は規則正しく入力します。 B7は、=H5+1 C7は、=B7+1 D7は、=C7+1 ・・・という具合です。 B9列は、B7列をそっくりコピーしてください。 最後にB11列目です。 B11は、=IF(DAY(H9)<20,H9+1,"") C11は、=IF(B11="","",IF(DAY(B11)>=20,"",B11+1)) D11は、=IF(C11="","",IF(DAY(C11)>=20,"",C11+1)) 関数式入力はここまでです。 B3からD11までのデータは、そっくりそのまま、どこへコピー、移動しても相対関係は崩れませんので、大丈夫ですが、A1とC1の年、月の入力セルを違うセルに変更する場合は、リンクする関数式のあるセル(B3,C5,D5,E5,F5)の該当部分を変更してください。 年、月を入力する、A1、C1以外、まったく変更することなく自動反映されます。もちろん、うるう年も大丈夫。 B3~D11の各セルに保護を掛けておけば、安心です。

回答No.1

題意通りではないかもしれませんが、 A1セルにその週の最初の日付を入力します。 で、B1セルに次の式を入力し、G2セルまで ヨコにコピーします。 =IF((DAY($A$1+COLUMN(A1)-1)=21)+(DAY($A$1+COLUMN(A1)-1)=1),TEXT($A$1+COLUMN(A1)-1,"m/d(aaa)"),TEXT($A$1+COLUMN(A1)-1,"dd(aaa)")) 式が複雑で済みません。 表示にはTEXT関数を使っています。該当する日が1か21の場合にのみ"m/d(aaa)"を使い、それ以外の日は "d(aaa)"の書式にしてあります。 COLUMN(A1)-1の部分はA1セルに入れた日付に対して、ヨコに+1ずつするために使っています。 必ず A1セルに週初めの日付を入れなければなりませんが、題意の自動書式は可能だと思いますので、 参考になりましたら。

mayaweller
質問者

お礼

早々の回答ありがとうございます。関数とかよく解らないのですが、試しに早速やってみました。でも#value!の表示が出ます。となりにコピーしてみても同じでした。もしや最後のはdd(aaa)ではなくd(aaa)では?と変えてみたけど、やはり駄目でした。=のボタンを開いてみると、論理式~偽の場合、全て#value!とありました。何度見直しても入力漏れは無いようなのですが、すみません・・何が違うのか解りません。

関連するQ&A

専門家に質問してみよう