http://q.hatena.ne.jp/1221470953


↑以前に質問させていただいたデータです
で、今回私が行ないたいのは
1.B4が月曜日だったらA事業所、火曜日だったらB事業所、水曜日だったらC事業所、木曜日だったらD事業所、金曜日だったらB事業所、土曜日の13:00~だったらC事業所、土曜日の16:30~だったらB事業所。
2.月曜日は20:00~21:00、火曜日~木曜日は18:30~19:30、金曜日は19:00~21:00、土曜日は13:00~15:00と16:30~
3.16:30~の介助のうち、第1土曜日と第5土曜日は(月によって存在しますので)16:30~21:30、第2土曜日は16:30~17:30と19:30~23:00、第3土曜日と第4土曜日は16:30~23:00。第5土曜日が存在しない月はその月の最後の日曜日。
4.原則3のとおりだけれども第2土曜日と第3土曜日に関してはJ列が「→」になった時16:30~17:30と19:30~23:00にし、J列が「⇔」担になった時は16:30~23:00とする。
5.同じ日付でも時間に間があったら行を追加する(例:9/12(土)A16が13:00~15:00、A17が16:30~17:30、A18が19:30~23:00。日付はA16~A18まで同じ)

としたいんですが(特に日付)どのように式を立てたらよいでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2009/09/04 17:03:02
  • 終了:2009/09/08 13:05:10

ベストアンサー

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692009/09/05 14:30:17

ポイント60pt

とりあえず作ってみました。

コメントにも書きましたが、数式だけでは行の追加はできないので、

数式を使わず、A列の変化とJ列の変化をキーにしてイベントが発生させて表を作るようにしました。

つまり、日付を入力すると、曜日、介助開始時間、介助終了時間、介助時間、介助事業所が自動で入力されます。

また、J列に"→"、"⇔"を入力することでも変更されます。


土曜日の19:30~23:00に関しては事業所が何になるのかわからないので、仮にB事業所としました。

コードの該当箇所を変更することで修正してください。


>第5土曜日が存在しない月はその月の最後の日曜日。

この部分はよくわからなかったので実装していません。


意図する動作ではない場合、ご指摘くださればできる範囲で修正させていただきます。


コードのコピペ場所ですが、

