Please use the next code. It is extremely fast, working only in memory (using arrays). It also allows the separator to be "; ", "; " (more spaces, but the editor will correct) or ";". My code put the result at once, and can be very rapidly process thousands of rows.
Sub SplitCells()
Dim sh As Worksheet, lastR As Long, arrIn As Variant, arrRow As Variant
Dim arrF As Variant, i As Long, j As Long, n As Long
Set sh = ActiveSheet ' use here your sheet
lastR = sh.Range("A" & Cells.Rows.Count).End(xlUp).row
arrIn = sh.Range("A2:B" & lastR).value
ReDim arrF(1 To 2, 1 To 2000): n = 1
For i = 1 To UBound(arrIn, 1)
arrRow = Split(Trim(arrIn(i, 2)), ";")
For j = 0 To UBound(arrRow)
arrF(1, n) = arrIn(i, 1)
arrF(2, n) = arrRow(j)
n = n + 1
Next j
Next i
ReDim Preserve arrF(1 To 2, 1 To n - 1)
sh.Range("D2").Resize(n - 1, 2) = WorksheetFunction.Transpose(arrF)
End Sub
If you want to return the array data in another range, it is enough to change "D2" with whatever you need...