Hola, ya que los has pedido, en base a tu ejemplo, te voy a dar un par de consejos.
En primer lugar, el código en su gran mayoría es correcto pero debe desgranarse en dos partes.
En primer lugar, deberías crear una Funcion que te devuelva el código de control correspondiente a un número de Socio, que podría ser por ejemplo algo así. Es tu código con ligeras modificaciones que te he comentado.
Código vb:
Ver originalPrivate Function CodigoControl(CodigoBase As Integer) As String
' Funcion reutilizable que calcula y devuelve el código de Control
Dim N1 As Integer, N2 As Integer, acumulador As Integer, x As Integer
Dim codicontrol As Integer, xifra As Integer
N1 = Int(NS / 100)
N2 = NS - (N1 * 100)
' o bien N2 = NS Mod 100 'Ya que Mod devuelve rel resto de una division entera
' acumulador = 0
' No Hace Falta porque al hacer el DIM ya toma el Valor 0
For x = 1 To N2 Step 1
acumulador = acumulador + x
Next
N2 = acumulador * N1 * 13411
codicontrol = (N2 / 9 - Int(N2 / 9)) * 9
xifra = (N2 / 31 - Int(N2 / 31)) * 31
If xifra < 10 Then
lletra = "A"
ElseIf xifra >= 10 Or xifra < 19 Then
lletra = "B"
Else
lletra = "C"
End If
CodigoControl = codicontrol & lletra
' No es necesario Int(codicontrol) porque ya es entero
End Function
De este modo tienes un Funcion que puedes llamr desde donde te convenga ya que lo que no tiene sentido es en tu programa generar el código y verificar al mismo tiempo, cabe pensar que la idea es que cuando se asigna el código a un socio se le indica en numero nnnn?? donde ?? es el código de control que se le asigna al mismo.
Cuando en tu código indicas:
If NS < 1001 Then
MsgBox ("Introduce un número superior a 1001")
' Aqui debes salir de la Sub porque no puedes hacer el cálculo.
Exit Sub
End If
Esta funcion, en tu caso puedes llamarla de la siguiente manera:
Range("F3").Value = Range("F3").Value & CodigoControl(Range("F2").Value)
Por otra parte, se supone que cuando se introduzca en alguna celda el dato completo del socio nnnn??, debes verificar si se ha introducido correctamente de una manera mas o menos así, suponiendo que se introduzca en "H5"
NS = Left$(Range("H5").Value, 4)
IF Right$(Range("H5").Value, 2) <> CodigoControl(NS) Then
Msgbox "Numero de Socio Erróneo"
Else
Msgbox "Numero de Socio Correcto")
End If
Creo que es un poco la idea, aunque te haya destrozado algo tu código, si quieres comentar algo más, por aqui estaré.
Saludos