• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelで乗り継ぎ時刻表の調整を自動で行なう方法)

Excelで乗り継ぎ時刻表の調整を自動化する方法

このQ&Aのポイント
  • Excelを使用して作成した乗り継ぎ時刻表の調整方法を自動化する手法を解説します。
  • 乗り継ぎ時刻表の作成において、関数やマクロを活用することで手動での調整作業を省きます。
  • セルの結合や文字列の整列に加えて、罫線の追加も自動化するための方法を提案します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.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

kumoyama
質問者

お礼

>お望みの形とはちょっと違いますが とんでもありません。おかげさまで道が見えてきました。 回答の締め切りはもう少し先にしたいと思いますが、 手探りの状態から脱却できました。 お早い回答をありがとうございました。

kumoyama
質問者

補足

思いつきですみませんが、フィルタ機能では無理でしょうか?

関連するQ&A