Here's a VBA subroutine that will do this for you. I commented the snot out of it, so you can make sense of it and change things as needed:
Sub transpoooooooooOOOOooose()
Dim rngCell As Range 'variable to hold which cell we are on
Dim intCol As Integer 'variable to hold the column we are writing to
Dim intRow As Integer 'variable to hold the row we are writing to.
Dim strGuysName As String 'variable to hold the name of the dude
'first we will write to column 2 (column 1 will contain the name of the guy)
intCol = 2
'and row 0 (it will be popped up to row 1 in the first iteration
intRow = 0
'Those will be increased as we iterate below
'iterate through every filled out cell in column A
For Each rngCell In Sheet1.Range("A:A")
If rngCell.Value = "" Then Exit Sub 'we hit the bottom of the list, exit
'If this is a new dude, then increase intRow
' and capture the name
' and send intCol back to 2
If rngCell.Value <> strGuysName Then
intRow = intRow + 1 'see, we popped it up one.
strGuysName = rngCell.Value
intCol = 2
End If
'Now... the meat and potatoes
Sheet2.Cells(intRow, 1).Value = strGuysName 'write out the guys name
Sheet2.Cells(intRow, intCol).Value = rngCell.Offset(, 1).Value 'write out the city which is one column over
'increase the intCol by 1
intCol = intCol + 1
Next
End Sub
You could also do this with front end excel stuff.
First, get a unique list of dude's names from col A and stick those in a new sheet (sheet2)
Then, in Sheet2!B1
(next to Tom) use:
=IF(INDEX(Sheet1!$A:$A, MATCH($A1,Sheet1!$A:$A, 0) + COLUMN() - 2)=$A1, INDEX(Sheet1!$B:$B, MATCH($A1,Sheet1!$A:$A, 0) + COLUMN() - 2), "")
That beast will find "Tom" in Sheet1 (your original list) and return the row that he is found. It will then go down the number of rows that are equal to the column this formula is in minus 2 (since we start in B). So column B version checks the first row "Tom" is found, then Column C version finds one row after that, and Column D finds one row after that. If that cell whatever number of rows down is "Tom" still, then do the same logic, but grab whatever is in B.