|Try the following code.|
1 - Column A contains data in every row. This is the column that is used to determine how many rows need to be dealt with.
2 - Row 1 contains Column Headings and therefore should not be included.
2 - There is no data beyond Column T. To make the code easier to write, I simply copy the entire row as many times as needed, and then clear the values in I:P. This essentially copies down A-G and Q-T by leaving the data in the newly copied row. If there is data beyond Column T that you don't want, that is easy to deal with. Just let me know.
I suggest you try this on a back-up copy of your workbook in case things go terribly wrong. I also suggest that you try it on a shortened version. In order to make the code run quicker, it turns off ScreenUpdating so you won't see anything happening until it's done. It might take a while to do "thousands" of rows so I suggest you try it with just a few rows to see if it does what you expect.
Dim lastRw As Long
Dim rw As Long
Dim numRws As Long
Dim insRw As Long
Dim myRng As String
Application.ScreenUpdating = False
'Determine last row with data in Column A
lastRw = Cells(Rows.Count, 1).End(xlUp).Row
'Loop through Rows
For rw = lastRw To 2 Step -1
'Count Cells in I:Q that contain data
myRng = Range(Cells(rw, "I"), Cells(rw, "Q")).Address
numRws = Application.WorksheetFunction.CountA(Range(myRng))
'Insert Rows based on count
For insRw = rw To rw + numRws - 1
Cells(insRw + 1, 1).EntireRow.Insert
'Copy entire Row, Clear I:P in new Row
Cells(insRw, 1).EntireRow.Copy Cells(insRw + 1, 1)
Range(Cells(insRw + 1, "I"), Cells(insRw + 1, "P")).ClearContents
Application.ScreenUpdating = True
Click Here Before Posting Data or VBA Code ---> How To Post Data or Code.