アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルにて、作業員のスケジュール管理を行いたいと思っています。
(ブッキングチェック)
例えば、下記のような状態にて、
C5セルに「あああ」や「えええ」さんを入力した際や、
C7セルに「あああ」や「いいい」や「えええ」さんを入力した際に、
「スケジュールがダブルブッキングしていますので無効です。」
というエラーメッセージ画面を出したいと思っています。

     A列       B列      C列
1行目 作業開始日 作業終了日 作業員
2行目 2008/ 4/ 1  2008/ 4/25 あああ
3行目                   えええ
4行目 2008/ 4/20  2008/ 4/30 いいい
5行目             
6行目 2008/ 4/10  2008/ 4/20 ううう
7行目

*それぞれ、下記のセルは結合されています。
A2とA3。B2とB3。A4とA5。B4とB5。A6とA7。B6とB7。

VBA等を利用すれば、このようなこともエクセルで作成可能でしょうか?
まずは、日付をシリアル値に変換して処理していく?のだろうかと思いますが、
明確な解決方法が思い浮かびません。
お知恵をお借りできたら幸いです。

A 回答 (2件)

こんなのでどうでしょうか?


作業員の行が変更されるとチェックします。
日付を変更したら・・・
というのはチェックしてません。
>まずは、日付をシリアル値に変換して処理していく?のだろうかと思いますが、
普通にしていれば(文字列とか時刻とかになっていなければ)気にしなくていいと思います。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then '作業員変更?
Dim r As Integer
For r = 2 To Cells(Rows.Count, 3).End(xlUp).Row '作業員の最後の行まで
If isDoubleBooking(Target.Row, r) Then
MsgBox r & "行目のスケジュールがダブルブッキングしていますので無効です。"
End If
Next
End If
End Sub
'ダブルブッキングチェック
Private Function isDoubleBooking(targetRow As Integer, checkRow As Integer) As Boolean
isDoubleBooking = False
'作業員が空白なら調べない
If Cells(targetRow, 3) = "" Then
Exit Function
End If
If Cells(checkRow, 3) = "" Then
Exit Function
End If
'同じ行を除外
If targetRow = checkRow Then
Exit Function
End If
'同じ名前の作業員?
If Cells(targetRow, 3) = Cells(checkRow, 3) Then
'(調べる作業終了日<既にある開始日)or(調べる作業開始日>既にある作業終了日)=trueで重複なしなので、falseで重複
'行は2,3,4,5,6->2,2,4,4,6になるように(r \ 2) * 2
If ((Cells((targetRow \ 2) * 2, 2) < Cells((checkRow \ 2) * 2, 1)) Or (Cells((targetRow \ 2) * 2, 1) > Cells((checkRow \ 2) * 2, 2))) = False Then
isDoubleBooking = True
End If
End If
End Function
    • good
    • 0
この回答へのお礼

サンプルソース、ありがとうございます!!
VBA初めてで、C言語もかじった程度なので、
内容を追っかけるのに時間がかかってしまいましたが、
非常にわかりやすい内容で、大変助かりました。

今回の質問では、質問内容を簡単にするために、
1つのスケジュールに、2行分を割り当てたものを例として、質問させて頂きましたが、
実際には10行を割り当てたものを利用したかったので、
fumufumu_2006さんのソースを元に、
いろいろ調べたりしながら、少し書き直すことで、
思いどおりのものができました。
*MergeArea関数を使うことで、対応しました。
If Cells(Target.Row, 作業終了日列).MergeArea.Row < Cells(checkRow, 作業開始日列).MergeArea.Row Or Cells(Target.Row, 作業開始日列).MergeArea.Row > Cells(checkRow, 作業終了日列).MergeArea.Row Then
MsgBox checkRow & "行目と、" & Target.Row & "行目の人員スケジュールがダブルブッキングしています!!!"
End If

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

お礼日時:2008/04/01 22:07

>VBAで出来ますか。


VBAはプログラムですから、論理的な判断(存在の有無。値の相等・大小など)で決まることならできるでしょう。
(対するのが好きなものは抜き出せ、良いものは抜き出せなど、基準がはっきりしない場合。)
出来るといってもエキスパートならできるということであって、自分がほとんど経験ないなら、できると聞いてもなんにもならない。
一夕に勉強・経験・理解できるものではない。周りに教えてくれる方もいないでしょう。昔から大工などは徒弟制度に入って親方先輩に教えられて、スキルを盗んで修行した。
プログラムも似た面があると思う。現代はソフト会社に入社して修行することになるのかな。
ーーー
しかし問題は質問者の、内容的に「ダブルブッキングして」という風な、世間的に常識的語句を使って、大きく言って、内容が良くわからない、思考態度です。
プログラムを組む場合は、わずかなことが、組む上で複雑化することがあります。そういう恐ろしさを意識して、いろんなことを出きるだけ処理仕様に影響ないか考えてください。
本件を実現する場合、いろんなことを文書化して文章と仕様を練ることで思考を整理することです。
最低どういうケースではどうするということを作業遷移図で整理することです。
ーー
ダブルブッキングして
他の例ではある会議室を同一日付+記録済み時間範囲内に既登録なら
はじくなどあります。
本質門では始期ー終期があるようですが、人名のみが既に記録されていれば、エラー指摘する単純なものでよいのかな。現実には
そんな簡単な事で実用ケースがありえるかな。
ーー
>セルは結合されています
なども複雑化しやすい実例です。
====
エクセルを使うレディメードのソフトがないか調べるのが良いと思う。
    • good
    • 0

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