martes, 19 de febrero de 2013

Separar nombres y apellidos II

Antes de nada voy a explicar como se maneja esta herramienta. Este libro tiene dos hojas, una de ellas (hoja "Nombres") contiene los nombres  mas habituales, sin acento y otra con la relación de nombres completos a separar (hoja "Personal"). Su uso es tan fácil como:

  • Habilitar macros.
  • Eliminar las líneas usadas anteriormente en la hoja Personal. Eliminarlas, no borrarlas.
  • Copiar en la columna D de la hoja personal la lista de los nombres completos.
  • Si fuese necesario hay que eliminar los dobles espacios.
  • Realizar el proceso automático.
  • Realizar el proceso manual.
  • La búsqueda de nombres se basa en la lista de nombres. Si Se  añaden nuevos nombres a la lista de la hoja Nombres esta búsqueda mejora. No es necesario ni ordenarla ni que solo aparezca solo una vez cada nombre, se pueden repetir. Los nombres se deben añadir sin acento. 

He logrado encontrar un algoritmo que me permite separar nombre y apellidos de manera automática. No todos, calculo que quizás no encuentre bien menos 10% de los nombres, o no los encuentra o los encuentra mal, pero encuentra mas del 90%.
Los apellidos simples los encuentra todos si el nombre no es compuesto y casi todos si el nombre es compuesto.
Los apellidos compuestos, algunos de ellos para saber como van hay que hablar con el sujeto en cuestión, creo que tiene un acierto mayor al 80%. El resto hay que resolverlos a mano.
Mi algoritmo está pensado para nombres compuestos de hasta cuatro palabras, dos nombres y dos partículas, del tipo "María de las Mercedes". Este algoritmo no contempla un nombre compuesto de mas de dos nombres. De los apellidos compuestos solo estudio dos  palabras, para saber si son partículas. 
Recordemos que en la composición de nombres y apellidos, en algunas de sus opciones, no se dan certezas, se dan casos mas probables.

Para nombres:
  • He recopilado los 380 nombres mas comunes en España. En este caso necesito saber si una palabra esta incluida en la relación de nombres.
  • Cuento el número de palabras del texto con el nombre y apellidos. Para que uno de esos textos tenga un nombre compuesto o un apellido compuesto debe tener mas de tres palabras. 
  • Si tiene tres palabras, la primera es el nombre, la segunda es el primer apellido y la tercera es el segundo apellido. Las separaciones las indican el primer y segundo espacio del texto.
  • Si tiene cuatro puede tener un nombre compuesto de dos palabras (José María), la primera y la segunda palabra. Hay que comprobar si esa segunda palabra está en la relación de nombres. Si lo esta la separación entre el nombre, en este caso compuesto, es el segundo espacio, si no es el primero.
  • Si tiene cinco puede tener un nombre compuesto de tres  palabras, dos nombres y una partícula (María del Carmen). Si la segunda palabra es nombre se aplica el anterior punto. Si no es nombre lo supongo partícula y compruebo que la tercera palabra sea nombre. Debería comprobar que la segunda palabra fuese una partícula pero, con estos niveles de error, da un poco lo mismo. Además el algoritmo está pensado para funciones Excel no para programación, lo que multiplicaría por mil las funciones anidadas. Si la tercera palabra es nombre la separación es el tercer espacio. Si no, el primero.
  • Si tiene séis puede tener un nombre compuesto de cuatro  palabras, dos nombres y dos partícula (María de las Mercedes). Si la segunda palabra es nombre se aplica lo dicho en puntos anteriores. Si no es nombre lo supongo partícula y compruebo que la tercera palabra sea nombre, como en el anterior punto. Si la cuarta palabra es nombre  la separación es el cuarto espacio. Si no, el primero.

Resumiendo: 

  • Si el texto tiene  cuatro o mas palabras (>=4) y la segunda palabra es nombre la separación la da el segundo espacio.
  • Si el texto tiene  cinco o mas palabras (>=5) y la segunda palabra es una partícula y la tercera es nombre la separación la da el tercer espacio.
  • Si el texto tiene  seis o mas  palabras (>=6) y la segunda palabra es una partícula y la tercera es nombre la separación la da el cuarto espacio espacio.
  • En todos los demás casos la separación la da el primer espacio.


El formulón que resuelve este algoritmo es:

=SI(P1<=3;1;SI(Y(NO(ESNOD(COINCIDIR(J1;Nom;0)));P1>=4);2;SI(Y(NO(ESNOD(COINCIDIR(K1;Nom;0)));P1>=5);3;SI(Y(NO(ESNOD(COINCIDIR(L1;Nom;0)));P1>=6);4;1))))

En Donde:

  •  P1 (columna P) es el número de palabras del texto original.
  • J1 (columna J) es la segunda palabra, K1 la tercera y L1 la cuarta.
  • El rango con nombre Nom es =Nombres!$A:$A
  • Durante la fase de desarrollo separé las palabras del texto mediante la opción "Texto en Columnas". El número de palabras la calculé con =SI(L1="";3;SI(M1="";4;SI(N1="";5;SI(O1="";6;7))))
Podía haber separado mediante una fórmula similar los apellidos, pero dado que es realmente farragoso y que además es un trabajo dedicado a mi esposa, ella lo va a utilizar, decidí pasarme a la programación.

