There are many possible solutions to this problem. I suggest two solutions, one which ca solve easily this specific situation, and another that is "general" to avoid re-entrance in any subroutine.
Solution 1.
This solution is specific to your situation. You can simply check the ListIndex
property before proceeding, at the first line of your sub:
If ComboBox1.ListIndex = -1 Then Exit Sub
The routine will be entered twice, but at the second occurrence it will exit immediately, with no effect.
Solution 2.
This is a general solution to avoid re-entrance of any routine. you can define a state variable for the routine, which is a static Boolean variable that indicates whether the routine is already in the call stack, in which case you don't re-enter it.
Private Sub NoReEnter()
Static isActive as Boolean ' <-- indicates that this routine is already in the call stack
If isActive then Exit Sub
isActive = True
On Error Goto Cleanup
''''''''''''''''''''''''''''''''''''''''''''''''''''
' .... ' Body of the routine
''''''''''''''''''''''''''''''''''''''''''''''''''''
Cleanup: ' make sure to reset the state variable before exiting
isActive = False
End Sub
Solution 2 can apply to any routine that you want to make non-recursive. Translating this solution into your code, without meddling with other potential (off-topic) issues, gives the following:
Private Sub ComboBox1_Click()
Static isActive As Boolean
If isActive then Exit Sub
isActive = True
On Error Goto Cleanup
' You routine's code as is
''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim valor As String
Dim celda As Range
Set celda = ActiveCell
valor = ComboBox1.Value
ComboBox1.ListIndex = -1
celda = valor
celda.Offset(1, 0).Select
''''''''''''''''''''''''''''''''''''''''''''''''''''
Cleanup:
isActive = False
End Sub