上図の様なエクセルファイルがあり、日付と名前と開始時間でソートされています。
右側に5分間隔で刻まれた軸があり、該当する時間帯に1を入力するマクロを作成したいと思っております。
例)1行目であれば、
18:45 18:50 18:55 19:00 19:05 19:10 19:15 19:20 19:25
1 1 1 1 1 1 1 1
といった感じです。
また、同じ日付に関しては1行にまとめたいです。
しかし、開始時間と終了時間で表されたデータから、5分刻みのどこに入れるのかを判別させる方法が思いつきません。
どなたかアイデアがあればご教授お願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
差し出がましいようですが興味が湧いたので作ってみました。
参考になれば幸いです。
Option Explicit Sub test() Dim StartHour As Integer '開始時刻(時) Dim StartMinute As Integer '開始時刻(分) Dim EndHour As Integer '終了時刻(時) Dim EndMinute As Integer '終了時刻(分) Dim CurHour As Integer '現在の列の1行目に記載されている時刻(時) Dim CurMinute As Integer '現在の列の1行目に記載されている時刻(分) Dim NextHour As Integer '次の列の1行目に記載されている時刻(時) Dim NextMinute As Integer '次の列の1行目に記載されている時刻(分) Dim MaxRows As Integer '最大行数 Dim MaxColumns As Integer '最大列数 Dim CurRow As Integer '現在の行番号 Dim CurColumn As Integer '現在の列番号 MaxRows = Range("A1").CurrentRegion.Rows.Count '最大行数取得 MaxColumns = Range("A1").CurrentRegion.Columns.Count '最大列数取得 For CurRow = 2 To MaxRows '2行目から最終行まで順番に処理(1行目は見出しだけなので処理しない) For CurColumn = 3 To MaxColumns '3列目から最終列まで順番に処理 If CurColumn = 3 Then '現在列が3列目の場合は開始時刻を取得 StartHour = Hour(Cells(CurRow, CurColumn).Value) StartMinute = Minute(Cells(CurRow, CurColumn).Value) ElseIf CurColumn = 4 Then '現在列が4列目の場合は終了時刻を取得 EndHour = Hour(Cells(CurRow, CurColumn).Value) EndMinute = Minute(Cells(CurRow, CurColumn).Value) Else '自列1行目に記載されている時刻を取得 CurHour = Hour(Cells(1, CurColumn).Value) CurMinute = Minute(Cells(1, CurColumn).Value) '次の列の1行目に記載されている時刻を取得 NextHour = Hour(Cells(1, CurColumn + 1).Value) NextMinute = Minute(Cells(1, CurColumn + 1).Value) If StartHour < CurHour Or (StartHour = CurHour And StartMinute - CurMinute <= 4) Then '開始「時」が1行目の「時」未満、もしくは '開始「時」が1行目の「時」と同じかつ、開始「分」マイナス1行目の「分」が4分以下の場合 '現在セルに"1"を書き込む Cells(CurRow, CurColumn).Value = "1" End If If EndHour < NextHour Or (EndHour = NextHour And EndMinute < NextMinute) Then '終了「時」が次列の「時」未満の場合、もしくは '終了「時」が次列の「時」と同じかつ、終了「分」が次列の「分」未満の場合 '内側のループを抜けて次の行の処理に移る Exit For End If End If Next Next End Sub
投稿2016/11/15 13:45
編集2016/11/16 02:29総合スコア1894
0
12時をまたがないデータ群であれば、以下の手抜きロジックでいかがですか
・読み込むデータのあるシートと、結果を作成するシートを分離。
・・縦軸の行番号は、日付を用いた順番とする。(例えば1日なら見出しを除外した2行目開始)
・・横軸の列見出しは時刻の下4桁を数値化したものを用いる
・データの行ごとにループ
・・開始日付の日付から結果を「書き込む行」を求める。
・・開始日付の4桁を数値化する。(例 1848)
・・終了日付の4桁を数値化する。(例 1919)
・・列番号でループ
・・・開始数値 <= 見出し行・ループ列番号のセル数値 かつ
・・・見出し行・ループ列番号のセル数値 <= 終了数値ならば
・・・・「書き込む行数」・ループ列番号のセルに1を書く
・・・・(このとき、既に1が入力されていたら、どうするか?)
空白は消去されちゃうので、・をインデント代わりにしてます。読みにくくて申し訳ないです。
投稿2016/11/14 02:23
総合スコア716
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/14 04:40
2016/11/14 04:56
2016/11/14 05:08
2016/11/14 05:49
2016/11/15 08:14
2016/11/15 08:34
2016/11/15 12:11
2016/11/15 12:22
2016/11/17 03:03
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/15 13:45
2016/11/15 13:53
2016/11/15 14:05
2016/11/16 02:30
2016/11/17 03:04
2016/11/17 03:08
2016/11/17 03:14