ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

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件中11~18件)

追加確認です。


「ヘルプ」に関しては、他の業務ができないので、「ヘルプ」を設けたとのことですので、
ヘルプが定義される場合は、優先1にヘルプを定義し、優先2から優先4は全て空白ということに
したいのですが、いかがでしょうか。
もし、その新人が、サポートとかの他の業務ができるようになれば、ヘルプを削除し、サポート等の業務を記述することになります。
    • good
    • 0
この回答へのお礼

tatsu99様、要件の変更に関して誠に申し訳ございません。
この様なことを繰り返さない様に、以後、気をつけます。

1)提示例でBさん1人体制のとき、割り当ては会議で間違いないですか。
 ・はい、間違いありません。
2)Dさんが優先1=事務、優先2=会議で定義されているなら、
  Dさん1人体制のとき、割り当ては、事務で間違いないですか。
 ・はい、間違いありません。

一人体制、二人体制の時の業務の割り当てに「会議」、「事務」を優先の件ですが、
担当業務がない場合はそのまま入力なし、とする事が可能であれば以下の様にしたいです。
1)提示例でCさん1人体制のとき、何の業務を割り当てるのか?
  Cさん一人体制の場合は「会議」、「事務」の中の優先2の「会議」が出来るので「会議」。
2)提示例でBさんとCさんの2人体制のとき、BさんとCさんは何の業務をわりあてるのか?
  Bさんは「会議」、Cさんは「事務」が出来ないので何も入力無し。
3)提示例でAさんとCさんの2人体制のとき、AさんとCさんは何の業務をわりあてるのか?
  AさんはCさんには出来ない優先3にある「事務」が出来るので「事務」。Cさんは優先2の「会議」。
4)提示例でEさんとCさんの2人体制のとき、EさんとCさんは何の業務をわりあてるのか?
  Eさんはそのまま入力なしの、Cさんは「会議」。
上記の「会議」、「事務」に該当しない場合の処理をそのまま片方、無視するなどの処理は可能でしょうか?

はい、「ヘルプ」は優先1に定義し優先2から4は空白で問題ありません。

tatsu99様何か良い方法はありますでしょうか?

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

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

追加確認です。


1人体制で会議と事務は優先順位はないと考えてよいですか。
1)提示例でBさん1人体制のとき、割り当ては会議で間違いないですか。
2)Dさんが優先1=事務、優先2=会議で定義されているなら、
  Dさん1人体制のとき、割り当ては、事務で間違いないですか。
    • good
    • 0

要件が変わりすぎます。


・「ヘルプ」業務がいきなり出現している。
・1人体制では、会議か事務を割り当てるということだったが「ヘルプ」がある。
・各担当者は、サポート、営業、事務、会議のいずれもできるはずであるが、出来なくなっている。
等があります。
最初に要件を全て提示されることを望みます。今回は、やむなしとしますが、次回からの対応はなしと思ってください。

不明点は以下の通りです。
1人体制、2人体制で、会議、事務を優先とあるが、そのことに関してです。
1)提示例でCさん1人体制のとき、何の業務を割り当てるのか?
2)提示例でBさんとCさんの2人体制のとき、BさんとCさんは何の業務をわりあてるのか?
3)提示例でAさんとCさんの2人体制のとき、AさんとCさんは何の業務をわりあてるのか?
4)提示例でEさんとCさんの2人体制のとき、EさんとCさんは何の業務をわりあてるのか?
    • good
    • 0

確認の追加です。


確認5
専従要員の割り当ては、その専従要員の優先1の業務が必ず割り当てられる。他の業務をすることは一切ない。
但し、1人体制で、営業の専従要員がついたときは、会議か事務の何れかを割り当てる。
従って、専従要員間で業務の持ち回りのようなことはしない。
持ち回りをする場合は、次の月に、設定シートの優先1の業務を変えることにより行う。

