tatsu99様 昨日は「VBAシフト表における従業員の固定休のプログラムについて」の件ありがとうございました。
従業員の休みに対応したVBAプログラム、活用させていただいております。
昨日の今日で大変申し訳ないのですが、今回の質問は勤務管理表の休み以外のセルに、設定シートにある従業員の担当業務を勤務管理表シートに割り振りするプログラムについてご教示頂きたく質問致しました。

添付した画像を例に構築したいVBAプログラムをご説明させていただきます。
日にちは14日から一ヶ月とします。
上段の設定シートと下段の勤務管理表シートは同じExcelファイルになります。キャプチャする為に分割致しました。
設定シートの表は各従業員の担当業務になります。
それを勤務管理表の「休」以外のセルに優先1の業務をそれぞれの担当者に出力。
一日の業務には必ず「会議」、「事務」、「営業」を組み込みます。
14日を例としますと「営業」担当のCさんが休みの為、Eさんが「営業」担当になります。
17日は「会議」担当のBさんがお休みの為、Aさんが「会議」担当になります。
この様に「休」のセル以外に、担当常務を割り振るプログラムとその担当者が休みの場合に違う担当者が変わりを勤めるプログラムを作成したい内容になります。
また文字の色の条件を「サポート」は赤、「会議」は緑、「営業」は黄色、「事務」は水色と設定をしたいです。
勤務管理表の休みの関係で担当業務の「会議」、「営業」、「事務」を出力した際に重複があった場合はMsgBoxで「重複があります!」のメッセージを。また背景を赤で表示させたいです。

以上が私が構築したいプログラムの内容になります。

tatsu99様 よろしくお願い致します。

「tatsu99様 VBA勤務管理表の業務」の質問画像

質問者からの補足コメント

  • tatsu99様、設定シートの各従業員担当業務の表の最新キャプチャ画像を添付致しましたのでこれを例にお礼からご説明致します。

    「tatsu99様 VBA勤務管理表の業務」の補足画像1
    No.5の回答に寄せられた補足コメントです。 補足日時:2017/05/15 12:05

A 回答 (18件中1~10件)

下記URLに記述しました。


http://climbi.com/b/10180/0
標準モジュールに登録してください。他のマクロとはべつのモジュールに登録してください。

設定シート記入時の条件です。
1)優先1で業務の重複不可
2)優先1=ヘルプの場合、優先2~優先4は空白扱いとする。(設定しても無視する)
3)優先1=サポートの場合、優先2~優先4迄、全て設定してあることが必須。
4)優先1=会議、又は事務又は営業の場合(以降専従要員とする)
  優先2~優先4は設定してもしなくても良い。
  (優先Nが空白の場合、以降の優先の指定は無視する)

業務を割り付けるときの手順です。
空白の欄が割りつけ可能なセルになります。このセルに「休」などの文字が設定されている場合は、業務を割りつけません。
「休」以外の文字も割り付け不能なセルとして扱います。
1)1人出勤の場合、
 会議、事務の何れかが割り付け可能なら、優先順位に従い、どちらかを割り付ける。
 上記以外の場合は、空白を割り付ける。
2)2人出勤の場合
 ①会議及び事務の割り付けが可能なら、以下の方法に従う。
  一方がどちらかの業務しか割り当てられない場合は、その業務を割り当て、他方に別の業務を割り当てる。
  両方がどちらの業務も割り当てられるなら、高い方の会議の優先順位を持つものに会議を割り当て、他方に事務を割り当てる。
  会議の優先が両方同じなら、高い方の事務の優先順位を持つものに事務を割り当て、他方に会議を割り当てる。
 ②上記①ができない場合は、以下の処理をする。
  一方が会議も事務も割り付け不能なら空白とし、残りの他方に1人出勤のケースを適用する。
 (他方は会議、事務、空白の何れかになる)
  上記以外は、以下の処理をする。(両方会議のみ割り当て可能、又は両方事務のみ割り当て可能)
  割り当て可能な業務について高い方の優先順位を持つ方にその業務を割り当て、他方は空白とする。
3)3人出勤の場合
 ①1人がヘルプの場合は、その人に空白を割り当てる。残りの2名については2人出勤のケースを適用する。
  上記で終了
 ②専従要員3人の場合、優先1の業務を3人に割り当てる。
  上記で終了
 ③専従要員2人、サポート要員1の場合
  専従要員2人に優先1の業務を割り当て、残りの業務をサポート要員に割り当てる。
  上記で終了。
4)4人出勤の場合
 ①1人がヘルプの場合は、その人にヘルプを割り当てる。残りの3人は、3人出勤のケースを適用する。
  上記で終了
 ②上記以外(専従員3人、サポート要員1人の場合)
  専従要員3人の場合、優先1の業務を3人に割り当てる。サポート要員にはサポートを割り当てる。
  上記で終了
5)5人出勤の場合
 ①専従要員3人に優先1の業務を割り当てる。サポート要員にはサポートを割り当てる。ヘルプ要員にはヘルプを割り当てる。

不具合があれば、連絡ください。できるだけ対応します。但し、仕様の変更及び追加についてはご遠慮ください。
今回は対応しましたが、今後は私宛に質問&依頼をされましても回答できる保証はありませんのでご了承ください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
感激です!
不具合などございません。
活用させて頂きます。
色々と触って勉強致します。
今後の対応の件ご理解致しました。

tatsu99様。
この度は私の質問にお付き合いと、また分り易い丁寧なプログラム説明のご教示を頂きありがとうございました。

お礼日時:2017/05/19 06:11

5人体制にすることにより、かなり、簡単になりましたが、それでもまだ複雑な部分があります。


サポート担当者には、優先2~優先4に全て設定を行う予定でしょうか。(従って、サポート担当者はどの業務も割り当て可能)
もしそうであれば、更に、割り当て方法が簡単になり、更に納期が短縮できますがいかがでしょうか。
優先2~優先4に、会議、事務、営業を設定するときの、優先順位は特に問いません。
    • good
    • 0
