Homogeneización de códigos

La consulta que quería dejar planteada es un poco complicada y de momento no tengo tantos conocimientos como para solventarla. El problema en cuestión es que no se como emular en Excel o access un proceso que efectúa un sistema que usamos y que me es necesario trasladar a una de estas dos herramientas. Explico:
Este sistema hace un proceso de "paso a través" por así llamarlo en el que un código se va depurando hasta llegar a otro código (sería una homogeneización de códigos), es decir, yo tengo un listado de códigos asociados a otro.
Código de paso Código final
4567891 90
45678912 89
5346849 91
53468495 93
5631976 94
56319767 92
Resulta que tengo unos códigos de origen, los cuáles necesariamente se tienen que identificar con el código de paso para obtener el código final. Hasta aquí parece que un simple buscar lo solucionaría, pero... El problema es que los códigos de origen no coinciden con el código de paso en el número de caracteres. Un ejemplo: si nosotros nos encontramos con un código de origen que fuese el 45678911005277, el primer código que iría buscando en la columna código de paso sería el mismo (45678911005277), como no lo va a encontrar iría a buscar el 4567891100527(va eliminando cifras por la derecha), luego sería el 456789110052, 45678911005, 4567891100... Así hasta la primera coincidencia que sería el 4567891, al que le asignaría el código final de 90. Otro ejemplos:
Código origen Código de paso Código final
4567891145 4567891 90
456789124597 45678912 91
45678910 4567891 90
456 45 95
45 4 100
Todo esto lo he "medio conseguido" combinado las funciones izquierda con largo y luego mediante buscar, pero me vale para un número de códigos limitados y para un número de caracteres limitados, por no deciros el peso que le imprimiría al archivo. Con lo cual su viabilidad tiende a ser escasa.
Ruego ayuda de alguien que sepa alguna manera de agilizar el proceso(función, VBA...). La manera que tiene el sistema de hacerlo es mediante SQL(pero el proceso es imposible de reproducir en Access) Sé que es complicado.

2 respuestas

Respuesta
1
Creo que entendí la situación, a continuación copio un código de una función para el VBA que espero te sirva.
Debo aclararte que el código debes ajustarlo a tu planilla, las consideraciones que tomé son las siguientes:
- Tomé como referencia la tabla de código de paso y código final de tu pregunta (la primera de las dos tablas). Esta tabla la copié (incluido el cabezal) desde la celda A1, por ese motivo cuando en el código hace referencia a la celda A2 es que va al primer código de paso.
- El proceso esta diseñado para ser disparado desde una celda en blanco, en la cual se copiará el código final. El código de origen buscado debería estar en la celda de la izquierda. (Ej: en C14 el cod origen y D14 celda en blanco).
Copio el código:
...
'Defino las variables
Dim Cod As String
Dim LargoCod As Integer
Dim Rango As String
Dim CodFinal
Dim Fusible1 As Boolean
Dim Fusible2 As Boolean
Dim NoResultado As Boolean
'Inicializo variables
Cod = ActiveCell.Offset(0, -1).Value
LargoCod = Len(ActiveCell.Offset(0, -1))
Rango = ActiveCell.Address
Fusible1 = False
Fusible2 = False
NoResultado = True
Do While LargoCod > 0 And Fusible1 = False
Range("A2").Select
  'Comienzo a recorrer lista de Codigo de paso
  Do While ActiveCell <> "" And Fusible2 = False
       'Si hay coincidencias copio Codigo Final y termino el bucle
       If ActiveCell.Value = Cod Then
          Range(Rango).Value = ActiveCell.Offset(0, 1).Value
          Fusible2 = True
          Fusible1 = True
          NoResultado = False
       End If
       ActiveCell.Offset(1, 0).Select
  Loop
  'Si no hay coincidencia elimino el caracter de la izquierda
  If Fusible1 = False Then
     Cod = Left(Cod, LargoCod - 1)
     LargoCod = Len(Cod)
  End If
Loop
If NoResultado = True Then
  MsgBox ("No se encontró código final")
End If
...
Tiene buena pinta, mañana lo probaré por que ahora me es imposible. Muchas gracias
Una pregunta, el código se dispara desde una celda, para cambiarlo tendreé que substituir el Cod = ActiveCell por un Range, ¿no? ¿Es qué es una ristra muy larga de códigos la que hay que traducir cada vez... sería esto posible?
Si, debes modificar un poco el código para que encuadre en tu planilla. Por ejemplo como bien dices Activecell por Range("..") o Cells(.,.), siempre y cuando esto sea necesario.
Otra cosa a modificar es la ubicación del primer Código de Paso, en el caso de la rutina anterior es la celda A2 y además se considera que el Código Final se encuentra una columna la derecha.
La rutina que te pasé es para encontrar un Código Final, pero puede hacerse que se repita muchas veces, para ello se debe colocar dentro de alguna instrucción While o For que recorra todos los Código Origen que se quieran evaluar. Por supuesto que si se hace esto por las dudas debe reverse la forma de llamar a las celdas (Activecell, Range, etc). Pero te recomiendo que primero veas si la rutina es correcta para un Código Origen, si esto es así vemos de repetirlo varias veces.
Tengo problemas con el archivo. ¿Te importaría que te lo enviase? Debo estar espeso por ser lunes... un saludo
No hay problema, envíamelo a [email protected] cuéntame que problema tienes y que es lo que quieres, es decir que debería hacer la planilla.
La verdad es que si que tarda un rato... y cuando le incluyo el resto de cosas, un más, no obstante me sirve de ayuda para aquellos sitios(que tengo localizados) en los que el mero operador lookup no me servía por la duplicidad. Muchas gracias por todo. Un saludo
Respuesta
1
Supongo que tienes 2 tablas (podemos llamarlas Origen y Paso), una con codorigen y otra con codpaso y codfinal. Entramos en diseño de consultas y mostramos las dos tablas, pero no unimos ningún campo. Ahora mostramos los tres campos y debajo de codorigen, justo al lado de criterios: ponemos la expresión:
like [codpaso] & '*'
Y ya lo tienes. Si los campos no se llaman así, ¿evidentemente deberás poner el nombre correspondiente ok?.
Muchas gracias smanero, la verdad es que la respuesta me ha dejado un poco frío en el sentido de que después de todo lo que he intentado, la solución sea tan simple...(y que no se me haya ocurrido). También lo ataqué desde excel... y no es lo mismo. Pero bueno, agradezco mucho tu respuesta que es buena y vamos a ver como lo podemos implantar en forma de base de datos.
Muchas gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas