| 
    
     |  | こんにちは。かみちゃん です。 
 >2.処理開始前のシートイメージは、次のとおりです。
 > 氏名   生年月日、年齢、所属、・・・・・・・
 > 田中一郎 1970/1/1 37  管理部 ・・・・・・
 > データとしては150名分ほどです。
 >3.処理後のシートは、別シートを望みます。
 >4.同一部署に同一年齢の人が複数いる場合は、一人1行でもいいのですが、
 > できれば、
 > 「佐藤一郎」
 > 「鈴木一郎」
 > のように縦に並べて表示したいです。
 > 罫線は佐藤と鈴木の間には入れたくないです。
 
 Sheet1
 A     B    C   D   E
 1 氏名   生年月日、年齢 所属
 2 田中一郎 1970/1/1  37 管理部
 3 佐藤一郎 1975/2/3  32 製造部
 4 鈴木一郎 1975/3/4  32 製造部
 5
 というシートであった場合で、Sheet2に出力する場合であれば、
 以下のようなコードでできます。
 
 なお、同一部署で同一年齢の人は、セル内改行をすることで、同一
 セルで表示するようにしています。
 一人1セルにするには、面倒だったので。
 
 あと、他にもっと速くてスマートな方法があるかもしれません。
 
 Sub Sample()
 Dim WS1 As Worksheet
 Dim WS2 As Worksheet
 Dim LastCell As Range
 Dim c As Range
 Dim lngRow As Long
 Dim intCol As Integer
 
 Set WS1 = Worksheets("Sheet1")
 Set WS2 = Worksheets("Sheet2")
 Set LastCell = WS1.Cells(Rows.Count, 1).End(xlUp)
 
 For Each c In WS1.Range("A2", LastCell)
 lngRow = 0
 On Error Resume Next
 lngRow = WorksheetFunction.Match(c.Offset(, 2).Value, WS2.Columns("A"), 0)
 On Error GoTo 0
 If lngRow = 0 Then
 lngRow = WS2.Cells(Rows.Count, "A").End(xlUp).Offset(1).Row
 WS2.Cells(lngRow, "A").Value = c.Offset(, 2).Value
 End If
 intCol = 0
 On Error Resume Next
 intCol = WorksheetFunction.Match(c.Offset(, 3).Value, WS2.Rows("1"), 0)
 On Error GoTo 0
 If intCol = 0 Then
 intCol = WS2.Cells(1, Columns.Count).End(xlToLeft).Offset(, 1).Column
 WS2.Cells(1, intCol).Value = c.Offset(, 3).Value
 End If
 With WS2.Cells(lngRow, intCol)
 If .Value = "" Then
 .Value = c.Value
 Else
 .Value = .Value & vbCrLf & c.Value
 End If
 End With
 Next
 End Sub
 
 |  |