確認6
サポート要員を会議、事務、営業の何れかに割り当てる場合は、設定シートの従業員名が上位(行番号の小さいほう)に
あるものから、割り当てを行う。提示された例では、Aさん、Eさん、Fさんがサポート要員なので
A→E→Fの順に割り当てる。
従ってFさんが新人なら、「サポート」を行う確率が最も高くなる。
もし、新人を優先的に会議、事務、営業の何れかに割り当てたいなら、Aさんの位置に新人を持ってくることが必要となる。
尚、サポート要員の割り当て順序は、設定シートの並びで決まり、勤務管理表シートの並びとは関係しない。
(設定シートの要員の並びと勤務管理表シートの並びは一致しなくても良い)
この回答への補足あり
    • good
    • 0
この回答へのお礼

各従業員の担当業務は設定シートの様に担当業務が出来る人、出来ない人がおります。
補足添付画像を例にBさんは「会議」、「事務」は出来るが「営業が」出来ない。
Cさんは「営業」、「会議」は出来るが「事務」が出来ない。
この設定シートを条件に勤務管理表に出力をしたいです。
例えば月曜日は全員出勤なので優先1からそのまま割り当て。
火曜日はBさんがお休みの為「会議」担当にAさん、CさんがおりますがCさんが優先1の「営業」の為Aさん。
水曜日は「営業」担当のCさんがお休みの為優先2からDさんが担当でAさんが「事務」。
木曜日はBさん、Cさんがお休みの為Aさんが「会議」、Dさんが「事務」。
金曜日はFさんが一人なのでそのままヘルプを表示。
マクロが空欄をエラーと認識してしまう為Fさんの業務を「ヘルプ」としました。

「最初に出現した業務を割り当てる。(優先1→優先4の順に検索)」
そうです!
各担当従業員の優先順位が高い業務から配置をするという事になります。
よろしくお願い致します。

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

すみません。


確認4
⑥6人体制の場合
 3人体制と同様に決定し、残りの3人にサポートを割り当てる。

上記がもれてました。追加します。
    • good
    • 0

すみません。


確認4
④4人体制の場合
 3人体制と同様に決定し、残りの1人にサポートを割り当てる。

上記の④が2つありますが、1つは余分ですので、無視してください。
    • good
    • 0

確認1


>・一人、二人態勢の場合は「会議」、「営業」、「事務」の業務の中の「会議」と「事務」だけは優先順位が高い担当者で入力をしたいです。

では、以下の仕様でよろしいでしょうか。
1人体制の場合、会議、又は、事務の何れかを割り当てる。(どちらが割り当てられるかは事前には判らない)
2人体制の場合、会議、事務を割り当てる。

確認2
>※ただ従業員の研修期間で業務を担当出来ない方がいるのですが、設定表の担当業務に空欄がある箇所がある場合その担当者はそのまま空欄を出力させたいです。
>例としBさんの優先4の担当の「サポート」が空欄ならそのまま空欄など。

これは、要件として不適切です。
Bさんが、「会議」、「営業」、「事務」、空白と定義されても、
何日が研修日かの情報がないため、空白を何日の箇所に設定するのかが判りません。
研修期間で、当該業務を担当できない場合は、「研修」の文字を予め、いれておくことはできませんでしょうか。
例えば、Bさんが研修日が5月14,15,16日なら、15,16,17日へ「研修」の文字を設定しておきます。

マクロでは、空白の箇所のみを選んで、(つまり、「休」と「研修」)を除いて、その箇所へ業務を割り当てます。
運用上は、研修でも出張でもなんでもかまいません。そのセルが空白でなければ、割り当て不能とマクロは認識します。
従って該当日の空白の数が人数の体制になります。

確認3
担当者(Aさん~Fさん)の設定シートの業務の割り当ては、以下の仕様で行いますが宜しいでしょうか。
①優先1の場合、営業=1人、会議=1人、事務=1人、サポート=3人が割り当てられていること。
(以降、営業、会議、事務に割り当てられた要因を専従要員、サポートに割り当てられた要因をサポート要員と呼ぶ。
あなたの提示例では、Bさん,Cさん,Dさんが専従要員であり、以外の人がサポート要員となる。)
②各担当者は、優先1~優先4の割り当てで、営業、事務、会議、サポートが必ず1つずつ割り当てられていること。
例 Aさんに サポート、営業、事務、事務
  Bさんに 会議、営業、事務、空白