シートの下の方にあるシートの名前を右クリックして「コードの表示」で開く画面に全文をコピペしてください。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim mydate As Date
    
    If Target.Column = 10 And Cells(Target.Row, "B").Value = "土曜日" Then
        If Target.Value = "→" Or Target.Value = "⇔" Or Target.Value = "" Then
            Application.EnableEvents = False
            If Cells(Target.Row, "A").Value <> "" And _
                Cells(Target.Row, "A").Value = Cells(Target.Row + 1, "A").Value Then
                Rows(Target.Row + 1).Delete
            End If
            If Cells(Target.Row, "A").Value <> "" And _
                Cells(Target.Row, "A").Value = Cells(Target.Row + 1, "A").Value Then
                Rows(Target.Row + 1).Delete
            End If
            Application.EnableEvents = True
            Cells(Target.Row, "A").Value = Cells(Target.Row, "A").Value
        Else
            Exit Sub
        End If
    Else
        If Target.Column <> 1 Then Exit Sub
    
        If IsDate(Target.Value) Then
            mydate = Target.Value
        Else
            Exit Sub
        End If
        
        '曜日で分岐
        Select Case Application.WorksheetFunction.Weekday(mydate)
            Case 1
                Target.Offset(0, 1).Value = "日曜日"
                Target.Offset(0, 2).Value = ""
                Target.Offset(0, 3).Value = ""
                Target.Offset(0, 4).Value = ""
                Target.Offset(0, 6).Value = ""
            Case 2
                Target.Offset(0, 1).Value = "月曜日"
                Target.Offset(0, 2).Value = "20:00"
                Target.Offset(0, 3).Value = "21:00"
                Target.Offset(0, 4).Value = "1"
                Target.Offset(0, 6).Value = "A事業所"
            Case 3
                Target.Offset(0, 1).Value = "火曜日"
                Target.Offset(0, 2).Value = "18:30"
                Target.Offset(0, 3).Value = "19:30"
                Target.Offset(0, 4).Value = "1"
                Target.Offset(0, 6).Value = "B事業所"
            Case 4
                Target.Offset(0, 1).Value = "水曜日"
                Target.Offset(0, 2).Value = "18:30"
                Target.Offset(0, 3).Value = "19:30"
                Target.Offset(0, 4).Value = "1"
                Target.Offset(0, 6).Value = "C事業所"
            Case 5
                Target.Offset(0, 1).Value = "木曜日"
                Target.Offset(0, 2).Value = "18:30"
                Target.Offset(0, 3).Value = "19:30"
                Target.Offset(0, 4).Value = "1"
                Target.Offset(0, 6).Value = "D事業所"
            Case 6
                Target.Offset(0, 1).Value = "金曜日"
                Target.Offset(0, 2).Value = "19:00"
                Target.Offset(0, 3).Value = "21:00"
                Target.Offset(0, 4).Value = "2"
                Target.Offset(0, 6).Value = "B事業所"
            Case 7
                Target.Offset(0, 1).Value = "土曜日"
                Target.Offset(0, 2).Value = "13:00"
                Target.Offset(0, 3).Value = "15:00"
                Target.Offset(0, 4).Value = "2"
                Target.Offset(0, 6).Value = "C事業所"
                Application.EnableEvents = False
                If Target.Value <> Target.Offset(1, 0).Value Then
                    Rows(Target.Row + 1).Insert
                    Target.Offset(1, 0).Value = Target.Value
                End If
                Application.EnableEvents = True
                Target.Offset(1, 1).Value = "土曜日"
                Target.Offset(1, 2).Value = "16:00"
                Target.Offset(1, 6).Value = "B事業所"
                                    
                '第何週かで分岐
                Select Case Int((Day(mydate) - 1) / 7) + 1
                    Case 1, 5
                        Target.Offset(1, 3).Value = "21:30"
                        Target.Offset(1, 4).Value = "5.5"
                    Case 2
                        'J列で分岐
                        If Target.Offset(0, 9).Value = "⇔" Then
                            Target.Offset(1, 3).Value = "23:00"
                            Target.Offset(1, 4).Value = "7"
                        Else
                            Target.Offset(1, 3).Value = "17:30"
                            Target.Offset(1, 4).Value = "1.5"
                            Application.EnableEvents = False
                            If Target.Value <> Target.Offset(2, 0).Value Then
                                Rows(Target.Row + 2).Insert
                                Target.Offset(2, 0).Value = Target.Value
                            End If
                            Application.EnableEvents = True
                            Target.Offset(2, 1).Value = "土曜日"
                            Target.Offset(2, 2).Value = "19:30"
                            Target.Offset(2, 3).Value = "23:00"
                            Target.Offset(2, 4).Value = "3.5"
                                
                            'この事業所がわからないのでとりあえずB事業所に
                            Target.Offset(2, 6).Value = "B事業所"
                        End If
                    Case 3
                        'J列で分岐
                        If Target.Offset(0, 9).Value = "→" Then
                            Target.Offset(1, 3).Value = "17:30"
                            Target.Offset(1, 4).Value = "1.5"
                            Application.EnableEvents = False
                            If Target.Value <> Target.Offset(2, 0).Value Then
                                Rows(Target.Row + 2).Insert
                                Target.Offset(2, 0).Value = Target.Value
                            End If
                            Application.EnableEvents = True
                            Target.Offset(2, 1).Value = "土曜日"
                            Target.Offset(2, 2).Value = "19:30"
                            Target.Offset(2, 3).Value = "23:00"
                            Target.Offset(2, 4).Value = "3.5"
                            
                            'この事業所がわからないのでとりあえずB事業所に
                            Target.Offset(2, 6).Value = "B事業所"
                        Else
                            Target.Offset(1, 3).Value = "23:00"
                            Target.Offset(1, 4).Value = "7"
                        End If
                    Case 4
                        Target.Offset(1, 3).Value = "23:00"
                        Target.Offset(1, 4).Value = "7"
                End Select
        End Select
    End If
    
End Sub
id:kanachan

ありがとうございます。

月によって第5土曜日があったりなかったりすると思うのですが、当月に第5土曜日があったら第5土曜日に介助、第5土曜日がなかったら第4日曜日といった感じです。

例えば9月の土曜日は第4土曜日までです。10月は第5土曜日まであります。

なので9月は9/27日曜日の14:00~19:00に介助を行い、10月だったら10/31土曜日16:30~21:30に介助を行なう、という事です。

でも頂いたコードも充分です。

ありがとうございます。

2009/09/05 22:40:07
  • id:SALINGER
    質問が不明瞭な気がするので、確認します。
    1 B列に曜日が入ると自動的にG列に事業所名が入るということでしょうか。
     その場合、A列に日付が入るとB列に曜日が入るということでしょうか。
    2~5 A列に日付が入ると自動的に時間が入るということでしょうか。
     その場合、20:00~21:00というのはC列の介助開始時間~D列の介助終了時間のことでしょうか。
  • id:kanachan
    SALINGER様

    いつも説明下手でスミマセン。
    全てSALINGER様の仰るとおりです。
    B列にはweekday関数が入っています。
  • id:SALINGER
    これを数式だけでやるとすると行を追加する部分が不可能となります。
    あらかじめ日付部分決まっていればそれを元に表を作るマクロならば書けそうですが。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません