miércoles, 31 de agosto de 2011

Sustitución en Excel de claves extrañas por su concepto original

Problema.
Es que deveras. La gente piensa que las máquinas eran como antes. Antes el asunto era la memoria, entonces las máquinas tenían muy poco que dar. Hoy las máquinas tienen tanta memoria que es absurdo estar ahorrando espacio. Por ejemplo, antes era necesario algo asi:

Nombre Grado  Sueldo
Juan        L         1

QUe significaba, Juan de grado licenciado gana mil.

Ahora las máquinas aguantan hasta abusos, por ejemplo:

NombreDelEmpleado                               UltimoNivelDeEstudios                                    SueldoDevengado
Juan de Rivera de los Santos y Maza       Licenciatura inconclusa con ganas de superarse  1,234.83

Pues regresando al asunto del último post, la misma base tiene un ahorro de memoria que no nos favorece:



En la columna B vemos el título Pob y luego clasificaciones como L, C, ZM, todas estas significan lo siguiente:

ZM Zona metropolitana
M    MUnicipal
L      Localidad
C      Conurbación
CI     Conurbación interestatal

No tiene sentido estar ahorrando espacio, sobre todo si lo que ganamos en espacio lo perdemos en estructura, porque la gente piensa que una hoja de cálculo no incluye una base de datos, entonces abajo le pone comentarios y toda la cosa, por ejemplo en este caso ,desafortunadamente real:


Las anotaciones del renglón 781 para abajo rompen la estructura de base, ¿no sería mejor que tuvieramos el dato completo?

Solución:
La solución es simple, como siempre que usamos macros, sólo que tardada si se trata de mucha información. 

Queremos que la lista del tipo:
1 Z
1 M
1 M
2 L
3L

Etc. Aparezca como:
1 Zona Metropolitana
1 MUnicipal
1 Municipal
2 Localidad
3 Localidad

Etcétera. 
Bien, lo que hay que hacer es repetir el proceso del post anterior en cuanto a la grabación de macros y bajar una casilla para posterirmente deterner la grabación. Luego meteremos el código y quedará así (recuerda que comentaremos adelante de una comilla, y la comilla significa que se ignora el comentario, por lo que puedes meter el código también con comentarios:
------------------------------------
Sub Macro2()  ' aquí no debes confundir la sub macro2() con el subcomandante marcos :)
'
' Macro2 Macro
'
For N = 1 To 780                  'Como hay 780 renglones a corregir, decimos que haremos un ciclo de 1 a 780, todo lo que esté entre For y next, será repetido

Valor = ActiveCell.Value   ' Nuevamente, la celda donde se comienza mete su valor a la variable "Valor"

'

Select Case Valor    'La instrucción case, nos dice que la variable podrá tener muchos valores que se detallan a continuación del comando

Case "ZM"                    'hay un primer caso en que ZM debe ser convertido a "Zona Metropolitana"
NuevoValor = "Zona Metropolitana"   'Se asigna el valor

Case "M"                     'Y así con todas
NuevoValor = "Municipal"

Case "L"
NuevoValor = "Localidad"

Case "C"
NuevoValor = "Conurbada"

Case "CI"
NuevoValor = "Conurbada Interestatal"

End Select

ActiveCell.Value = NuevoValor   ' ahora, el nuevo valor que fue transformado se asigna a una nueva variable

    ActiveCell.Offset(1, 0).Range("A1").Select   'se baja un renglon

Next   'y asi más de 700 veces

End Sub    ' se acabó

--------------------------------------

El resultado queda así:





Podrá decir alguien: "ay eso yo lo hago con un if". Y sí, tiene razón. si en una columna se coloca la instrucción "=SI(B2="ZM","Zona Metropolitana", si(B2="M","Municipal", si(B2="C","Conurbado",si(B2="Conurbación interesatatal", si(B2="L",Localidad",""))))

 Luego se copiaría según valor y ya. Sin embargo, la macro es mucho más versatil. Cuando haya no 5 valores sino por ejemplo, 200, un if no sería posible en algunas versiones restringidas a 250 caracteres. Además cualquier error, ocasionaría serios problemas. 

Otra ventaja de resolver este asunto con macros es que puedo usar las macros para otras tareas relacionadas, por ejemplo, si quiero cambiar ahora la tercer columna que tiene "pes" y "ces" por "Principal" y "Complementaria", simplemente lo sustituyo de tal manera y queda el programa así:


Sub Macro2()
' Macro2 Macro
For N = 1 To 780
Valor = ActiveCell.Value
Select Case Valor
Case "P"
NuevoValor = "Principal"
Case "C"
NuevoValor = "Complementario"
End Select
ActiveCell.Value = NuevoValor
    ActiveCell.Offset(1, 0).Range("A1").Select
Next
End Sub


Y así sin esfuerzo, una vez hecha la macro puedo ir arreglando toto más fácil dejando el asunto así:


Una ventaja adicional es que se siente muy bonito cuando la máquina está trabajando y nosotros aprovechamos para ir a tomarnos un café. O un té, pues.

Otra opción que alguien más elemental dirá, será la de sustituir con el comando replace. Cierto que es más fácil el if que aprender macros, pero es todavía más fácil capturarlo y más aún no hacerle nada. Lo tardado es otro asunto. 

No hay comentarios:

Publicar un comentario