のような割り当てはエラーとなる。

確認4
割り当ては、要員を機会均等に割り当てるのではなく、最も優先順位の高い順に割り当てるようにしますが宜しいでしょうか。
①1人体制の場合、会議と事務の何れかを割り当て
 会議又は事務の専従要員なら、その業務を割り当てる。
 上記以外の要員なら、会議、事務が最初に出現した業務を割り当てる。(優先1→優先4の順に検索)
②2人体制の場合、会議と事務を割り当て
 2人とも会議又は事務の専従要員なら、その業務を割り当てる。
 1人が会議又は事務の専従要員なら、その業務を割り当てる。残りは、残りの業務を割り当てる。
 2人とも会議又は事務の専従要員でないなら、会議、事務が最初に出現した業務を割り当てる。(優先1→優先4の順に検索)
③3人体制の場合、会議、事務、営業を割り当て
 3人とも専従要員ならその業務を割り当てる。
 2人が専従要員ならその業務を割り当て、あとの1人は残りの業務を割り当てる。
 1人が専従要員ならその業務を割り当て、あとの2人は残りの業務が最初に出現した業務を割り当てる。(優先1→優先4の順に検索)
④4人体制の場合
 3人体制と同様に決定し、残りの1人にサポートを割り当てる。
④4人体制の場合
 3人体制と同様に決定し、残りの1人にサポートを割り当てる。
⑤5人体制の場合
 3人体制と同様に決定し、残りの2人にサポートを割り当てる。
    • good
    • 0

前回、


https://oshiete.goo.ne.jp/qa/9751595.html
で、回答したソースに1点、誤りがありました。
wk = dicT(key)
For i = 1 To 31
col = 2 + i ・・・・①
If sh2.Cells(2, col).Value = "" Then Exit For

①の箇所ですが、
C列から判定を開始するので、B列に休みが設定されることはありません。
col = 1 + i
が正しいです。お詫びして、訂正します。

ここからが本題ですが、
1)人数は5人限定になりますが宜しいでしょうか。
2)休みの設定は、別マクロで実施の前提なると、ありうる人数の体制は
1人・・・エラー
2人・・・エラー
3人
4人
5人
になります。
1人、2人の場合は、「会議」、「営業」、「事務」が確保できないので、エラーにしますが宜しいですか。
3)「会議」、「営業」、「事務」で重複の場合、赤表示とのことですが、
そもそも、これはあり得ないのではないでしょうか。
これが、発生する可能性があるのは、4人、5人の場合です。
(3人は会議、営業、事務を1人ずつ行う為、重複しない)
Aさん~Eさんは、優先順位はありますが、「会議」、「営業」、「事務」、「サポート」の何れかを選択することができます。
そうすると、「会議」、「営業」、「事務」の割り当て後、残りの人を強制的にサポートにすれば良いはずです。
あなたが、想定されている、重複ケースはどのような場合でしょうか。
(Aさん~Eさんの誰かが「サポート」の割り当てを持たないなら話は別ですが)
    • good
    • 0
この回答へのお礼

tatsu99様お世話になっております。訂正の件ありがとうございます。

本題の件についてご説明させていただきます。
・人数の限定は新人さんが一人増える予定なので「Fさん」を追加した6人限定でお願い致します。
・一人、二人態勢の場合は「会議」、「営業」、「事務」の業務の中の「会議」と「事務」だけは優先順位が高い担当者で入力をしたいです。
・重複の場合の赤表示はtatsu99様が仰る通り4、5人の場合になりますが、3業務を割り当て後、残りの担当者を強制的に「サポート」にする方法でお願い致します!
※ただ従業員の研修期間で業務を担当出来ない方がいるのですが、設定表の担当業務に空欄がある箇所がある場合その担当者はそのまま空欄を出力させたいです。
例としBさんの優先4の担当の「サポート」が空欄ならそのまま空欄など。

以上になります。
                    
よろしくお願い致します。

お礼日時:2017/05/14 14:11

お探しの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ランキング