• ベストアンサー

エクセルで工程表・作業表を作っています 塗りつぶしの自動化についてお教えください

エクセルで工程表・作業表をつくることになりました。 A1セルに項目名「年月日」A2セルに項目名「曜日」 以下A3 A4・・・と作業氏名が入っています B1から右方向に2005/01/01の形式で連続して 年月日が入っています B2はB1を参照してWeekday関数を入れて 曜日を表示しています。 ここからなのですがA3から下方向に作業者名が入力されていますが 曜日に関係なく ばらばらに「休」と文字を入れて この作業者がその日は休みであることをあらわしています。 ある人のセルに数字を2種類入力して 作業日数分塗りつぶして その作業の種類を色で塗り分けたいのですが 2005/11/24 ある作業者の欄に数字を3(三日間という意味) を入れると 24日25日26日が自動的に塗りつぶすようなことは 可能でしょうか? そして たとえば25日の欄に「休」を入っている場合には 24日は塗りつぶして 25日は「休」のままで塗りつぶさなくて 26日と27日をまた塗りつぶすという判別の方法があればと 思っています。 関数で可能なのか もしくはセルをクリックなどして ユーザーフォームを立ち上げて入力を促すマクロなどでないと 難しいのか いかがでしょう? 文章がわかりにくかったら申し訳ありませんが 補足の解説をさせていただきますので よろしくお願いいたします

  • ennkai
  • お礼率54% (284/525)

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

シートマクロで一応それなりに動くモノを作ってみました。 まだ、チェックが甘いかもしれません・ Private Sub Worksheet_Change(ByVal Target As Range) Dim 日数 As Integer, x As Range If Target.Row >= 3 And Target.Column >= 2 Then '作業日数を入れる領域である If IsNumeric(Target.Value) Then '日数として数値が入力された 日数 = Int(Target.Value) Call 色抜き(Target) Call 色つけ(Target, 日数) Target.Activate Else If Target.Value = "休" Then '"休"が入力された If Target.Interior.ColorIndex <> xlColorIndexNone Then '既に色つけがされている(作業日である) Set x = 数字のセルは(Target) If Not x Is Nothing Then Range(x, x.Offset(0, x.Value - 1)).Interior.ColorIndex = xlNone Call 色つけ(x, x.Value) Target.Activate End If End If End If End If End If End Sub Private Sub 色つけ(セル As Range, 日数 As Integer) '指定されたセルから右に日数分色つけする セル.Activate Do While 日数 > 0 If ActiveCell.Value <> "休" Then ActiveCell.Interior.Color = RGB(&HFF, &HE4, &HE1) 日数 = 日数 - 1 End If ActiveCell.Offset(0, 1).Activate Loop End Sub Private Sub 色抜き(セル As Range) '指定されたセルから右に色が付いていたら色抜きする セル.Activate Do ActiveCell.Interior.ColorIndex = xlColorIndexNone ActiveCell.Offset(0, 1).Activate If Not IsEmpty(ActiveCell.Value) And IsNumeric(ActiveCell.Value) Then '他の作業日数指示が有る場合止め Exit Do End If Loop While ActiveCell.Interior.ColorIndex <> xlColorIndexNone Or ActiveCell.Value = "休" End Sub Private Function 数字のセルは(セル As Range) As Range セル.Activate Do While ActiveCell.Column >= 2 ActiveCell.Offset(0, -1).Activate If Not IsEmpty(ActiveCell.Value) And IsNumeric(ActiveCell.Value) Then Set 数字のセルは = ActiveCell セル.Activate Exit Function End If Loop Set 数字のセルは = Nothing End Function

ennkai
質問者

お礼

回答ありがとうございます 早速ためさせていただきましたら 考えていた通りの動作が確認できました。 解説文まで書いてくださって 本当にありがとうございます。 この内容を勉強させてもらって 活用させていただきます。 セルに日数と色指定を入力するバージョンに向けて 本当にためになりました ありがとうございます

その他の回答 (5)

noname#52504
noname#52504
回答No.6