この回答へのお礼

No.16の回答にお答え致します。
例として、Cさん、Dさん、Fさん出勤の場合は、
Cさん優先1の「営業」、Dさん優先1の「事務」、Fさんは「会議」の割り当て不能なので空白。・・・・①
となります。
それとも、このケースは、実質的には、2人出勤のケースになるので、「会議」と「事務」を割り当てることが優先されるので、
Cさん優先2の「会議」、Dさん優先1の「事務」、Fさんは「営業」の割り当て不能なので空白。・・・・②

②の方でお願い致します。

Cさん、Dさんの2人出勤の場合は、Cさん優先2の「会議」、Dさん優先1の「事務」・・・③
となります。
はい、そうです!
こちらで問題ございません。

No17の回答
サポート担当者には、優先2~優先4に全て設定を行う予定でしょうか。(従って、サポート担当者はどの業務も割り当て可能)
はい、今後割り当てる予定です。

宜しくお願い致します。

お礼日時:2017/05/17 15:30

>ではtatsu99様、優先1で業務の重複なし「サポート」、「ヘルプ」も重複なしの5人体制でのプログラム作成をお願い致します。


>人件費の問題もありますので5人体制での勤務管理表に致します。

承知いたしました。
念のため、確認しますが、優先1で「ヘルプ」となった人は、他の業務は担当できません。
優先2~優先4は、必ず空白となります。
従って、ヘルプ以外の業務割り当てきません。割り当て結果は、「ヘルプ」か空白の何れかになります。
宜しいでしょうか。


No12で確認の回答をいただいてないものがありますので、再確認します。

あなたが提示された出勤者3名の場合の要件です。
>②ここで重ね条件があり出勤者3名の日の条件は「会議」、「営業」、「事務」を優先番号高い者から割り振る。それ以外は空欄処理。
>例:No5の添付画像を例にします。Aさん、Bさん、Cさんが出勤の場合はBさん優先1の「会議」Cさん優先1の「営業」Aさんは残りの優先3の「事務」を割り当てる。
>例:Aさん、Cさん、Dさんが出勤の場合はCさん優先1の「営業」Dさん優先1の「事務」Aさんは残りの「会議」を割り当て。
>例:Bさん、Dさん、Eさんの出勤の場合はBさん優先1の「会議」Dさん優先1の「事務」Eさんは営業がないので空欄処理。

上記の要件にあてはめると、
例として、Cさん、Dさん、Fさん出勤の場合は、
Cさん優先1の「営業」、Dさん優先1の「事務」、Fさんは「会議」の割り当て不能なので空白。・・・・①
となります。
それとも、このケースは、実質的には、2人出勤のケースになるので、「会議」と「事務」を割り当てることが優先されるので、
Cさん優先2の「会議」、Dさん優先1の「事務」、Fさんは「営業」の割り当て不能なので空白。・・・・②

私が確認したかったのは、①なのか②なのかということです。
あなたが提示された出勤者2名の場合の要件に従うと、「会議」と「事務」が必須で以外は空白です。
Cさん、Dさんの2人出勤の場合は、
Cさん優先2の会議、Dさん優先1の「事務」・・・③
となります。

Cさん、Dさんが2名出勤の状態(③の割り当て)で、役に立たないFさんが出勤すると、①の割り当てと
なってしまうのはいかがなものかと。
    • good
    • 0

ちなみに、優先1で業務の重複なし(サポート、ヘルプも重複なし)なら、5人体制となります。


この条件で良いなら、格段に業務の割り付け方法が簡単になります。
現在、マクロで作成で悩んでいる原因は、優先1にサポートが2名(将来的には3名)になる為です。
    • good
    • 0
この回答へのお礼

ちなみに、優先1で業務の重複なし(サポート、ヘルプも重複なし)なら、5人体制となります。
この条件で良いなら、格段に業務の割り付け方法が簡単になります。
なるほど!
ではtatsu99様、優先1で業務の重複なし「サポート」、「ヘルプ」も重複なしの5人体制でのプログラム作成をお願い致します。
人件費の問題もありますので5人体制での勤務管理表に致します。

よろしくお願い致します。

お礼日時:2017/05/17 04:40

>設定表の従業員の優先1においては重複がおきない様に設定致します。


これが、適用されるのは、会議、事務、営業の3つのみではないでしょうか。
サポート、ヘルプも重複させないなら、6人体制はあり得ません。

No13の例はサポートが2人の場合です。
    • good
    • 0

現在、わかっている範囲で不明なのは、3人体制の以下のケースです。


>ここはNo5の補足の添付画像から
>Aさん 優先1=サポート、優先2=会議、優先3=事務、優先4=営業
>Bさん 優先1=会議、優先2=事務
>Cさん 優先1=営業、優先2=会議
になります。
>Aさん、Bさん、Cさんの場合は3名出勤の条件の3業務を割り振るので、Bさん「事務」、Cさん「会議」、Aさん「営業」にそれぞれ割り振るというものになります。
>Aさん、Bさんの2名の場合は2名出勤の条件の2業務を割り当てるので、Bさん優先2「会議」、Aさん優先3「事務」になります。

私が確認したいのは、添付図の状態ではなくて、設定シート上で
Aさん 優先1=サポート、優先2=営業、優先3=事務、優先4=会議
Bさん 優先1=サポート、優先2=営業、優先3=事務、優先4=会議
Cさん 優先1=ヘルプ
と定義されていた場合で、
Aさん、Bさん、Cさんの3人体制の場合、どうなるのかということです。
(設定シートに上記のような設定はあり得るはずです)

添付図にできるだけ沿った例ならば、(Aさんは優先順位は変更、Eさんは業務が追加されています)
Aさん 優先1=サポート、優先2=営業、優先3=事務、優先4=会議
Eさん 優先1=サポート、優先2=営業、優先3=事務、優先4=会議
Fさん 優先1=ヘルプ
が定義されていて
Aさん、Eさん、Fさんので3人体制のケースです。
(このような設定は実際には行わないかもしれませんが、あり得るはずですのマクロ作成時は考慮しておく必要があります)
    • good
    • 0
