My colleague Lavan came to me with a problem at work, and it was the perfect use case for Power Query (also know as Get & Transform).

Every month he has to get some data from a system and use that in his month end finance work.

This part of the system has no export button. The only way to get the data is to highlight it on screen and copy and paste the data into an Excel sheet.

Instead of copying into a nice table like it’s displayed on screen it copies into a single vertical column. He then needs to turn this single column back into a table to continue the rest of his work.

In this post, we’ll use power query to create a transformation that turns a single column into a table.

The Single Column of Data

Address-Data-in-a-Single-Column Transform a Column to a Table with Power Query

In this example, we’ll look at some addresses that are stacked in a single column.

Each record in the column consists of 5 rows of data: the name, street address, city, country and a postal code.

Our transformation will rely on the fact that each record set has exactly 5 rows. In this example, it’s 5, but this will work for any number, the key is that it’s a fixed constant for each record.

Turn the Single Column into an Excel Table

Turn-the-Address-Data-into-an-Excel-Table Transform a Column to a Table with Power Query

We are going to be using power query to transform this data later using a From Table/Range query. This will automatically turn our data into an Excel Table, but we might as well do this step first and name our table appropriately.

Select the data and press Ctrl + T to turn the data into a table. You can also create a table from the Insert tab with the Table command.

Our data has the column heading Contact Information, so check off the My table has headers box in the Create Table dialog box.

Go to the Table Tools Design tab and change the name to InputData.

Create a From Table/Range Query

Create-a-From-Table-Range-Query Transform a Column to a Table with Power Query

Select your InputData table and go to the Data tab and press the From Table/Range query button. This will open the query editor with our single column table loaded.

Create an ID Column to Group Address Records

The goal here is to create a column with a grouped index that will increment by 1 every time there is a new address record in the data. Because our data always has exactly 5 rows per address, this means we want to create a column that increments by 1 every 5 rows.

Add-Index-Column-Starting-From-1 Transform a Column to a Table with Power Query

The first step is to add an index column. Go to the Add Column tab of the query editor and select the Index command. Press on the small black arrow to the right to reveal more options and choose From 1. This will start the index column at 1 in the first row instead of the default of 0.

Add-a-Custom-Column Transform a Column to a Table with Power Query

Now we can use the Number.Mod function to find the remainder of our index when we divide by 5 (the number of rows per record). Go to the Add Column tab and select the Custom Column command.

Custom-Column-for-Remainder-Formula Transform a Column to a Table with Power Query

Enter the =Number.Mod([Index],5) in the custom column formula editor and rename the new column to Remainder. This formula will return the remainder of the index column on division by 5. This will result in a repeating sequence of {1,2,3,4,0} for each of the address records in our data.

Notice that the first row of each record has a 1 in the remainder column.

Custom-Column-for-Indicator-Formula Transform a Column to a Table with Power Query

Now let’s add a column that indicates the starting row of an address record. We can add another custom column and create the formula if [Remainder]=1 then 1 else 0 in the custom column formula editor and rename the new column to Indicator.

This will contain a 1 when the record is the start of an address and 0 everywhere else.

Custom-Column-for-ID-Formula Transform a Column to a Table with Power Query

Now let’s add an ID column that will be the same for all rows related to a given address record.

We can add another custom column and create the formula List.Sum(List.Range(#"Added Custom1"[Indicator],0,[Index])) in the formula editor and rename the new column to ID.

This creates a running total based on the indicator column which will be our grouped index number.

Pivot the Data Based on the Remainder and ID Column

Now we are ready to pivot our data. This is where we turn the single column of data into a proper 5 column table of data with one row per address record.

Delete-the-Index-and-Indicator-Columns Transform a Column to a Table with Power Query

Hold the Ctrl key to select both the Index and Indicator columns. Then right click on either column and choose Remove Columns from the menu.

Pivot-the-Remainer-Column Transform a Column to a Table with Power Query

Now we can pivot our data based on the remainder column. Select the Remainder column and go to the Transform tab and press the Pivot Column command.

Pivot-Remainder-Column-with-Advanced-Options Transform a Column to a Table with Power Query

Now we can select our values to pivot as the addresses in the Contact Information column and in the advanced options select Don’t Aggregate as the aggregate value function. Press the Ok button and data should be a familiar table format.

Now we can remove the ID column as it’s done its job. We can also rename the columns as Name, Address, City, Country and Postal Code respectively then Close & Load the query into an Excel table.

Conclusions

Final-Table-of-Addresses Transform a Column to a Table with Power Query

Now we have a proper table of address data where each row contains one address and each part of the data is in its own column.

The great thing about power query is now that we have built this query, we can use it each time we need to copy the data from our system.

All we need to do is paste the new data into the InputData table and hit the Refresh button in the Data tab.

We now have an easily repeatable process to clean up our data every month.