Excelでのデータ処理についての質問です。


まずは、ファイルの<処理前>のデータを見てください。
以下のようになっています。
http://www.filebank.co.jp/wblink/ee0f0e1a428ebe447aba848ab61b02aa

問題は、ひとつのセル内に別の日時のものがまとめて記入されているために、
並べ替えに手間がかかることです。

これを、日時の昇順(つまり日時順)に並べ替えたいのです。
ファイルの<処理後>を見てください。このようにしたいわけです。

簡単に日時順に並べ替える方法は何かないでしょうか。
時間は前後しても構いませんが、最低限日付順に並べかえることが目的です。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2008/11/24 01:25:23
  • 終了:2008/11/24 05:43:16

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912008/11/24 02:51:50

ポイント100pt

VBA での処理例です。


サンプルデータを勝手に変更していますが、処理したいデータ(B3:D8)を

左上(A1:C6)につめて実行してみてください。


標準モジュールにおいて実行してみてください。

http://www.bunsugi.ed.jp/vba4graduate/vba_gaisetsu.htm

Sub reformat()
    Dim srcWS As Worksheet
    Set srcWS = ActiveSheet
    
    Dim dstWS As Worksheet
    Set dstWS = Worksheets.Add(before:=Worksheets(1))
    
    srcWS.Range("A1:C1").Copy dstWS.Range("A1:C1")

    Dim lastRow As Long
    lastRow = srcWS.Range("A" & Rows.Count).End(xlUp).Row

    Dim i As Long, j As Long
    Dim ar As Variant
    
    Dim ll As Long
    ll = 2
    For i = 2 To lastRow
        ar = Split(srcWS.Cells(i, "C").Value, vbLf)
        For j = LBound(ar) To UBound(ar)
            dstWS.Cells(ll, "A").Value = srcWS.Cells(i, "A")
            dstWS.Cells(ll, "B").Value = srcWS.Cells(i, "B")
            dstWS.Cells(ll, "C").Value = ar(j)
            dstWS.Cells(ll, "D").Value = getDate(ar(j))
            ll = ll + 1
        Next
    Next
    ll = ll - 1
    With dstWS
    .Columns("A:D").Sort Key1:=.Cells(1, "D"), order1:=xlAscending, Header:=xlYes
    .Columns("D").Delete
    .Columns("C").ColumnWidth = 50
    .Range("A1").Resize(ll, 3).Borders.LineStyle = xlContinuous
    .Range("A1").Resize(ll, 3).Borders.Weight = xlThin
    End With
End Sub

Function getDate(ByVal strDateTime As String) As Date
    Dim yy%, mm%, dd%, ps%, pe%
    strDateTime = Replace(strDateTime, " ", "")
    strDateTime = Replace(strDateTime, " ", "")

    ps = 1
    pe = InStr(strDateTime, "年")
    yy = CInt(Mid(strDateTime, ps, pe - ps))
    
    ps = pe + 1
    pe = InStr(strDateTime, "月")
    mm = CInt(Mid(strDateTime, ps, pe - ps))
    
    ps = pe + 1
    pe = InStr(strDateTime, "日")
    dd = CInt(Mid(strDateTime, ps, pe - ps))

    getDate = DateSerial(yy, mm, dd)
End Function
id:ikazuo

ありがとうございました!

URLもありがとうございます。

今回いただいたコードと併せて勉強させていただきます。

こんなに早く解決できて感謝しています。

2008/11/24 05:41:51

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません