As RickZeeland pointed it out... below line is redundant and raises
numCategory_ValueChanged
event again!
numCategory.Value = 0
As to the code... I'd change the body of event this way:
num = numCategory.Value
If num = 0 Then MsgBox("No more points to allocate")
numCategory.Enabled = (num > 0)
lblpoints.Text = num.ToString()