First, I see a possible bug in your program. You have
If Len(txtDSA(0)) < 4 Then
in your code. This will always check the value of the first control, regardless of which control in the array currently has the focus, and the focus will always remain with the current control, never letting you get back to the first control to correct the problem. I would suggest that this conditional should read as follows:
If Len(txtDSA(Index)) < 4 Then
On the other hand, if this validation only applies to the 0th control, and not to any others, then you might want to try the following code
If Index = 0 then
if len(txtDSA(0)) < 4)
cancel = true
msgbox "error ..."
end if
end if
Now, as to what is happening - only Microsoft knows for sure (and in some circles, that may be debateable), but ...
When you click on another control, or tab to the next control, that control causes the validation event of the previous control to be fired.
Since the cancel parameter is set to true, the focus remains with the previous control and nothing else happens.
If the Cancel event were to remain false, then the lost_focus and got_focus events of the two corresponding controls would be fired.
Good Luck