今更ですが、マクロを使わない場合を参考までに。 基本的な考え方は、 「シートをもう1枚使って計算(標示立て)はそっちでやり、名前を介して条件付書式で塗る。」 だけです。 以下、質問者様のレベルであれば必要以上にくどい記述かと思いますが、ご容赦くださいませ。 0.質問にあるような位置、様式の表がSheet1にあるとします。 1.Sheet1入力部分の表示形式を設定。        "作業A" 0 "日間";"作業B" 0 "日間";"休";"えら~" ※作業Aについては正数で、作業Bについては負数で日数を、休日は0を入力する仕様。 文字列を入力すると"えら~"を表示。 ※休日を0で入れる仕様は、テンキーだけで入力できた方が便利かなと思ったまでです。 将来他の表から参照で引っ張るような処理を考えるなら、空白セルとの混乱を避けるために文字列で入れるようにした方が良いかもしれません。 2.別のシート(Sheet2とします)のB3セルに数式を入力。   =IF(Sheet1!B3="",(ABS(A3)-1)*SIGN(A3),(Sheet1!B3=0)*A3+Sheet1!B3) ※休日を文字列で入れる仕様なら   =IF(Sheet1!B3="",(ABS(A3)-1)*SIGN(A3),IF(Sheet1!B3="休",A3,Sheet1!B3)) 3.2の式を右・下方向にコピー   右方向:日数以上の列数   下方向:作業者数以上の行数 4.Sheet2の表に名前を付ける   ・範囲は“A1セルから”、数式をコピーした部分の右下端まで   ・以下、"WorkTable"という名前にしたとします。 5.Sheet1の入力部分に条件付書式を設定する   (アクティブセルがB3なら)   ・条件1 数式が =AND(B3<>"",B3=0) 書式:赤   ・条件2 数式が =INDEX(WorkTable,ROW(),COLUMN())>0 書式:緑   ・条件3 数式が =INDEX(WorkTable,ROW(),COLUMN())<0 書式:青 ※休日を文字列で入れる仕様なら、条件1の数式はB3="休"でOK ※休日を塗らない場合も、条件だけは入れて下さい(書式は設定しない) 6.必要に応じて   ・Sheet1を列抜きができないように保護する。   ・入力規則を設定する。   ・Sheet2を非表示にする。 Excel2003で動作確認 欠点 ●Sheet1の列を抜くと参照エラーが起きます。  回避するには、列を抜けないよう保護するか、  Sheet1の見出し行をSheet2にリンク貼り付けしてLookUpするなどの対策が必要です。 ●表示形式、名前、条件付書式…と色んな機能をつまみ食いするので、後から見て全体の構造が掴みにくい。 ●日数・作業者数・PCのスペック等によっては、処理速度に問題が出るかも。 ●Sheet2の数式で埋める部分は、日数・作業者数以上でなければなりませんが、  随時増やすのは煩雑ですし、予め大量に埋めておくのはムダっぽい(苦笑  表を拡張する機能だけマクロ化するのは本末転倒(笑 ●原理的に作業の種類は3種類までです(条件付書式の限界)  ※文字列で入力&作業シート2枚(作業種/日数)とか、或いはいっそコード化して桁別に演算すれば、3種類までは塗り分けられます。 ●こういう表示形式の使い方は、仕様・運用方法が確定していれば結構便利ですが、思わぬ場面で痛い目にあうことがあります(経験者談) 特にオートフィルタとの相性は最悪です。 ************************************************* マクロを使うよりこっちの方が良いというつもりではありません。 ・汎用性(つぶし、応用が利く) ・保守性(維持管理改良改造が楽) ・堅牢性(ミスや無知で壊れない) いずれの点から考えても、マクロを使った方が絶対に賢いと思います(笑 ただ(幸いにして質問者様は該当しないようですが) ・セキュリティポリシー上の問題とか、 ・セキュリティシステム上の問題(配布や有効化に伴う問題)とか、 ・自分が退職したら引き継ぐ人間がいないとか(笑 ←私の場合はこれ マクロを使いにくい状況もままありますので。 乱長文スミマセン

ennkai
質問者

お礼

お返事おそくなりまして もうしわけないです。 関数でもこういうことが可能とは 想像もしていなかったので驚きです。 頑張って勉強していきたいとおもいます 大変参考になりました

  • banker_U
  • ベストアンサー率21% (17/78)
回答No.5

#4です。大変申し訳ないのですが、断念します。 すいませんでした。 以下の方法で、うまくいくかなあといろいろ考えたのですが、うまい方法は思いつきませんでした。 考えた方法: 1.基本的に全セルに計算式が入る。 2.休暇セルには計算式をいれずに数値で0を入力。 3.数字を入れたセルは計算式で右に行くに従って1づつ減る(最小1)。 4.休暇でもなく、塗りつぶしもしないセルは計算値が-1になるようにする。 5.そのうえで、「表示形式」を「ユーザー設定」で 0;;"休" (場合によっては0も入れない)。 6.条件付書式で1以上を塗りつぶす設定をする。 という方法なんですが、計算式が結局IF文をネストさせる形しか思いつきませんでした。 これだと、#4でも書いたとおり、休暇の連続数に限界があるので、面白くありません。 MATCH関数か何かでうまくいくかなあと思ったのですが、 やっぱりだめでした。 お騒がせしてすいませんでした。 どなたかフォローできる方いらっしゃいましたらお願いします。

  • banker_U
  • ベストアンサー率21% (17/78)
回答No.4

もう回答が出ているようなので、なんだったら無視してもらってもいいです。 「休」の連続は最大何日ぐらいですか? 5日ぐらいまでなら、マクロを使わずに関数と条件付書式でいけそうな気もします。(それを超えると関数のネスト制限で多分アウト) 正直言って、この手の話はまさにイベント駆動型のマクロで解決すべきと思いますが、ちょっと面白いパズルとして関数で考えてみたいので、しばらく締め切らないで空けといてもらえませんか?重ねて言っときますが、失礼な話だと思ったら、無視してもらってもいいです。

ennkai
質問者

補足

こんばんわ 「休」の連続する日数は5日超えるか超えないかで 微妙なところではあります。 実際のシフトを組む上での運用なので 絶対「超えません」ともいえない面がありますので。 私自身としましては 皆様からいただけるご回答は すべてためになる内容ばっかりですので お気になさらないで下さい。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

土日などは関係なく、「休」だけが休み(作業日を飛ばす)と考えていいのですか?

ennkai
質問者

補足

さっそくありがとうございます。 言葉足らずでもうしわけありません。 カレンダー上の土曜日や日曜日、そして祝日祭日には一切 関係なく 作業者ごとに前もって入力されている 「休」だけを飛ばす(塗りつぶさない)ということになります。

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.1

「休」が2日以上続く場合も有りですか?

ennkai
質問者

補足

早速ありがとうございます 「休」が連続する場合もあります。 日数の入力数も2桁はありえます。

関連するQ&A

  • EXCELでの工程表の作り方を教えてください

    EXCELは簡単な関数しか使えない者です。 この度下記のような工程表を作成することになり、 検索しましたがなかなか思うような例がありません。 関数・マクロに詳しい方、どなたかご教授願えませんでしょうか。 (利用環境はExcel2003です) (1)A1のセルに「入力規則→リスト」で担当地区を選択するようになっている (2)A4~A200のセルに、細分化した作業工程の明細が段階毎に入力されています。 (3)B4~B200のセルは「入力規則→リスト」で”未処理”と”処理済”を選択するようにしています。 今回の要望はB列のセルを”処理済”にした段階で、 同じ行のC列に、A1で選択している担当地区をコピーし、 同時にD列に”処理済”に変更した年月日時間を入力したいのです。 色々調べてIF関数で挑戦してはみたものの、 A1セルを変更した段階で今までの作業工程も 全て更新されてしまいます。 マクロ・関数で実現可能であればご教授いただきたいです。 宜しくお願いいたします。

  • エクセルでつくる集計表の計算式

    曜日単位の集計を行う式を教えていただけないでしょうか A欄  B欄 C欄 日付 曜日 人数 A欄は1~31日 B欄は月ごとに変わりますが、日~土 C欄は人数が入る表の下に 日~土の7セルを作り、そのセルの中に、上記表の曜日単位の人数を入れたいのですが、どんな条件式にすればよいのか教えていただけないでしょうか

  • Excel 作業工程表を作りたいのですが、ネスト制限で作れません。

    Excelで下記のような作業工程管理表を作成しようと思っています。 1つの作業を1行で管理するものとし、 A列には作業の名前を入力し、 B列には作業のステータスを表示、 それより右の列はC列を「工程1」として右方向の 各列に「工程30」まで各々割り振ります。 表の使用方法としては「工程1」が終わればその日の 日付を入力し、工程が進んでいくごとに各列に日付 を入力していきます。 質問の内容は、 B列の作業のステータスを、各工程の進み具合によって 自動的に表示する方法を知りたいのです。 (ステータスの種類は工程の数と同じく30近くあります) 最初はIF関数を使い 「=IF(C1="","ステータス1",IF(D1="","ステータス2",IF(E1="","ステータス3",IF(F1="","ステータス4"……..)」という風に、各セルに数値が入っているか いないかを判断してステータスを表示 していたのですが、ネストの制限があるため 30の工程をカバーしきれませんでした。 どうか、よいヒントをいただければうれしいです。 質問がわかりづらかったら申し訳ないです。 以上よろしくお願いいたします。

  • エクセルで作成した勤務表を週間勤務表に抽出したい

    エクセルで作成した勤務表を元にして 週間勤務表(月~日)を作成したいのです。 現状はコピペで作業をしていますが可能であれば シートをファイルに貼り付ける事により自動計算で反映できるようにしたいと思います。 月初めは1日からですが曜日が都度変わるためそのための関数式が 分かりませんでした。 現在の勤務表は B6以降B欄には社員名 セルC3に月    C4に日    C5に曜日    C6以降はその日の勤務シフト(早、遅 等) 週間予定表は  A6以降A欄が社員名  G4が日  G5が曜日(固定)  G6以降がその社員の勤務シフト と表示したいので 19年8月の場合8/1が水曜日なので  I4に「1」  I6に「シフト」  のような表示が可能な関数式を探しております。 宜しくお願い致します。

  • エクセル 曜日に対応する担当者を表示するには?

    毎週月曜日と木曜日に行っている、あるイベントの予約表を作成しています。 予約表のイメージですが、A4用紙の片面に次の項目が入ります。 (1)年月日 (2)曜日 (3)担当者名(担当者は月曜日・木曜日別の人) (4)予約表 1枚/日で、8~9枚/月必要になるので、同じ書式のものを9枚分作り、 毎月末に、二月先の分を1か月分プリントしようと考えています。 (1)については、 1枚目の年月日用のセルに二月先の第一月曜日の年月日を入力。 2枚目の年月日用のセルに、「1枚目の年月日+3」と設定して→次の木曜日を自動表示。 3枚目の年月日用のセルに、「2枚目の年月日+4」と設定して→翌週の月曜日を自動表示。 4枚目の年月日用のセルに、「3枚目の年月日+3」と設定して→翌週の木曜日を自動表示。 5枚目の年月日用のセルに、「4枚目の年月日+4」と設定して→翌々週の月曜日を自動表示・・・。 という方法で、一枚目の第一月曜日を入力すれば、2~9枚目までは自動的に表示されるというやり方にしました。 (2)については、曜日用のセルにWEEKDAY関数を使いました。 9枚とも曜日用のセルにWEEKDAY関数を入れて、表示されるやり方にしました。 (4)については、毎回変更することはないので、9枚とも同じ表を入れました。 問題は(3)です。 (2)の曜日に対応して、担当者を表示するためにはどうすればよいのでしょうか。 宜しくお願致します。 上記でお分かりかと思いますが、エクセルは素人です。 もし、(1)、(2)についてももっとスマートな方法がありましたら、教えてください。

  • エクセルで関数を入力する際 右方向一覧が数字に・・・

    エクセルで関数入力をしようとして気がついたのですが、計算式を入力する際A1 B2等セル名を入れますよね。なぜか私のパソコンの画面は横方向が、縦方向と同じ数字になっています。A1が11 B2が22・・・という風に。でも関数を入力しようとするとセル名の欄にはRCなどとのっていたりして、どうやって計算式を入れたらいいのかさっぱり?です。セルをさいしょの状態に戻すにはどうしたらいいのでしょうか?初心者でお恥ずかしい質問です。

  • エクセル2000で関数を使って予定表を作りたいのですが・・・(2)

    先ほども質問させてもらったのですが、初心者のためなかなかできませんのでもう一度お願いします。 C3に2002年、D3に12月、A5に日、B5に曜と入力し下記のように表を作っています。 日 曜 1 日 2 月 3 火 ・ ・ ・ ・ ・ ・ 日にちの欄は1.2まで入力し後はコピーして31まで入力しました。 曜日の欄は=DATE($C$3,$D$3,A6)で入力してます。 1シートに2ヶ月分表示させます(例えば左は12月で右は1月というように)。そこで質問させてください。 1、土曜、日曜、祝日の日付、曜日の色を赤にするにはどうしたらいいですか? 2、2ヶ月分のカレンダーを表示させるにあたってJ3セルには翌月の月数が自動的に表示されるようにするにはどうしたらいいですか。また年が変わった時にはI3セルに年数が表示されるようにするにはどうしたらいいですか? テキストにはDATE関数とTEXT関数は使用すると書かれてました。 よろしくお願いします。

  • エクセル勤務表作成中なのですが・・・

    初めて質問します。よろしくお願いします。 エクセル2003にて勤務表を作成しているのですが、こんな事ができるものなのでしょうか?     A    B   C   1 H18年  8月  2  21   月   出勤  3  22   火   出勤  4  23   水   休み   ・   ・   ・ 32  20   日   休み シート1にこの様な表を作り、シート2の1つののセルに休みの日付を自動的に抽出したいのですがこの様なことは可能でしょうか? ちなみにA1,B1には数字のみの入力で表示形式で年月を表しています。A2には=DATE(A$1+1988,B1,21)という関数で日にちを表示、A3以降は=A2+1というようにして表示しています。曜日は=IF(A2="","",WEEKDAY(A2))という関数で表示しています。 私エクセル関数に関してはあまり詳しくありません。この表もフリーソフトで入手したものを使用しています。 よろしくお願い致します。

  • エクセルの横長の表の行のデータの有無の探し方

    エクセル2003で、列も行も多い表を作りました。印刷する事は無く、画面上でデータ管理のみに使います。特に横方向にセルが多く、A~Z、AA~AZと今後それ以上増える見込みで、縦のセルも今後増えます。 なじみ易い例で仮に説明すると、項目名として、1行目には横方向に、A列には縦方向にそれぞれ草野球チームの名前を1セル1チームずつ入力していき、縦と横の交わった地点にあるセルにその2チームの過去の対戦年月日を入力したようなものです。 質問ですが、例えば、A30のセル(あるチーム名)を一旦ポイントし、その右側に対戦年月日が入力されているセルがあるかどうかを調べる場合に、いちいち右端までスクロールしながら目視で確認しなくてもわかる方法があれば教えてください。日付は2013/9/29のように入力しています。

  • エクセルで時間割表に自動的に入力されるようにしたい

    こんにちは、いつも大変お世話になっています。 現在時間割表を作成しています。 B3に教員名「山田」 B4~F4に「月」「火」「水」「木」「金」 A5.6(セルを結合しています)に「1限」 A7.8に「2限」A9.10に「3限」A11.12に「4限」A13.14に「5限」 B5には「科目名」 B6には「教室」が入ります。(他のセルも同様で、上に「科目」下に「教室」です) H3 O3 A16 H16 O16にもそれぞれ教員名が入り 同じように一週間の時間割があります。 別のシートには 「教員名」「曜日」「時限」「科目」「教室」   山田  月    1   英語  302   山田  月    2   英語  102   山田  火    1   国語  208   田中  月    3   数学  308   田中  水    5   数学  103 となっています。 今は時間割表に手動で科目と教室を入力しているのですが、 20名分の作業になり大変です。 一覧のデータから自動的に時間割表に入力することはできないでしょうか? windowsXP Office2003を使用しています。 よろしくお願いします。

専門家に質問してみよう