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と関連する良く見られている質問

QVBA コンパイルエラーの解消法

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示のため実行ができません。
ご指摘、よろしくお願いいたします。

Sub kopipe1() '施工体制台帳
Dim sh As Worksheet
Dim sh1 As Worksheet
Dim sb As Long
Dim m As Long
Dim p As Long
Dim c As Long
Dim i As Long
Dim end1 As Long

Set sh = Worksheet("sheet1")
Set sh1 = Worksheet("施工体制台帳 (下請け) ")


end1 = sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
sb = 1
p = 1

For i = 2 To end1 Step 1
sb = sb + 1
c = cell(p, 9)

sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
sh.cell(sb, 3).Copy Destination:=.sh1.Range(c).Offset(2, 27) '代表者名
sh.cell(sb, 4).Copy Destination:=.sh1.Range(c).Offset(4, 1) '郵便番号
sh.cell(sb, 5).Copy Destination:=.sh1.Range(c).Offset(5, 1) '住所
sh.cell(sb, 6).Copy Destination:=.sh1.Range(c).Offset(6, 24) '電話番号
sh.cell(sb, 7).Copy Destination:=.sh1.Range(c).Offset(13) '業種1
sh.cell(sb, 8).Copy Destination:=.sh1.Range(c).Offset(14, 12) '許可者1
sh.cell(sb, 9).Copy Destination:=.sh1.Range(c).Offset(14, 15) '区分1
sh.cell(sb, 10).Copy Destination:=.sh1.Range(c).Offset(14, 17) '許可1-1
sh.cell(sb, 11).Copy Destination:=.sh1.Range(c).Offset(14, 20) '許可1-2
sh.cell(sb, 12).Copy Destination:=.sh1.Range(c).Offset(14, 27) '許可年月日
sh.cell(sb, 13).Copy Destination:=.sh1.Range(c).Offset(16) '業種2
sh.cell(sb, 14).Copy Destination:=.sh1.Range(c).Offset(17, 12) '許可者2
sh.cell(sb, 15).Copy Destination:=.sh1.Range(c).Offset(17, 15) '区分2
sh.cell(sb, 16).Copy Destination:=.sh1.Range(c).Offset(17, 17) '許可2-1
sh.cell(sb, 17).Copy Destination:=.sh1.Range(c).Offset(17, 20) '許可2-2
sh.cell(sb, 18).Copy Destination:=.sh1.Range(c).Offset(17, 27) '許可年月日2
sh.cell(sb, 19).Copy Destination:=.sh1.Range(c).Offset(21, 28) '健康保険
sh.cell(sb, 20).Copy Destination:=.sh1.Range(c).Offset(22, 28) '厚生年金保険
sh.cell(sb, 21).Copy Destination:=.sh1.Range(c).Offset(23, 28) '雇用保険
sh.cell(sb, 22).Copy Destination:=.sh1.Range(c).Offset(25, 3) '現場代理人指名
sh.cell(sb, 23).Copy Destination:=.sh1.Range(c).Offset(29, 7) '主任技術者氏名
sh.cell(sb, 24).Copy Destination:=.sh1.Range(c).Offset(31, 3) '資格内容
sh.cell(sb, 25).Copy Destination:=.sh1.Range(c).Offset(33, 3) '安全衛生責任者
sh.cell(sb, 26).Copy Destination:=.sh1.Range(c).Offset(25, 26) '安全衛生推進者
sh.cell(sb, 27).Copy Destination:=.sh1.Range(c).Offset(27, 26) '雇用管理責任者
sh.cell(sb, 28).Copy Destination:=.sh1.Range(c).Offset(29, 26) '専門技術者名
sh.cell(sb, 29).Copy Destination:=.sh1.Range(c).Offset(31, 26) '技術資格内容

p = p + 62
Exit For
Next i
End Sub

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示...続きを読む

Aベストアンサー

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
とりあえず、Cells と sh1 のコンマは取るけれども、
sh1.Range(c).Offset(2, 1) これでは可読性を落とすばかりで分かりません。

