- ベストアンサー
Excelで乗り継ぎ時刻表の調整を自動化する方法
- Excelを使用して作成した乗り継ぎ時刻表の調整方法を自動化する手法を解説します。
- 乗り継ぎ時刻表の作成において、関数やマクロを活用することで手動での調整作業を省きます。
- セルの結合や文字列の整列に加えて、罫線の追加も自動化するための方法を提案します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ちゃんとやろうと思うと、結構面倒ですね。 お望みの形とはちょっと違いますがマクロで作ってみました。 変数宣言も適当ですし、エラー処理も適当なのであくまでもサンプルです。 Sub Sample() Dim dWork As Date Dim dDate As Date nConect1 = 3 '甲バス-電車乗り換え時間(分) nConect2 = 5 '電車-乙バス乗り換え時間(分) nTime = 20 '電車所要時間(分) nDia1 = Cells(Rows.Count, 2).End(xlUp).Row nDia2 = Cells(Rows.Count, 4).End(xlUp).Row nDia3 = Cells(Rows.Count, 5).End(xlUp).Row '各交通機関のダイヤ位置調整 Range("A1:D" & nDia3).Insert Shift:=xlDown Range("A1:B" & nDia2).Insert Shift:=xlDown Columns("F:F").Insert Shift:=xlToRight '作業列の挿入 '乙バス For i = 1 To nDia3 'ソート基準時刻に+2秒(ソート上の都合) Cells(i, 6) = Cells(i, 5) + 2 / 24 / 60 / 60 Next i '電車 For j = 1 To nDia2 'ソート基準時刻に+1秒(ソート上の都合) Cells(j + nDia3, 6) = Cells(j + nDia3, 4) + (nConect2 + 1 / 60) / 24 / 60 Next j '甲バス dTrainMax = WorksheetFunction.Max(Range("C:C")) For k = 1 To nDia1 dDate = Cells(k + nDia3 + nDia2, 2) + nConect1 / 24 / 60 If dDate <= dTrainMax Then dWork = fSearchDate(dDate, 3, 0) dWork = fSearchDate(dWork + (nConect2 + nTime) / 24 / 60, 6, 1) Else dWork = WorksheetFunction.Max(Range("F:F")) End If Cells(k + nDia3 + nDia2, 6) = dWork + k / 24 / 60 / 60 Next k 'F列でのソートと作業列の削除 Range("A:F").Sort Key1:=Range("F1"), order1:=xlAscending Columns("F:F").Delete Shift:=xlToLeft End Sub Function fSearchDate(dDate As Date, nCol As Long, nType As Long) As Date Dim dWork() As Variant Dim dData1 As Date Dim dData2 As Date fSearchDate = 0 nTarget = Cells(Rows.Count, nCol).End(xlUp).Row nCount = 0 For i = 1 To nTarget If nType = 0 Then 'nCol列からdDate以上の中で一番小さい値を返す dData1 = Cells(i, nCol) dData2 = dDate Else 'nCol列からdDate以下の中で一番大きい値を返す dData1 = dDate dData2 = Cells(i, nCol) End If '誤差の発生を防ぐために一旦「hh:mm:ss」にして比較 If CDate(Format(dData1, "hh:mm:ss")) >= CDate(Format(dData2, "hh:mm:ss")) Then ReDim Preserve dWork(nCount) dWork(nCount) = Cells(i, nCol) nCount = nCount + 1 End If Next i If nCount > 0 Then If nType = 0 Then fSearchDate = Application.WorksheetFunction.Min(dWork()) Else fSearchDate = Application.WorksheetFunction.Max(dWork()) End If End If End Function
お礼
>お望みの形とはちょっと違いますが とんでもありません。おかげさまで道が見えてきました。 回答の締め切りはもう少し先にしたいと思いますが、 手探りの状態から脱却できました。 お早い回答をありがとうございました。
補足
思いつきですみませんが、フィルタ機能では無理でしょうか?