この回答へのお礼

あ、なるほど。
上記の例が設定されていた場合の話ですね。
また私の言葉足らずな説明で申し訳ございません。
上記の設定は作らないと思って下さい。
設定表の従業員の優先1においては重複がおきない様に設定致します。
これは1日の業務を重複しない様にする為です。
私の説明で分かりますでしょうか?

お礼日時:2017/05/16 16:28

ほぼ要件は確定したかと思いますので、検討に入りますが、難航しそうです。


現在、わかっている範囲で難航しそうなのは、「最適の業務を優先順位に従い割り付ける方法」です。
これは、割り付け可能なパターンが複数あるとき、どのパターンを採用するかを決める方法です。
例えば、提示例での2人体制でAさん、Bさんの場合、
①Aさん=事務、Bさん=会議
②Aさん=会議、Bさん=事務
の2つが考えられますが、望まれているのは①と考えられる為です。(Bさんの優先1が会議の為)
①②のいずれでもよいなら、多少は容易になりますが、①を期待する場合は、十分検討する必要があります。

又、提示例では、Eさんはサポートのみ、Fさんはヘルプのみですが、将来的には、Aさんのように全ての業務が可能になる
ことを想定してマクロを作成する必要があります。そのような時、「最適の業務を優先順位に従い割り付ける方法」
をきちんと確定しておかないと、「割り付けは間違ってはいないが、期待する割り付けになっていなかった」となる可能性があります。
よって、この割り付けの方法について、十分検討したいので、最大1週間ほど、時間をいただけませんでしょうか。
1週間後に完全に期待する割り付け結果を出力するマクロを提示できる保証はありませんが、検討します。
もし、多少の妥協(スペックダウン)が必要になる場合とか不明点がでた場合、その都度、ご連絡します。

現在、わかっている範囲で不明なのは、3人体制の以下のケースです。
Aさん 優先1=サポート、優先2=営業、優先3=事務、優先4=会議
Bさん 優先1=サポート、優先2=営業、優先3=事務、優先4=会議
Cさん 優先1=ヘルプ
上記の3人体制の場合、
Cさん=空白は、決定できますが、
Aさん、Bさんは何を割り当てるのでしょうか?
①Aさん=営業、Bさん=事務
②Aさん=事務、Bさん=会議
①、②のどちらでしょうか。
要は3人体制で1人が空白の場合は、残りの2人を2人体制の場合のルールを適用するか否かということです。(①なら適用しない、②なら適用する)
(2人体制を適用する場合は、残りの2人は営業を割り当ててはいけない)

又、3人体制で2人が空白の場合は、残りの1人を1人体制のルールを適用して良いでしょうか。
    • good
    • 0
この回答へのお礼

現在、わかっている範囲で不明なのは、3人体制の以下のケースです。
Aさん 優先1=サポート、優先2=営業、優先3=事務、優先4=会議
Bさん 優先1=サポート、優先2=営業、優先3=事務、優先4=会議
Cさん 優先1=ヘルプ
ここはNo5の補足の添付画像から
Aさん 優先1=サポート、優先2=会議、優先3=事務、優先4=営業
Bさん 優先1=会議、優先2=事務
Cさん 優先1=営業、優先2=会議
になります。
Aさん、Bさん、Cさんの場合は3名出勤の条件の3業務を割り振るので、Bさん「事務」、Cさん「会議」、Aさん「営業」にそれぞれ割り振るというものになります。
Aさん、Bさんの2名の場合は2名出勤の条件の2業務を割り当てるので、Bさん優先2「会議」、Aさん優先3「事務」になります。

お礼日時:2017/05/16 14:15

>4名以上出勤の場合は「会議」、「事務」と「会議」、「事務」、「営業」が割り当てられている場合に限りEさんの「サポート」Fさんの「ヘルプ」が出力される処理。

それ以外は空欄処理。

これは、以下の意味と理解しました。
①「会議」と「事務」が割り当て済みなら、「サポート」、「ヘルプ」を出力する。
②「会議」と「事務」と「営業」が割り当て済みなら、「サポート」、「ヘルプ」を出力する。

そうすると、
>Bさん、Dさん、Eさん、Fさんの場合
>Bさん優先1の「会議」Dさん優先1の「事務」Eさん「空欄」Fさん「空欄」処理です。
とありますが、①のケースに該当するので
Bさん優先1の「会議」Dさん優先1の「事務」Eさん「サポート」Fさん「ヘルプ」処理ではないでしょうか?


それとも①は誤りで、②のケースのみが「サポート」「ヘルプ」出力の条件でしょうか。

もし、①も「サポート」「ヘルプ」出力の条件であるなら、3人体制の場合の条件と矛盾するので、
その場合も問題があります。
    • good
    • 0
この回答へのお礼

②のケースのみが「サポート」「ヘルプ」出力の条件でしょうか。
申し訳ございません。はい、tatsu99様の仰る通り②のケースのみが出力条件になります!

お礼日時:2017/05/16 09:47

>空白処理の定義ですが、私が考えたものになりますが設定シート表のG2セルに「条件」とタイトルをつけ、G3セルに「会議」、


>G4セルに「事務」と入力しこのセルに担当者の優先順位から該当しないものは空白処理という事は可能でしょうか?

「会議」と「事務」を外出しにする理由は何でしょうか?
そうするとマクロとしては、G3セルに「ヘルプ」、G4セルに「サポート」が定義された場合、どうなるのか、
G3セルのみ定義され、G4セルが空白ならどうなるのか等のケースも考慮する必要があります。
このようなケースを含めてまで、要件定義をする必要があるのでしょうか。
又、「会議」と「事務」を外出しにすると、3人体制では、「会議」と「事務」と「営業」が必須であるという前提で、
「営業」のみ内部で抱え込みになってしまいます。
又、「ヘルプ」についても優先1にみ定義可能というような、特別な意味を持たせており、この情報も内部で抱え込みです。
その為、一方で内部抱え込みの情報をもち、他方で一部を外出しにすると、整合性が保障されなくなります。
これについては、外出しでなく「会議」と「事務」固定にしていただけませんでしょうか。


