サンプル
前提
- イベントリストシート(EventListsシート)には、曜日別、開始時刻別のイベント一覧が記載されています。
- マスターシート(Masterシート)には、日付別のイベント一覧が記載されています。
- マスターシート(Masterシート)に入るデータは、一か月分のみです
- 開始曜日は月曜日とします
- 曜日の区切りは 05:00 ~ 28:59 とします
やりたいこと
Masterシートについて、EventListsシートに存在しない時刻があれば、行追加して、対象時刻を埋め込みたいです
サンプルURLにある、期待結果シートのような形にしたいです。(背景色はつかなくていいです)
現状、Masterシートは以下のような並びですが
イベント日 | 曜日 | 開始時刻 | 種別 |
---|---|---|---|
20220901 | 木 | 502 | B |
20220901 | 木 | 502 | B |
20220901 | 木 | 502 | A |
20220901 | 木 | 502 | A |
20220901 | 木 | 502 | A |
20220901 | 木 | 502 | A |
20220901 | 木 | 510 | A |
20220901 | 木 | 510 | A |
20220901 | 木 | 606 | A |
20220901 | 木 | 606 | A |
EventListsシートのC列 開始時間を見ると、5:00からのイベントがありますので、
以下のように、先頭に行追加したいです
種別も見分けがつきやすいように、ADDとつけたいです
イベント日 | 曜日 | 開始時刻 | 種別 |
---|---|---|---|
20220901 | 木 | 500 | ADD |
20220901 | 木 | 502 | B |
20220901 | 木 | 502 | B |
20220901 | 木 | 502 | A |
20220901 | 木 | 502 | A |
20220901 | 木 | 502 | A |
20220901 | 木 | 502 | A |
20220901 | 木 | 510 | A |
20220901 | 木 | 510 | A |
20220901 | 木 | 606 | A |
20220901 | 木 | 606 | A |
現在の実装
vba
1Sub appendPositionToMaster() 2 Dim ws As Worksheet 3 Dim ws2 As Worksheet 4 Dim lastRowNum As Long 5 Dim lastRowNum2 As Long 6 Dim i As Integer 7 Dim j As Integer 8 Dim weekName As String 9 Dim startTime 10 Dim weekName2 As String 11 Dim startTime2 12 13 Set ws = Worksheets("EventLists") 14 Set ws2 = Worksheets("Master") 15 16 ' A列の最終行番号を取得 17 lastRowNum = ws.Range("A" & Rows.Count).End(xlUp).row 18 lastRowNum2 = ws2.Range("A" & Rows.Count).End(xlUp).row 19 20 ' EventListsシート 行単位でループ 21 For i = 2 To lastRowNum 22 ws.Activate 23 24 ' L列(fix_week_name) の値を取得 25 weekName = Cells(i, 12).Value 26 ' M列(fix_start_time) の値を取得 27 startTime = Cells(i, 13).Value 28 29 ' M列(fix_start_time) の値をセミコロンなしの数値に変換する(0.208333333 -> "5:00" -> 500) 30 startTime = Val(Format(startTime, "hmm")) 31 32 ' Masterシート 行単位でループ 33 For j = 2 To lastRowNum2 34 ws2.Activate 35 36 ' B列(曜日) の値を取得 37 weekName2 = Cells(j, 2).Value 38 ' C列(開始時刻) の値を取得 39 startTime2 = Cells(j, 3).Value 40 41 If weekName2 = "" Then Exit For 42 43 ' C列(開始時刻) の値を数値に変換する("502" -> 502) 44 startTime2 = Val(startTime2) 45 46 ' 曜日が同じの時 47 ' EventListsの開始時刻がMasterシートの開始時刻よりも早い時 48 If weekName = weekName2 And startTime > startTime2 Then 49 MsgBox "Hit" 50 Rows(j).Insert 51 Exit For 52 End If 53 Next j 54 Next i 55End Sub
困っていること
- VBAで、行追加して、任意の値を代入する方法がわからないです
- ループ処理の適切な条件設定がわからないです
どのようにすれば、やりたいことが達成できますでしょうか。
VBAは経験が少なくてよくわからないです。
Masterシートは、日付、開始時刻の昇順になってますか。
また、エクセルのバージョンはなんでしょうか。
日付、開始時刻の昇順です。ExcelのバージョンはMicrosoft® Excel® 2019 MSO (バージョン 2111 ビルド 16.0.14701.20204) 32 ビット です。よろしくお願いいたします。
Masterに行を追加するのではなく、別のシートにMatserの行とEventListsの必要な行を追記する方法でも良いですか。最終的にMasterのシートが欲しいなら、Materシートを削除して、別のシートをMasterにRenameすればよいかと思います。
別のシートに出力するのはMatserのA列~H列までです。
EventListsの出力項目も、MatserのA列~H列に該当する列になります。
EventListsのP列を作業用に使用します。
(M列時刻(5:00)を数値(500)に変換したものをP列に書き込みます)
上記で良ければ、対応可能です。
@tatsu99 ご連絡ありがとうございます。それで大丈夫です。Masterシート自体、私が他社から提供されたオリジナルのシートを作業しやすいように型変換などをしたシートですので。(もともとのシートは全ての値が文字列形式になっていて値の比較ができませんでした)
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー