Ver Mensaje Individual
  #10 (permalink)  
Antiguo 14/11/2011, 14:53
Avatar de erbuson
erbuson
 
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Problemas con Visual Basic con Excel

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 original
  1. Private Function CodigoControl(CodigoBase As Integer) As String
  2.   ' Funcion reutilizable que calcula y devuelve el código de Control
  3.  Dim N1 As Integer, N2 As Integer, acumulador As Integer, x As Integer
  4.   Dim codicontrol As Integer, xifra As Integer
  5.  
  6.   N1 = Int(NS / 100)
  7.   N2 = NS - (N1 * 100)
  8.   ' o bien N2 = NS Mod 100    'Ya que Mod devuelve rel resto de una division entera
  9.  
  10.   ' acumulador = 0
  11.  ' No Hace Falta porque al hacer el DIM ya toma el Valor 0
  12.  
  13.   For x = 1 To N2 Step 1
  14.     acumulador = acumulador + x
  15.   Next
  16.  
  17.   N2 = acumulador * N1 * 13411
  18.   codicontrol = (N2 / 9 - Int(N2 / 9)) * 9
  19.   xifra = (N2 / 31 - Int(N2 / 31)) * 31
  20.  
  21.   If xifra < 10 Then
  22.     lletra = "A"
  23.   ElseIf xifra >= 10 Or xifra < 19 Then
  24.     lletra = "B"
  25.   Else
  26.     lletra = "C"
  27.   End If
  28.  
  29.   CodigoControl = codicontrol & lletra
  30.   ' No es necesario Int(codicontrol) porque ya es entero
  31. 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
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...