現在まで、私が記憶している業務固有の制約については、以下の点ですが、齟齬があれば指摘ください。
①「ヘルプ」は、優先1にのみ定義可能。そして、その場合、優先2~4に他の業務を定義した場合はエラーとする。
②「会議」と「事務」と「営業」は、優先1に1つだけ定義可能。また、各々1つが定義されていない場合は、エラーとする。
 例 Aさん=「会議」、Bさん=「事務」、Cさん=「サポート」、Dさん=「サポート」、Eさん=「サポート」は、エラー。(営業がない為)
 例 Aさん=「会議」、Bさん=「事務」、Cさん=「営業」、Dさん=「営業」、Eさん=「サポート」は、エラー。(営業2つの為)
③「ヘルプ」と「サポート」は優先1に複数回定義可能。0回でもOKとする。(以下の意味です)
 優先1の例
 A=会議、B=事務、C=営業のとき、D=サポート、E=サポート、F=サポートはOK。
 A=会議、B=事務、C=営業のとき、D=ヘルプ、E=ヘルプ、F=ヘルプはOK。
④1人体制では、担当者を「会議」又は「事務」に割り当て不能の場合、空白とする。
⑤2人体制では、担当者を「会議」及び「事務」に割り当て不能の場合、空白とする。(2つとも揃わないと空白)
⑥3人体制では、担当者を「会議」及び「事務」及び「営業」に割り当て不能の場合、空白とする。(3つが揃わないと空白)
 それとも、3人体制でも、「会議」及び「事務」に割り当てができれば、残りは「サポート」又は「ヘルプ」でも良いのでしょうか。
 そうなると、最初に提示された『一日の業務には必ず「会議」、「事務」、「営業」を組み込みます。』の話は、亡くなったのでしょうか。

⑦4人体制でも、担当者を「会議」又は「事務」「営業」に割り当て不能の場合、空白とする。
 例として、Bさん、Dさん、Eさん、Fさんの場合、
 Eさんはサポートのみなので空白、Fさんもヘルプのみなので空白となる。
 それとも、4人体制でも、「会議」及び「事務」に割り当てができれば、残りは「サポート」「ヘルプ」でも良いのでしょうか。
⑧5人体制も⑦と同様。
 (提示例でAさんをサポートだけ定義し、Aさん、Cさん、Dさん、Eさん、Fさん体制のケース)(会議、事務、営業の3業務は割り当て不能)


又、念の為、確認ですが、設定シートに定義可能な業務は、
「会議」、「事務」、「営業」、「サポート」、「ヘルプ」の5業務のみを想定しています。
任意の適当な文字、例えば「待機」の業務を設定シートに定義すれば、勤務管理表に「待機」が表示されるようなことは考えていません。
もし、このようなことを望まれるなら、今までの確認事項を全て破棄して、最初から要件定義に戻る必要があります。
    • good
    • 0
この回答へのお礼

私がVBAの知識不足の為何か良い方法は無いものかと考えた次第でしたがtatsu99様を返って混乱させてしまい申し訳ございません。
下記に条件をまとめさせていただきました。

①それぞれの担当者は優先順位1、2、3、4の順番で業務を割り振る。
例:Aさんの出勤日は「サポート」Bさんの出勤日は「会議」Cさんの出勤日は「営業」Dさんの出勤日は「事務」Eさんは「サポート」Fさんは「ヘルプ」。
②ここで重ね条件があり出勤者3名の日の条件は「会議」、「営業」、「事務」を優先番号高い者から割り振る。それ以外は空欄処理。
例:No5の添付画像を例にします。Aさん、Bさん、Cさんが出勤の場合はBさん優先1の「会議」Cさん優先1の「営業」Aさんは残りの優先3の「事務」を割り当てる。
例:Aさん、Cさん、Dさんが出勤の場合はCさん優先1の「営業」Dさん優先1の「事務」Aさんは残りの「会議」を割り当て。
例:Bさん、Dさん、Eさんの出勤の場合はBさん優先1の「会議」Dさん優先1の「事務」Eさんは営業がないので空欄処理。

2名以下の出勤の条件に「会議」、「事務」を割り当てる。それ以外は空欄。
例:Bさん、Cさんの二人の場合はBさん優先1の「会議」CさんはBさんの会議と重なり「事務」が無いので空欄処理。
例:Aさん、Dさんの場合Dさん優先1の「事務」Aさんは「会議」割り当て。
例:Eさん、Fさんの場合はお互いに無いので空欄処理。

4名以上出勤の場合は「会議」、「事務」と「会議」、「事務」、「営業」が割り当てられている場合に限りEさんの「サポート」Fさんの「ヘルプ」が出力される処理。それ以外は空欄処理。
Bさん、Dさん、Eさん、Fさんの場合
Bさん優先1の「会議」Dさん優先1の「事務」Eさん「空欄」Fさん「空欄」処理です。
Aさん、Dさん、Eさん、Fさんの場合Dさん優先1の「事務」Aさん「会議」Eさん空欄、Fさん空欄処理
5名出勤のAさん、Cさん、Dさん、Eさん、Fさんの場合
Cさんは優先1の「営業」Dさんも優先1の「事務」Aさんが3業務のうちの「会議」Eさんは3名以上で他の方が3業務の条件を満たしているので「サポート」Fさんも「ヘルプ」に割り当て。

以上が業務割り振りの条件式になります。
私の言葉足らずなご説明で誠に申し訳ございません。

お礼日時:2017/05/16 01:44

返信ありがとうございました。


返信で不明な点ついて以下に述べます。

>2)提示例でBさんとCさんの2人体制のとき、BさんとCさんは何の業務をわりあてるのか?
>  Bさんは「会議」、Cさんは「事務」が出来ないので何も入力無し。

