That said, you could embed a report with columns as a subform in a subform control in a form, if that would meet the requirement.
As said the vertical solution will require code. Horizontal does not.
That is one way to do it. Maybe there is an easier way. If you had three subforms to look like columns then.
1. Determine number of records
2. Divide by 3 to get N and get remainder R
3. Update three query definitions (Pseudo code)
Q1: Select Top N ContactName from table1Order By ContactName
Q2: Select Top N ContactName from Table1 where ID Not in (Select Top N ID from Table1 Order By ContactName) Order by ContactName
Q3: Select Top (N+R) ContactName from table1 Where ID Not In (Select top (2N) ID from Table1 Order By ContactName) Order By ContactName
4. Set the source objects of the three subforms.
The Other way is a TempTable. For me this is a lot easier
The Temp table has three Columns. C1, C2, C3
1. Determine number of records
2. Divide by 3 to get N
3. Write to the TempTable. After each N record start on the next column. For the last column put all remaining records
This works fine until you exceed what can go on one sheet.