Para apellidos estudio las tres palabras siguientes al nombre o nombre compuesto encontrado. Los casos encontrados y su respuesta mas probable son:

  • Si primera de estas palabras es partícula y la segunda no (Del Corral) la separación se produce dos espacios después del nombre.
  • Si esas dos palabras son partículas (De la Parra) la separación es tres espacios después del nombre.
  • Si después del nombre hay cuatro o mas palabras y ninguna de las tres primeras es una partícula la separación se produce dos espacios después del nombre.
  • Si después del nombre hay cuatro o mas palabras y la primera no es partícula, la segunda si y la tercera no la separación se produce tres espacios después del nombre.
  • En todos los demás casos la separación se produce un espacio después del nombre.
Las partículas que considero son: "de" , "del" , "la" , "los" , "las", "a", "as", "o", "os", "y", "i", "do" , "dos", "van", "den", "san" 







viernes, 8 de febrero de 2013

Como crear nuestras propias funciones en Excel.

En alguno de los ejemplos anteriores he expuesto algunas funciones anidadas realmente complejas. Si nos encontramos con un caso de estos, funciones complejas, situaciones difíciles de calcular con las funciones propias de Excel, podemos crear con VBasic nuestras propias funciones.
En programación una función es una subrutina que devuelve un valor. En VBasic estas subrutinas se utilizan:

  • Function NombreFunción(Parametro1,parametro2,....)
  • operaciones necesarias para obtener el resultado
  • NombreFunción=resultado
  • end function
Para utilizar estas funciones hacemos como con las funciones propias de Excel, nos situamos en lacelda correspondiente y escribimos =NombreFunción(Param1;Param2;....)

Como ejemplo:

Function XCart(Dist, Rumbo)

XCart = Dist * Sin(3.14159265358979 * Rumbo / 180)

End Function

Esta función pasa los grados sexagesimales del parámetro Rumbo a radianes y calcula la el valor de la proyección del parámetro Dist en función del seno del rumbo.

Para utilizarla dentro de una hoja de cálculo, situándonos en la celda correspondiente:
=xcart(F3;I3)

jueves, 7 de febrero de 2013

Subrutina o Subprograma.


  • En computación, una subrutina o subprograma (también llamada procedimiento, función o rutina), como idea general, se presenta como un subalgoritmo que forma parte del algoritmo principal, el cual permite resolver una tarea específica. Algunos lenguajes de programación, como Visual Basic .NET o Fortran, utilizan el nombre función para referirse a subrutinas que devuelven un valor.
  • Se le llama subrutina a un segmento de codigo separado del bloque principal y que puede ser invocado en cualquier momento desde este o desde otra subrutina.
  • Las subrutinas permiten realizar separadamente del programa principal determinadas tareas repetitivas. Normalmente para utilizarlas es necesario pasarles unas variables de trabajo (parametros).
  • Las subrutinas facilitan la estructuración del programa. Cuando el programa principal llama a una subrutina para que ésta se ejecute, la subrutina procesa su programa hasta el final. El sistema retorna luego el control al segmento del programa principal desde donde se llamó a la subrutina.
  • Las subrutinas sirven para estructurar o dividir el programa en bloques más pequeños y, por tanto, más fáciles de gestionar. Los bloques más pequeños facilitan la comprobación y la eliminación de errores tanto en las subrutinas como en el programa entero.
  • Básicamente una Subrutina es un segmento de código que se escribe sólo una vez pero puede invocarse o ejecutarse muchas veces. Existen dos tipos: Procedimientos y Funciones.
  • Procedimientos: Son un tipo de subrutina que ejecuta un conjunto de acciones sin devolver valor alguno como resultado de dichas operaciones. 
  •  Funciones: A diferencia de los procedimientos, las funciones después de ejecutar un conjunto de acciones devuelven sólo un valor del tipo usado en la declaración de ésta.




lunes, 4 de febrero de 2013

Comprobar la existencia de una hoja.

Al trabajar con VBasic muchas veces necesitamos utilizar una hoja, que puede que no exista, que hay que añadir, o puede que ya exista, con lo que no hay que crearla. Una manera de gestionar este tipo de asuntos es gestionar los errores que puedan producirse. La gestión de errores al  intentar utilizar una hoja, si no existe, nos da un error (<>0) y si existe nos da una ausencia de error (0), lo que de una manera simple nos permite saber si una hoja existe o no. Conocido el error o la ausencia de este procedemos a crear la hoja, si fuera necesario.
En VBasic hay una primera función para controlar los errores, la función Err. Esta función devuelve un valor numérico. Si no se produce un error devuelve cero y dependiendo del error, un número distinto de cero. Por otra parte los errores en tiempo de ejecución detienen el proceso. Para evitar que el proceso se detenga al aparecer un error utilizamos la instrucción On Error Resume Next. Debemos recoger el error inmediatamente después de producirse, en la siguiente instrucción, E = Err. Al terminar la gestión del error debemos activar de nuevo la detención de la ejecución al producirse un error, mediante On Error Goto 0.
En esta rutina además de comprobar la existencia de la hoja, en caso de que no exista, la crea.


Sub Comprueba(Hoja)

On Error Resume Next

Set h = Sheets(Hoja)

E = Err

On Error GoTo 0

If E <> 0 Then

Sheets.Add.Name = Hoja 

End If

End Sub 
Preparamos la gestión.


Provocamos el error.

Guardamos el error en una
 variable.
Reactivamos la detención.

Si el error es distinto de

cero.
Añadimos una hoja.