念のため確認ですが、Bさんは「事務」、Cさんは「会議」にはしなくて良いのですね。


>4)提示例でEさんとCさんの2人体制のとき、EさんとCさんは何の業務をわりあてるのか?
>  Eさんはそのまま入力なしの、Cさんは「会議」。

Eさんはサポートではないのでしょうか?

>上記の「会議」、「事務」に該当しない場合の処理をそのまま片方、無視するなどの処理は可能でしょうか?
これは、空白出力(入力無し)と理解しましたが、その要件がきちんと定義できれば、可能です。

空白(入力無し)を出力する場合の要件ですが、判らなくなりました。
①Eさん1人体制は、サポートではなく、空白なのですか。
Fさん1人体制は、ヘルプになっていますが、それなら、Fさん1人も空白にならないと矛盾しませんか。
それともヘルプ業務だけの人は、一切他の条件を無視して、「ヘルプ」割り当てですか?

②2人体制で、EさんとFさんの場合も、同様です。
 Eさん、「空白」で、Fさん「ヘルプ」でしょうか。

③3人体制で、Cさん、Eさん、Fさんの場合は、
Cさんは「会議」、Eさんは空白、Fさんは「ヘルプ」ですか。

あなたが考えている、空白出力(入力無し)の要件をきちんと提示していただけると非常にありがたいのですが。
その人が空白(入力無し)になる条件を全て網羅して、いただけませんでしょうか。
    • good
    • 0
この回答へのお礼

不明な点についてご回答申し上げます。
>2)提示例でBさんとCさんの2人体制のとき、BさんとCさんは何の業務をわりあてるのか?
>  Bさんは「会議」、Cさんは「事務」が出来ないので何も入力無し。
念のため確認ですが、Bさんは「事務」、Cさんは「会議」にはしなくて良いのですね。
誠に申し訳ございません。私の回答間違いです。
tatsu99様が仰る通り、Bさんは「事務」、Cさんは「会議」です。

>上記の「会議」、「事務」に該当しない場合の処理をそのまま片方、無視するなどの処理は可能でしょうか?
これは、空白出力(入力無し)と理解しましたが、その要件がきちんと定義できれば、可能です。
可能なのですね!

担当者の業務が空白(入力なし)になる条件を全てご提示致します。
空白処理の定義ですが、私が考えたものになりますが設定シート表のG2セルに「条件」とタイトルをつけ、G3セルに「会議」、G4セルに「事務」と入力しこのセルに担当者の優先順位から該当しないものは空白処理という事は可能でしょうか?
これは「会議」、「事務」が一日の業務の中の絶対条件であるという事になります。
また「会議」、「事務」の片方が重複する場合もその担当者は空白処理。
私の言葉が足りず誠に申し訳ありません。
Eさんが一人体制の場合は「事務」、「会議」が出来ないので「空白処理」。
Eさんは4人以上の時にサポートに割り当てられる。
Fさんが一人の場合もヘルプしか出来ないので空白処理。
申し訳ございません金曜日の図が間違っていました。
正しくはFさんは空白です。
Fさんも4人以上の時にヘルプに割り当て。

以上が空白処理の定義になります。
よろしくお願い致します。

お礼日時:2017/05/15 20:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBAシフト表における従業員の固定休のプログラムについて

VBAの従業員の固定休を求めるプログラムを教えていただきたいご質問になります。
添付した画像を例とします。
シートの名前を勤務管理表とし、A3セルから下にAさん、Bさん、Cさんと入力されています。
ここでは3名とします。
例えば別シートのA1セルにAさん。A2セルに休みの「金」、A3セルに「月」の文字を入力。
それを勤務管理表のAさんのB3セルから左のセル欄に「休」を出力し、またBさん、Cさんも同じ様に入力したい内容になります。

勤務管理表で従業員を50名程作成しなくてはならず作業効率向上の為、一括で入力したいと思いましたので、どなたか詳しい方のご回答をお待ちしております。
よろしくお願い致します。

Aベストアンサー

以下のマクロを標準モジュールへ登録してください。
休みの指定は、添付図のようにB~H迄の列に指定します。
1,2行はマクロ実行前に既に作成されていることが前提、A列の3行以降の従業員名も実行前に作成されていることが前提です。
-----------------------------------------------
Option Explicit
Public Sub 休日割当()
Dim sh1, sh2 As Worksheet
Dim dicT As Object
Dim row, col, maxrow As Long
Dim key, wk As String
Dim i As Long
Set dicT = CreateObject("Scripting.Dictionary")
Set sh1 = Worksheets("休日表")
Set sh2 = Worksheets("勤務管理表")
maxrow = sh1.Cells(Rows.Count, "A").End(xlUp).row 'Sheet1 A列最大行
'従業員の休みの曜日を取得
For row = 1 To maxrow
key = sh1.Cells(row, "A").Value
wk = ""
'B列からH列まで休みの曜日を取得
For col = 2 To 8
If sh1.Cells(row, col).Value = "" Then Exit For
wk = wk + sh1.Cells(row, col).Value
Next
dicT(key) = wk
Next
maxrow = sh2.Cells(Rows.Count, "A").End(xlUp).row 'Sheet2 A列最大行
'休みの設定領域をクリア
sh2.Range("B3:AF" & maxrow).Clear
For row = 3 To maxrow
key = sh2.Cells(row, "A").Value
If dicT.exists(key) = False Then
MsgBox (key & "は休日表に未登録です。処理を打ち切ります。")
Exit Sub
End If
wk = dicT(key)
For i = 1 To 31
col = 2 + i
If sh2.Cells(2, col).Value = "" Then Exit For
If InStr(wk, sh2.Cells(2, col).Value) > 0 Then
sh2.Cells(row, col).Value = "休"
sh2.Cells(row, col).Interior.ThemeColor = xlThemeColorDark1
sh2.Cells(row, col).Interior.TintAndShade = -0.249977111117893
End If
Next
Next
MsgBox ("完了")
End Sub