これ自体を直すよりは、最初から作り直したほうが早そうです。
たぶん、一覧で横に並んでいるものを、別のシートの各場所に振り替えていくわけで、それが、ページごとになっているというわけでしょう。

まず、 sh1.cells(sb, 2).Copy ですが、
その列の2 を変数にすべきですね。

受ける側が、Offset で書かれてしまうと、手がつけられなくなってしまいます。

sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")

このようにまとめてしまい、以下のように纏めたものから呼び出すようにします。
しかし、実際にやってみると不具合が生じるので、それを配列で渡すようにします。

注:以下は、私の想像で書かれたものであって、実際に合っているのかは分かりません。
このようなスタイルにしてみたらという、あくでもこちらの提案です。

'//
Sub Test1()
 Dim Rng As Range
 Dim i As Long, j As Long, sb As Long
 Dim c As Variant
 Dim sh As Worksheet, sh1 As Worksheet
 Set sh = Worksheets("sheet1")
 Set sh1 = Worksheets("施工体制台帳 (下請け)")

 
 Set Rng = sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")
 
 end1 = sh.Cells(Rows.Count, 2).End(xlUp).row
 
 i = 2
 sb = 2
 For j = 1 To end1
 a = (j - 1) * 62 + 1
  For Each c In Rng.Offset((j - 1) * 62 + 1)
   c.Value = sh.Cells(sb, i).Value
   DoEvents
   i = i + 1
  Next
  i = 2
  sb = sb + 1
 Next
End Sub

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).C...続きを読む

QVBA array()関数 配列の使い方について

VBAを学習しており、最近配列という仕組みを知り勉強中です。

array関数の使い方をいくつかサイトを見て回っているのですが、
実務として理解するのに躓いております。

要素の追加は直接指定しかないのでしょうか?
要素が多数ある場合などの使用例がわかりません。
ループやリスト参照等で格納することは可能なのでしょうか?
それとも他の関数を使用するのでしょうか?

Dim A As Variant
A = Array(10,20,30) ’・・・・100までなど多数の場合は?
B = A(2)

Aベストアンサー

No2です。
Array関数を使うのは、配列を作るときに、同時に初期値(配列の内容)も生成したい場合です。
従って、100個のデータを全て指定するのは、余り実用的ではありません。
従って、配列の要素の数が少なく、しかも、配列生成時に、同時に初期値も格納したい場合のみ、Array関数を使うべきです。
そうでないなら
Dim A(100) as String
Dim B(1000) as Long
のように配列を宣言すべきです。
尚、配列の要素数が事前に決められない場合は、
(例えば、テキストファイルを読み込み1行を1つの要素に格納したい場合、それが何行あるかは、ファイルを読み込んでみないと判らない)
Dim C() as Stringのように()内に数値を記入しないで宣言します。
(この使い方はテクニックが多少必要なので自分で調べてください。それでも判らない場合は質問してください)

QVBA IF文でORを使ったとき後ろの条件が実行されない

下記VBAは特定の行だけ取り出すために組んだマクロの一部ですが、
なぜか.Value Like "W*"の部分が実行されません、
ORの前と後ろを逆にするとやはり前だけしか実行されません。

どこが問題なのでしょうか?
また、"J*"か"W*"以外の行を削除するという文はどう書くのでしょうか?

よろしくお願いします。


For j = Range("A1").End(xlDown).Row To 2 Step -1
With Cells(j, "AB")

If Not .Value Like "J*" Or .Value Like "W*" Then
.EntireRow.Delete
End If

End With

Next j

Aベストアンサー

>If Not .Value Like "J*" Or .Value Like "W*" Then
["J*"か"W*"以外の行を削除する]

これは、排他的論理積の内容ですね。
英米人は、何の問題もなく答えられるけれども、日本人などは、どうしても戸惑ってしまいます。英語には、こういう表現がありますが、日本語には、そういう表現があっても、言葉には正確に表す論理がありません。もし、本格的なプログラミングをおやりになるなら、是非、学ばれたほうがよいです。ベン図を書いて試してみるとよいです。

