Ben ça parait évident une fois qu'on a le nez dessus :
avec While .Cells(ligne, 5).Value <> "x", on teste Cells(ligne, 5)
avec
If Not (.Cells(ligne, 12).Value = "" Or .Cells(ligne, 12).Value = "ref") Then
ComboBox1.AddItem .Cells(ligne, 12).Value
ligne = ligne + 1
End If
on incrémente la variable ligne si Cells(ligne, 5) n'est pas vide et n'est pas ="ref".
Donc si Cells(ligne, 5) est vide on n'incrémente pas la variable ligne, on poursuit en exécutant le while
Cells(ligne, 5) est toujours vide donc on n'incrémente pas ligne , on repasse par while etc de manière infinie jusqu'à saturer le système...
La solution : sortir l'incrémentation de la variable ligne du test. Correction (avec le code du classeur) :
Dim ligne As Integer
ligne = 3
With Worksheets("Feuil1") 'pour plus de lisibilité
While .Cells(ligne, 5).Value <> "x"
If Not (.Cells(ligne, 5).Value = "" Or .Cells(ligne, 5).Value = "ref") Then
ComboBox1.AddItem .Cells(ligne, 5).Value
End If
ligne = ligne + 1
Wend
End With
A+