以下のマクロを標準モジュールへ登録してください。
休みの指定は、添付図のようにB~H迄の列に指定します。
1,2行はマクロ実行前に既に作成されていることが前提、A列の3行以降の従業員名も実行前に作成されていることが前提です。
-----------------------------------------------
Option Explicit
Public Sub 休日割当()
Dim sh1, sh2 As Worksheet
Dim dicT As Object
Dim row, col, maxrow As Long
Dim key, wk As String
Dim i As Long
Set dicT = CreateObject("Scripting.Dicti...続きを読む

Q日計シートから、担当者別の業務月報を作成したい

日計シートには、スタッフ全員の業務記録が有ります。
(担当者の名称は略称で入力されており、tableシートにフルネームと略称が有ります)
日計シートは作業の都度並べ替えがされており、日付、担当、時刻の順番に並んでいます。

上記のような日計データから、担当別の業務月報を作成したいです。
(担当別月報の冒頭にある担当者欄には、フルネームを記載したいです)

日計に書かれている担当者名と月報に記載する担当者名が異なること、
担当者の数が不定期に変わる(月ごとに)為、月報をどう作成したら良いか、
作成した月報は同保存すべきか・・・その辺に悩んでおります。
下記のような雰囲気を考えておりますが、何か良い方法が有ればご教示下さい。
(各シートのイメージ図を補足に付けます)

Dim i as long '繰り返し数
Dim stlest as long  'tableシートのスタッフ列の最下行番号
Dim sname as string '日計を抽出するスタッフ名称(略称)

stalest = Worksheets("table").Range("I15").End(xlUp).Row

for i = 2 to stlast

same = Worksheets("table").cells(i,10).value

(上記snameを使って日計シートを抽出?)
(この辺に担当者名の略称からフルネームを得るための何か?)

(各担当の名称から日計シートを抽出し、その値を月報シートへ?)
(印刷範囲セットとプレビュー)

next i

日計シートには、スタッフ全員の業務記録が有ります。
(担当者の名称は略称で入力されており、tableシートにフルネームと略称が有ります)
日計シートは作業の都度並べ替えがされており、日付、担当、時刻の順番に並んでいます。

上記のような日計データから、担当別の業務月報を作成したいです。
(担当別月報の冒頭にある担当者欄には、フルネームを記載したいです)

日計に書かれている担当者名と月報に記載する担当者名が異なること、
担当者の数が不定期に変わる(月ごとに)為、月報をどう作成し...続きを読む

Aベストアンサー

以下のマクロを標準モジュールへ登録してください。
-----------------------------------------------
Option Explicit
Public Sub 月報作成()
Dim bk1 As Workbook
Dim sh0, sh1, sh2 As Worksheet
Dim dicT As Object '氏名連想配列 キー:ニックネーム 値:フルネーム
Dim dicG As Object '月報連想配列 キー:月報のシート名 値:行番号
Dim yyyy, mm As Long '年、月
Dim maxrow0 As Long 'tableシート最大行数(I列)
Dim maxrow1 As Long '日計シート最大行数(A列)
Dim row, row2 As Long
Dim key As String
Dim sheetName As String
Dim newBook As String
Dim newBookpath As String
Dim ans As Long
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set dicG = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set sh0 = Worksheets("table")
Set sh1 = Worksheets("日計")
Set sh2 = Worksheets("雛形")
yyyy = sh0.Cells(2, "A").Value
mm = sh0.Cells(3, "A").Value
maxrow0 = sh0.Cells(Rows.Count, "I").End(xlUp).row 'table I列 最終行を求める
maxrow1 = sh1.Cells(Rows.Count, "A").End(xlUp).row '日計 A列 最終行を求める
For row = 2 To maxrow0
key = sh0.Cells(row, "J").Value
If key <> "" Then
If dicT.exists(key) = True Then
MsgBox ("ニックネーム重複エラー:" & key)
Exit Sub
End If
'フルーネーム記憶
dicT(key) = sh0.Cells(row, "I").Value
End If
Next
'ニックネームの未登録チェック
For row = 2 To maxrow1
key = sh1.Cells(row, "J").Value
If dicT.exists(key) = False Then
MsgBox (key & "はtableに登録されていません")
Exit Sub
End If
Next
'新規ブックの存在チェック
newBookpath = ThisWorkbook.Path & "\" & yyyy & "年" & mm & "月分業務月報.xlsx"
If Dir(newBookpath) <> "" Then
ans = MsgBox(newBookpath & "が既に存在します。このファイルは上書きされます。続行しますか。", vbOKCancel)
If ans <> vbOK Then Exit Sub
Kill newBookpath
End If
'新規ブック作成
Workbooks.Add
'追加したブックの名前を取得
newBook = ActiveWorkbook.Name
'月報作成
Application.ScreenUpdating = False
For row = 2 To maxrow1
'ニックネーム取得
key = sh1.Cells(row, "J").Value
sheetName = dicT(key)
'最初のシートならシートを新規作成する
If dicG.exists(sheetName) = False Then
dicG(sheetName) = 5
sh2.Copy after:=Workbooks(newBook).Worksheets(Worksheets.Count)
Workbooks(newBook).Worksheets(Worksheets.Count).Name = sheetName
With Workbooks(newBook).Worksheets(sheetName)
.Cells(2, "A").Value = yyyy
.Cells(2, "C").Value = mm
.Cells(2, "G").Value = dicT(key)
End With
End If
row2 = dicG(sheetName)
With Workbooks(newBook).Worksheets(sheetName)
.Cells(row2, "A").Value = sh1.Cells(row, "A").Value '日付
.Cells(row2, "B").Value = sh1.Cells(row, "B").Value '時刻
.Cells(row2, "C").Value = sh1.Cells(row, "D").Value 'ID
.Cells(row2, "D").Value = sh1.Cells(row, "E").Value '顧客名
.Cells(row2, "E").Value = sh1.Cells(row, "F").Value 'メニュー
.Cells(row2, "F").Value = sh1.Cells(row, "H").Value '参考値A
.Cells(row2, "G").Value = sh1.Cells(row, "I").Value '参考値B
.Cells(row2, "H").Value = sh1.Cells(row, "K").Value '備考
End With
dicG(sheetName) = dicG(sheetName) + 1 '行番号加算
Next
'sheet1,2,3を削除
With Workbooks(newBook)
Application.DisplayAlerts = False 'シート削除時の警告を出さないようにする
.Worksheets("Sheet1").Delete
.Worksheets("Sheet2").Delete
.Worksheets("Sheet3").Delete
Application.DisplayAlerts = True 'シート削除時の警告を出すようにする(元に戻す)
End With
Application.ScreenUpdating = True
'新規ブックの保存
Set bk1 = Workbooks(newBook)
bk1.SaveAs Filename:=newBookpath
bk1.Close
MsgBox ("処理完了")
End Sub
----------------------------------------------
不明点は補足してください。

以下のマクロを標準モジュールへ登録してください。
-----------------------------------------------
Option Explicit
Public Sub 月報作成()
Dim bk1 As Workbook
Dim sh0, sh1, sh2 As Worksheet
Dim dicT As Object '氏名連想配列 キー:ニックネーム 値:フルネーム
Dim dicG As Object '月報連想配列 キー:月報のシート名 値:行番号
Dim yyyy, mm As Long '年、月
Dim maxrow0 As Long 'tableシート最大行数(I列)
Dim maxrow1 As Long '日計シート最大行数...続きを読む

QVBAの勤務割表の式を短く

 月間の勤務割表を作成しています。
1列3行を一枡として一人・一日の枡とし、勤務の割り振り状態を表示するものです。
列に日付、行を個人名(max16名)とし1列3行を名前の定義で13種類作成してあります。
別シートの各セルの入力番号に応じて13種類を貼り付けていますが、式を簡単にできませんでしようか?
 お教えくださいませんでしょうか?勉強不足は否めませんが。

尚名前の定義は、1行3列に1--で勤務1・""-""で日勤・""公休""で公等にしてあります。

OS Windows7 Office2010

Sub 図形の貼付け2()
If Worksheets("メイン").Range("J9").Value Then
Select Case Worksheets("メイン").Range("J9").Value 1人-1日
Case 1:
ActiveSheet.Range("勤務1").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 2:
ActiveSheet.Range("勤務2").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 3:
ActiveSheet.Range("勤務3").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 4:
ActiveSheet.Range("日勤1").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 5:
ActiveSheet.Range("日勤2").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 6:
ActiveSheet.Range("日勤3").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Select
Else
Select Case Worksheets("メイン").Range("I9").Value
Case 2:
ActiveSheet.Range("明け").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 4:
ActiveSheet.Range("夜勤").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 5:
ActiveSheet.Range("公").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 6:
ActiveSheet.Range("有").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 7:
ActiveSheet.Range("特").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 8:
ActiveSheet.Range("振").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Case 9:
ActiveSheet.Range("欠").Select
Selection.Copy
Range("D10").Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Select
End If
End Sub

 月間の勤務割表を作成しています。
1列3行を一枡として一人・一日の枡とし、勤務の割り振り状態を表示するものです。
列に日付、行を個人名(max16名)とし1列3行を名前の定義で13種類作成してあります。
別シートの各セルの入力番号に応じて13種類を貼り付けていますが、式を簡単にできませんでしようか?
 お教えくださいませんでしょうか?勉強不足は否めませんが。

尚名前の定義は、1行3列に1--で勤務1・""-""で日勤・""公休""で公等にしてあります。

OS Windows7 Office2010

Sub 図形の貼付け2()
If ...続きを読む

Aベストアンサー

貼り付け処理を一元化するとか。

Q更に勤務割表の式を短く

 月間の勤務割表を作成しています。
1列3行を一枡として一人・一日の枡とし、勤務の割り振り状態を表示するものです。
列に日付、行を個人名(max16名)とし1列3行を名前の定義で15種類作成してあります。
同じシートの各セルの入力番号(2行3列を一升)でに応じて15種類を貼り付けていますが、1人-1日分は、式を短くできたのですが、16人-31日分までの式を簡単にできませんでしようか?この式を496回分作るのは、難儀ですので。

 お教えくださいませんでしょうか?勉強不足でこれが限界です。

尚名前の定義は、1行3列に1--で勤務1・""-""で日勤・""公休""で公等にしてあります。

OS Windows7 Office2010

Sub 名前の定義の貼付け() '1人-1日分
Dim addrname_workpattern As String
addrname_workpattern = ""
With Worksheets("メイン・2")
Select Case .Range("E70").Value
Case 1: addrname_workpattern = "勤務1"
Case 2: addrname_workpattern = "勤務2"
Case 3: addrname_workpattern = "勤務3"
Case 4: addrname_workpattern = "日勤1"
Case 5: addrname_workpattern = "日勤2"
Case 6: addrname_workpattern = "日勤3"
Case Else
Select Case .Range("D71").Value
Case 1: addrname_workpattern = "日勤4"
Case Else
Select Case .Range("D70").Value
Case 2: addrname_workpattern = "明け"
Case 3: addrname_workpattern = "日勤"
Case 4: addrname_workpattern = "夜勤"
Case 5: addrname_workpattern = "公"
Case 6: addrname_workpattern = "有"
Case 7: addrname_workpattern = "振"
Case 8: addrname_workpattern = "特"
Case 9: addrname_workpattern = "欠"
End Select
End Select
End Select
End With
If addrname_workpattern <> "" Then
ActiveSheet.Range(addrname_workpattern).Copy
Range("D8").PasteSpecial
Application.CutCopyMode = False
End If
End Sub

Sub 名前の定義の貼付け() '16人-31日分
Dim addrname_workpattern As String
addrname_workpattern = ""
With Worksheets("メイン・2")
Select Case .Range("CQ100").Value
Case 1: addrname_workpattern = "勤務1"
Case 2: addrname_workpattern = "勤務2"
Case 3: addrname_workpattern = "勤務3"
Case 4: addrname_workpattern = "日勤1"
Case 5: addrname_workpattern = "日勤2"
Case 6: addrname_workpattern = "日勤3"
Case Else
Select Case .Range("CP101").Value
Case 1: addrname_workpattern = "日勤4"
Case Else
Select Case .Range("CP100").Value
Case 2: addrname_workpattern = "明け"
Case 3: addrname_workpattern = "日勤"
Case 4: addrname_workpattern = "夜勤"
Case 5: addrname_workpattern = "公"
Case 6: addrname_workpattern = "有"
Case 7: addrname_workpattern = "振"
Case 8: addrname_workpattern = "特"
Case 9: addrname_workpattern = "欠"
End Select
End Select
End Select
End With
If addrname_workpattern <> "" Then
ActiveSheet.Range(addrname_workpattern).Copy
Range("CP23").PasteSpecial
Application.CutCopyMode = False
End If
End Sub

 月間の勤務割表を作成しています。
1列3行を一枡として一人・一日の枡とし、勤務の割り振り状態を表示するものです。
列に日付、行を個人名(max16名)とし1列3行を名前の定義で15種類作成してあります。
同じシートの各セルの入力番号(2行3列を一升)でに応じて15種類を貼り付けていますが、1人-1日分は、式を短くできたのですが、16人-31日分までの式を簡単にできませんでしようか?この式を496回分作るのは、難儀ですので。

 お教えくださいませんでしょうか?勉強不足でこれが限界です。

尚名前の定義は、...続きを読む

Aベストアンサー

>ちなみに Fox&Nextは、私も試行錯誤してやりましたが駄目でした。

どこがどうダメだったんでしょう?


全文を書くと、下記のようになります。

Sub 名前の定義の貼付け()
Dim addrname_workpattern As String
For i = 1 To 16
For j = 1 To 31
addrname_workpattern = ""
With Worksheets("メイン・2")
Select Case .Cells(70 + (i - 1) * 2, 5 + (j - 1) * 3).Value
Case 1: addrname_workpattern = "勤務1"
Case 2: addrname_workpattern = "勤務2"
Case 3: addrname_workpattern = "勤務3"
Case 4: addrname_workpattern = "日勤1"
Case 5: addrname_workpattern = "日勤2"
Case 6: addrname_workpattern = "日勤3"
Case Else
Select Case .Cells(71 + (i - 1) * 2, 4 + (j - 1) * 3).Value
Case 1: addrname_workpattern = "日勤4"
Case Else
Select Case .Cells(70 + (i - 1) * 2, 4 + (j - 1) * 3).Value
Case 2: addrname_workpattern = "明け"
Case 3: addrname_workpattern = "日勤"
Case 4: addrname_workpattern = "夜勤"
Case 5: addrname_workpattern = "公"
Case 6: addrname_workpattern = "有"
Case 7: addrname_workpattern = "振"
Case 8: addrname_workpattern = "特"
Case 9: addrname_workpattern = "欠"
End Select
End Select
End Select
End With
If addrname_workpattern <> "" Then
ActiveSheet.Range(addrname_workpattern).Copy
Cells(7 + i, 4 + (j - 1) * 3).PasteSpecial
Application.CutCopyMode = False
End If
Next
Next
End Sub

>ちなみに Fox&Nextは、私も試行錯誤してやりましたが駄目でした。

どこがどうダメだったんでしょう?


全文を書くと、下記のようになります。

Sub 名前の定義の貼付け()
Dim addrname_workpattern As String
For i = 1 To 16
For j = 1 To 31
addrname_workpattern = ""
With Worksheets("メイン・2")
Select Case .Cells(70 + (i - 1) * 2, 5 + (j - 1) * 3).Value
Case 1: addrname_workpattern = "勤務1"
Case 2: addrname_workpattern = "勤務2"
Case 3: addrname_workpattern = "勤務3"
Case 4: addrna...続きを読む

Q元データのシートにあるボタンを押すと、後ろのシートにデータをそのままコピーされてシートが追加できるようにしたい

大変困っています。

会員マスタという元データを作成し、そのシートに「シート追加」という
ボタンを作りました。

そのボタンを押すと、元データのシートの後ろにそのまま同じデータがコピーされて追加される様にVBAで設定したいです。

・行などはずれない様に設定したい。
・シート名は変更できるようにしたい。
・コピーして追加したシートにはボタンは表示されないようにしたい。

急いでます。知恵を貸してください。

Aベストアンサー

どんどん作るsheetに同じ名前は付けられませんので、連番にします。


'sheetの存在チェック
Private Function isExistSheet(sheetName As String) As Boolean
Dim ws As Worksheet
For Each ws In Worksheets
If ws.name = sheetName Then
isExistSheet = True
Exit Function
End If
Next
isExistSheet = False
End Function


'新しいシート名の検索
Function GetNewSheetName(newSheetName As String) As String
Dim n As Integer
n = 1
Do
If isExistSheet(newSheetName & str(n)) = False Then
Exit Do
End If
n = n + 1
Loop
GetNewSheetName = newSheetName & str(n)
End Function


Private Sub ボタン11_Click()
Dim ws As Worksheet
Dim newSheetName As String
newSheetName = "新しいシート" '追加シートの先頭名(適当な名前を付けてください)

Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count)) '新しいシートを最後のシートの後ろに作る
Sheets("会員マスタ").Cells.Copy Destination:=ws.Cells(1, 1) '会員マスタのCellデータを新しいシートにコピー
ws.name = GetNewSheetName(newSheetName)'新しいシート名
End Sub

どんどん作るsheetに同じ名前は付けられませんので、連番にします。


'sheetの存在チェック
Private Function isExistSheet(sheetName As String) As Boolean
Dim ws As Worksheet
For Each ws In Worksheets
If ws.name = sheetName Then
isExistSheet = True
Exit Function
End If
Next
isExistSheet = False
End Function


'新しいシート名の検索
Function GetNewSheetName(newSheetName As String) As String
Dim n As Integer
n = 1
Do
If isEx...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報