["J*"*か*"W*"以外の行を削除する]
「か=or(和)」が否定になると「and(積)」に変わると覚えていればよいです。

If Not (UCase(.Value) Like "J*" Or Not UCase(.Value) Like "W*" Then
または
If Not UCase(.Value) Like "J*" And Not UCase(.Value) Like "W*" Then

このように演算子が変わります。

Qvbsでは漢字の変数は使えないのでしょうか。

下記はエラーになります。
Option Explicit
Dim 氏名

氏名=InputBox("氏名を入力して下さい")
MsgBox(氏名)

ここで、氏名をnameに変更すると正しく実行します。
Option Explicit
Dim name

name=InputBox("氏名を入力して下さい")
MsgBox(name)

漢字の変数を使う方法は無いのでしょうか。

Aベストアンサー

もうお答えは出ているようですが、私からも回答します。

2byte 文字を変数にすると、

\kanjitest.vbs(2, 5)
「Microsoft VBScript コンパイル エラー: 文字が正しくありません。」

のエラーが出ます。
Unicode VBSにしても、やはりエラーが出ます。

もともと、String 型で認められる所以外では、2byte 文字は、ハングしますから、仕方がありません。VBAとは違いますから。
これを、HTA にして、Charset を、UTF-8 にしても、エラーは出ます。諦めることでしょうね。

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...続きを読む

QExcelを使って行列変換をしたい(大量件数)

先日質問させていただいたものです。
さらなる加工が必要になりました。

例えば、
◆test
aaaaaa
iiiiiiiiiiiii
uuuuu
eeeee
ooooo
◆test2
kaaaaa
kiiiiiiiiiii
kuuuuu
keeeee
kooooo
...

これらのデータを
◆test aaaaaa
    iiiiiiiiiiiiii
    uuuuuu
eeeeee
oooooo
◆test2 kaaaaa
     kiiiiiiiiiii
     kuuuu
     keeeee
     koooooo

に変換はできたのですが、今度は
◆test aaaaaaaa iiiiiiiiiii uuuuuuuuuuu eeeeeee oooooo
◆test2 kaaaaaa kiiiiiiiii kuuuuuuuuu keeeeee koooooooo

のように変換する必要がでてしまいました。

マクロなどで一括で変換できないでしょうか。
当方知識が乏しいため困っております。

先日質問させていただいたものです。
さらなる加工が必要になりました。

例えば、
◆test
aaaaaa
iiiiiiiiiiiii
uuuuu
eeeee
ooooo
◆test2
kaaaaa
kiiiiiiiiiii
kuuuuu
keeeee
kooooo
...

これらのデータを
◆test aaaaaa
    iiiiiiiiiiiiii
    uuuuuu
eeeeee
oooooo
◆test2 kaaaaa
     kiiiiiiiiiii
     kuuuu
     keeeee
     koooooo

に変換はできたのですが、今度は
◆test aaaaaaaa iiiiiiiiiii uuuuuuuuuuu eeeee...続きを読む

Aベストアンサー

こんにちは!

別シートに表示しても良いですか?
元データはSheet1のA列にあり、Sheet2に表示するとします。
標準モジュールにしてください。

Sub Sample1()
Dim i As Long, cnt As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
wS.Cells.ClearContents
With Worksheets("Sheet1")
For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
If InStr(.Cells(i, "A"), "◆") > 0 Then
cnt = cnt + 1
wS.Cells(cnt, "A") = .Cells(i, "A")
Else
wS.Cells(cnt, Columns.Count).End(xlToLeft).Offset(, 1) = .Cells(i, "A")
End If
Next i
End With
End Sub

こんな感じではどうでしょうか?m(_ _)m

こんにちは!

別シートに表示しても良いですか?
元データはSheet1のA列にあり、Sheet2に表示するとします。
標準モジュールにしてください。

Sub Sample1()
Dim i As Long, cnt As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
wS.Cells.ClearContents
With Worksheets("Sheet1")
For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
If InStr(.Cells(i, "A"), "◆") > 0 Then
cnt = cnt + 1
wS.Cells(...続きを読む

QExcelのマクロについて

改ページごとの最終セルを取得し、それらに連番でページ番号を割り付けたいのですが上手くいきません。
またシートごとの先頭ページ番号を指定するセルもシート内に作成したいです。
例えば1ページ目のA1セルに7が入力されている場合は、1ページ目の最終セルに7、2ページ目に8と入力していき、そのシートの最終ページまで同じ作業を繰り返し改ページがなくなれば終了・・・といった流れです。

Aベストアンサー

>こちらのマクロでは改ページの最初のセルにもページ番号が振られてしまいます。
> 振るのは改ページごとの最終セルだけなのですが

そうだったのですか?
読んでいませんでしたが、資料という文字がついている片方を取り去ればよいだけでは?

Range("AN1").Value は、数字のみです。
---------------------------
rec = Range("AN1").Value
If rec = 0 Then MsgBox "AN1 に、初期値が入っていません", vbCritical: Exit Sub
'Cells(1, 1).Value = "資料 - " & CStr(rec) '削除

For i = 1 To PageCount \ VRetPage
Page = .ExecuteExcel4Macro("INDEX(GET.DOCUMENT(64),1," & i & ")")
 Cells(Page - 1, 1).Value = "資料 - " & CStr(rec) '★加筆
 If PageCount \ VRetPage = i Then Exit Sub '最後は番号を振らない
 'Cells(Page, 2).Value = "資料 - " & CStr(rec + 1) '削除
 rec = rec + 1
Next
End With
End Sub

>こちらのマクロでは改ページの最初のセルにもページ番号が振られてしまいます。
> 振るのは改ページごとの最終セルだけなのですが

そうだったのですか?
読んでいませんでしたが、資料という文字がついている片方を取り去ればよいだけでは?

Range("AN1").Value は、数字のみです。
---------------------------
rec = Range("AN1").Value
If rec = 0 Then MsgBox "AN1 に、初期値が入っていません", vbCritical: Exit Sub
'Cells(1, 1).Value = "資料 - " & CStr(rec) '削除

For i = 1 To PageCount \ VRet...続きを読む

QプログラミングにおいてOrの使い方がいまいち理解できません。 どなたかご教授お願い致します。

プログラミングにおいてOrの使い方がいまいち理解できません。
どなたかご教授お願い致します。

Aベストアンサー

仮に、a or b であれば、
a 真、b 真 → 真
a 真、b 偽 → 真
a 偽、b 真 → 真
a 偽、b 偽 → 偽

となります。
一つでも真があれば、結果は真となります。

QVBAでのシフト表の何日~何日までの求め方

同じ質問がありましたら申し訳ございません。
VBAに興味を持ち、関数より楽しく色々勉強している身なのですが、どなたかお力をお貸し下さい。

VBAでシフト表を作る際に、D3セルが「15」でAI3セルが「16」日までの日付を入力するにはどの様にプログラムを組めばよろしいのでしょうか?
例えばD3セルに2017/03/15と入力し横に自動で表示出来る様にしたいのです。
その際に月の28日、30日、31日の空いているセルが、動いた分削除される、シフト表を作成したいのです。
また日付の下のセルには関連付けで曜日を表示させたいです。
重ね、VBAでのシフト表を作る際に参考にした書籍などありましたらお教え下さい。

どうぞよろしくお願い致します。

Aベストアンサー

No11です。
>D2のセルから右へ祝日の日を表示させたいのですが可能でしょうか?
反映しました。カレンダー作成のマクロに組み込みました。
添付の図のように設定シートのC列に祝日名を記入しておく必要があります。

>またD8セルから右へその日の合計人数を。最後にそのD8セルの合計人数が3人の日に背景を赤になる表示をさせたいのです。
反映しました。勤務日数集計のマクロに組み込みました。

以下のようになります。前回のマクロを全て破棄し、こちらで入れ替えてください。
----------------------------------------
Option Explicit
Public Sub カレンダー作成()
Dim sh0 As Worksheet '設定シート
Dim sh1 As Worksheet 'シフト表シート
Dim s_date As Date '開始日
Dim e_date As Date '終了日
Dim col As Long '列
Dim wkday As Long '曜日(1:日~7:土)
Dim wdate As Date
Dim i As Long
Dim maxrow0 As Long
Dim maxrow1 As Long
Dim row0 As Long
Dim color As Long '日付・曜日の背景色
Set sh0 = Worksheets("設定")
Set sh1 = Worksheets("シフト表")
'開始日取得
s_date = sh0.Cells(2, "A").Value
'終了日計算
e_date = DateAdd("m", 1, s_date) - 1
maxrow0 = sh0.Cells(Rows.Count, "B").End(xlUp).row '設定 B列の最大行取得
maxrow1 = sh1.Cells(Rows.Count, "C").End(xlUp).row 'シフト表 C列の最大行取得
'カレンダークリア
sh1.Range("D2:AH" & maxrow1 + 1).Value = "" '祝日名/日/曜日
sh1.Range("D3:AH" & maxrow1 + 1).Interior.Pattern = xlNone '日/曜日の背景色
sh1.Range("AJ5:AJ" & maxrow1).Value = "" 'AJの勤務日数合計

'カレンダー作成
For i = 0 To (e_date - s_date)
col = 4 + i
wdate = s_date + i
wkday = Weekday(wdate)
sh1.Cells(3, col).Value = wdate '日付
sh1.Cells(4, col).Value = WeekdayName(wkday, True) '曜日
'土曜日は水色、日曜日は赤色、祝日には黄色を背景に設定する
'休日判定(祝日と土日が重なった場合は祝日優先)
color = -1
row0 = IsHoliday(wdate, sh0, maxrow0)
If row0 > 0 Then
'祝日の場合
color = 65535 '黄色
sh1.Cells(2, col).Value = sh0.Cells(row0, "C").Value '祝日名
Else
If wkday = 1 Then color = 255 '赤
If wkday = 7 Then color = 15773696 '水色
End If
If color <> -1 Then
sh1.Cells(3, col).Interior.color = color
sh1.Cells(4, col).Interior.color = color
End If
Next
MsgBox ("完了")
End Sub
'祝日判定
Private Function IsHoliday(ByVal wdate As Date, ByVal sh0 As Worksheet, ByVal maxrow0 As Long) As Long
Dim row As Long
IsHoliday = 0
For row = 2 To maxrow0
If sh0.Cells(row, "B").Value = wdate Then
IsHoliday = row
Exit Function
End If
Next
End Function
Public Sub 勤務日数集計()
Dim sh1 As Worksheet 'シフト表シート
Dim col As Long '列
Dim i As Long
Dim workcount As Long '勤務日数
Dim maxrow1 As Long
Dim row As Long
Set sh1 = Worksheets("シフト表")
maxrow1 = sh1.Cells(Rows.Count, "C").End(xlUp).row 'シフト表 C列の最大行取得
'勤務日数集計
For row = 5 To maxrow1
workcount = 0
For i = 0 To 30
col = 4 + i
If sh1.Cells(3, col).Value <> "" And sh1.Cells(row, col).Value <> "休" Then
workcount = workcount + 1
End If
Next
sh1.Cells(row, "AJ").Value = workcount
Next
'その日の合計人数
For i = 0 To 30
col = 4 + i
If sh1.Cells(3, col).Value = "" Then Exit For
workcount = 0
For row = 5 To maxrow1
If sh1.Cells(row, col).Value <> "休" Then
workcount = workcount + 1
End If
Next
sh1.Cells(maxrow1 + 1, col).Value = workcount
'3人が出勤の場合(全員が出勤の場合)
sh1.Cells(maxrow1 + 1, col).Interior.Pattern = xlNone
If workcount = maxrow1 - 5 + 1 Then
sh1.Cells(maxrow1 + 1, col).Interior.color = 255 '赤色
End If
Next
MsgBox ("完了")

End Sub
------------------------------------------------------

No11です。
>D2のセルから右へ祝日の日を表示させたいのですが可能でしょうか?
反映しました。カレンダー作成のマクロに組み込みました。
添付の図のように設定シートのC列に祝日名を記入しておく必要があります。

>またD8セルから右へその日の合計人数を。最後にそのD8セルの合計人数が3人の日に背景を赤になる表示をさせたいのです。
反映しました。勤務日数集計のマクロに組み込みました。

以下のようになります。前回のマクロを全て破棄し、こちらで入れ替えてください。
------------------------------...続きを読む

Q【VBA】IF文 複数(ネスト)の時の処理について

こんにちは。
if文についておしえてください。
以下のようなマクロがあるとします。

変数 tensuuに-1をいれて実行すると①→②のように動作し「入力エラー」と表示されます。
tensuuに120を入れて実行すると①´→②´の順に動作し「入力エラー1」と表示されます。

どして、-1のときは入力エラー1にはいかず入力エラーにいくのでしょうか?
120のときは入力エラーにはいかず入力エラー1にいくのでしょうか?

動きがよくわかりません。
IF文とELSEはどういう紐づけがされているのでしょうか?

よろしくおねがいいたします。
   
Sub t()
tensuu = -1
If tensuu >= 0 Then '①
If tensuu <= 100 Then '①´
If tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If
Else
MsgBox "入力エラー1" '②´
End If
Else
MsgBox "入力エラー" '②
End If
End Sub

こんにちは。
if文についておしえてください。
以下のようなマクロがあるとします。

変数 tensuuに-1をいれて実行すると①→②のように動作し「入力エラー」と表示されます。
tensuuに120を入れて実行すると①´→②´の順に動作し「入力エラー1」と表示されます。

どして、-1のときは入力エラー1にはいかず入力エラーにいくのでしょうか?
120のときは入力エラーにはいかず入力エラー1にいくのでしょうか?

動きがよくわかりません。
IF文とELSEはどういう紐づけがされているのでしょうか?

よろし...続きを読む

Aベストアンサー

If 〜 Then 〜 Else 〜 End If
で1セットです。

ネスト(入れ子)になったIF文というのは、 Then 〜 とか Else 〜 の〜の部分にIf文がくるものです。
ですから、外のIfを越えてしまうことはありません。
よって、一番内側から見ていけば、構造がはっきりします。


一番内側から見ます。

If tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If

が1セットです。
これを 「文1」とすると元のプログラムは

If tensuu >= 0 Then '①
If tensuu <= 100 Then '①´
「文1」
Else
MsgBox "入力エラー1" '②´
End If
Else
MsgBox "入力エラー" '②
End If

となります。この状態で「一番内側」を見ると

If tensuu <= 100 Then '①´
「文1」
Else
MsgBox "入力エラー1" '②´
End If
です。これを「文2」とすると

If tensuu >= 0 Then '①
「文2」
Else
MsgBox "入力エラー" '②
End If


余談ですが
この例の場合、外側2つは、判定内容と処理とが離れてしまい、見辛いのは確かです。
if 条件 Then A Else B は if not条件 Then B Else A と同じ、ということから、Thenでの処理とElseでの処理を入れかえれば、
条件の直ぐ下の処理が来るので、見易さが格段によくなります。

If tensuu < 0 Then '① ' tensuu<0 は not (tensuu>=0)と同じ
MsgBox "入力エラー" '②
ElseIf tensuu > 100 Then '①´
MsgBox "入力エラー1" '②´
ElseIf tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If ' ElseIfで継いでいるので、ネストにはなっていない

If 〜 Then 〜 Else 〜 End If
で1セットです。

ネスト(入れ子)になったIF文というのは、 Then 〜 とか Else 〜 の〜の部分にIf文がくるものです。
ですから、外のIfを越えてしまうことはありません。
よって、一番内側から見ていけば、構造がはっきりします。


一番内側から見ます。

If tensuu >= 80 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If

が1セットです。
これを 「文1」とすると元のプログラムは

If tensuu >= 0 Then '①
If tensuu <= 100 Then '①´
「文1」
Else
MsgBox "入力エラー1" '②´
...続きを読む


人気Q&Aランキング