以下のように、同じ形式の予定表が複数シートに用意されている場合で、それぞれの予定表の特定の時間に同じ予定を一括で登録する機能の開発方法について解説していきます。

※こちらで開発したファイルは、記事の最後にて配布しています。
開発準備
まず初めに、[開発]タブを選択し、[マクロ]を選択します。

表示された以下の画面にて、開発する機能の名前を入力し、[作成]を選択します。
こちらでは、「setSchedule」と入力しています。

次に表示される以下の画面の「Sub ○○」から「End Sub」の間にコードを記述します。

コードの記述
以下のコードを記述します。
Sub setSchedule()
Dim mWs As Worksheet
Set mWs = Worksheets("反映")
Dim ws As Worksheet
Dim i As Long
For i = 4 To 33
If mWs.Cells(i, "B").Value <> "" Then
For Each ws In Worksheets
If ws.Name <> mWs.Name Then
If InStr(ws.Cells(i, "B").Value, _
mWs.Cells(i, "B").Value) = 0 Then
ws.Cells(i, "B").Value = _
mWs.Cells(i, "B").Value & vbLf & _
ws.Cells(i, "B").Value
End If
End If
Next ws
End If
Next i
End Sub
では、コードについて解説していきます。
Dim mWs As Worksheet
Set mWs = Worksheets("反映")
反映元となるシート情報を変数「mWs」に割り当てています。
Dim ws As Worksheet
Dim i As Long
繰り返し処理で扱う変数を定義しています。
変数「ws」は各シートを繰り返す際に活用し、変数「i」は各行を繰り返す際に活用します。
For i = 4 To 33
If mWs.Cells(i, "B").Value <> "" Then
For Each ws In Worksheets
If ws.Name <> mWs.Name Then
'処理
End If
Next ws
End If
Next i
Forで反映シートの予定表の先頭行から最終行までを繰り返し、内側のIfで予定が空でない場合に関してのみ、更に内側のFor Eachを実行するように記述しています。

For Eachでは、存在するシート1つ1つのシート情報を順番に変数「ws」に割り当て、更に内側のIfでシート名が「反映」でない場合に関してのみ、最深部の処理を実行するように記述しています。
If InStr(ws.Cells(i, "B").Value, _
mWs.Cells(i, "B").Value) = 0 Then
ws.Cells(i, "B").Value = _
mWs.Cells(i, "B").Value & vbLf & _
ws.Cells(i, "B").Value
End If
最深部では、Ifで反映元のシートの対象行「i」の予定と同じ予定が登録されていないことを確認しています。
InStrを活用して、反映先のシート「ws」の対象行「i」のセルに、反映元のシート「mWs」の対象行「i」のセルの値が含まれているかどうかを判定しています。
InStrで含まれていないと判断された場合は、「0」を返します。
そのため、その結果が「0」の場合という条件式になっています。
この条件を満たしたときに、反映先のシート「ws」の対象行「i」のセルに元々入力されている値に対し、改行「vbLf」と反映元のシートの対象行「i」のセルの値を加えています。
ボタンの作成
コードが完成しましたら、反映シートに実行ボタンを用意します。
実行ボタンは、[開発]タブの中の[挿入]から作成することができます。

完成
以上の手順で、機能が完成します。
反映シートの10:00の予定(セルB8)に「共通の予定」と入力して、「一括反映」ボタンを押した実行結果は、以下になります。

既存の予定が存在する場合は、その予定を残したまま、先頭に「共通の予定」が追加されます。
▼サンプルファイル▼
















































































































