Separar en Silabas

Separar en Sílabas
Excel

En el artículo de hoy os mostraremos dos algoritmos realizados en Excel, para separar en sílabas. Estas sílabas son la segunda unidad más pequeña de nuestra lengua, la primera unidad mínima es la letra para la lengua escrita y el fonema para la lengua hablada. Cuando se juntan estas unidades entre sí, forman las sílabas que son la parte más fundamental de la palabra.
Algoritmo de Héctor Miguel Orozco Díaz ( Con 49 líneas de código VBA para Separar Palabras o frases completas y 54 Líneas de código VBA para Separar palabras de Forma Invertida)
Algoritmo de Adrian Colazo (usuario de los foros Exceluciones, con 295 líneas de código VBA para Separar Palabras).
El archivo Excel de ejemplo que podéis descargaros al final del artículo, está organizado de la siguiente manera:
Hay que habilitar las macros para que el archivo funcione correctamente. Pudiendo utilizar este archivo en todas sus versiones de Excel.
Módulos de código con las funciones. En el Módulo [ hmod ], están agregadas 2 funciones "emergentes" por si se usan en excel-97 (VBA5).

#If Not VBA6 Then
Function Replace(ByVal Texto As String, ByVal Busca As String, Reemplaza As String) As Variant: Replace = Application.Substitute(Texto, Busca, Reemplaza): End Function
Function Split(ByVal Cadena As String, Optional Delimitador As String = " ") As Variant: Split = Evaluate("{""" & Application.Substitute(Cadena, Delimitador, """,""") & """}"): End Function
#End If
Columna A:
Algunas reglas

Fórmula silábica (ataque, núcleo, coda)
[http://es.wikipedia.org/wiki/Sílaba]

Palabras de Ejemplos

Columna C
Separación de las palabras en Sílabas, función de Adrian.
=Silabas(B3)
Columna D
Esta columna lleva la cuenta de las sílabas que tiene la palabra: =ContarPalabras(B3)
Function ContarPalabras(Texto, Optional sep As String = " ") ContarPalabras = UBound(Split(Texto, sep)) - (LBound(Split(Texto, sep)) = 0) End Function
Columna E
En esta columna esta la función que realiza la separación de palabras en sílabas, pudiendo tomar los siguientes argumentos (y sus resultados):
=Silabeado(palabra,divide,invertido)
- palabra: (requerido) el texto (o celda que lo contiene) con la palabra a "silabear"
- divide: (opcional) el caracter que se usara en la "salida" de la palabra silabeada (por omision: "-")
- invertido:
[0/<>0 | verdadero/falso] para invertir las silabas de la palabra (por omision: falso)
Codigo VBA:
Function Silabeado(palabra As String, Optional divide As String = "-", Optional invertido As Boolean = False) As String
If Len(palabra) < 3 Then Silabeado = palabra: Exit Function
Dim fue As String, pre As String, sep As String, prefijo As String, coma As String, sufijo As String, n As Integer, reversa: fue = LCase(palabra): pre = Limpia(fue): sep = "": prefijo = "": coma = "": sufijo = ""
If Right(pre, 1) Like resp Then coma = Right(pre, 1): fue = Left(fue, Len(fue) - 1): pre = Left(pre, Len(pre) - 1)
If Right(pre, 1) Like conso Then sufijo = Right(fue, 1): fue = Left(fue, Len(fue) - 1): pre = Left(pre, Len(pre) - 1)
If Left(pre, 3) = "sub" Then If Mid(pre, 4, 1) Like vocal And Len(pre) > 6 And Mid(pre, 4, 5) <> "iendo" Then fue = Mid(fue, 4): pre = Mid(pre, 4): prefijo = "sub" & guion
Sig:
If Len(fue) < 2 Then sep = sep & fue: GoTo Fin
If Left(pre, 1) Like vocal Then
If Tong3(Left(pre, 5)) And Not Tong2(Mid(pre, 4, 2)) Then sep = sep & Left(fue, 5): fue = Mid(fue, 6): pre = Mid(pre, 6): GoTo Sig
If Tong3(Left(pre, 4)) And Not Tong2(Mid(pre, 4, 2)) Then sep = sep & Left(fue, 4): fue = Mid(fue, 5): pre = Mid(pre, 5): GoTo Sig
If Tong3(Left(pre, 3)) And Not Tong2(Mid(pre, 4, 2)) Then sep = sep & Left(fue, 3): fue = Mid(fue, 4): pre = Mid(pre, 4): GoTo Sig
If Tong3(Left(pre, 3)) Then sep = sep & Left(fue, 3) & guion: fue = Mid(fue, 4): pre = Mid(pre, 4): GoTo Sig
If Tong2(Left(pre, 3)) And Not Tong2(Mid(pre, 3, 2)) Then sep = sep & Left(fue, 3): fue = Mid(fue, 4): pre = Mid(pre, 4): GoTo Sig
If Tong2(Left(pre, 2)) And Tong3(Mid(pre, 3, 3)) Then sep = sep & Left(fue, 2) & guion: fue = Mid(fue, 3): pre = Mid(pre, 3): GoTo Sig
If Tong2(Left(pre, 2)) And Tong2(Mid(pre, 2, 2)) Then sep = sep & Left(fue, 1) & guion & Mid(pre, 2, 2): fue = Mid(fue, 4): pre = Mid(pre, 4): GoTo Sig
If Tong2(Left(pre, 2)) Then sep = sep & Left(fue, 2) & IIf(Mid(pre, 3, 1) Like vocal, guion, ""): fue = Mid(fue, 3): pre = Mid(pre, 3): GoTo Sig
If Hiato(Left(pre, 2)) Then sep = sep & Left(fue, 1) & guion: fue = Mid(fue, 2): pre = Mid(pre, 2): GoTo Sig
sep = sep & Left(fue, 1): fue = Mid(fue, 2): pre = Mid(pre, 2): GoTo Sig
Else
If Gcon4(Left(pre, 4)) Then sep = sep & Left(fue, 2) & guion & Mid(fue, 3, 2): fue = Mid(fue, 5): pre = Mid(pre, 5): GoTo Sig
If Gcon3(Left(pre, 3)) And Not GconD(Mid(pre, 2, 2)) And Not GconB(Mid(pre, 2, 2)) Then sep = sep & Left(fue, 2) & guion & Mid(fue, 3, 1): fue = Mid(fue, 4): pre = Mid(pre, 4): GoTo Sig
If Gcon3(Left(pre, 3)) And GconD(Mid(pre, 2, 2)) Or GconB(Mid(pre, 2, 2)) Then sep = sep & Left(fue, 1) & guion & Mid(fue, 2, 2): fue = Mid(fue, 4): pre = Mid(pre, 4): GoTo Sig
If GconB(Left(pre, 2)) Or GconD(Left(pre, 2)) Then sep = sep & IIf(Len(sep), guion, "") & Left(fue, 2): fue = Mid(fue, 3): pre = Mid(pre, 3): GoTo Sig
If Gcon2(Left(pre, 2)) Then sep = sep & Left(fue, 1) & guion & Mid(fue, 2, 1): fue = Mid(fue, 3): pre = Mid(pre, 3): GoTo Sig
sep = sep & IIf(Len(sep), guion, "") & Left(fue, 1): fue = Mid(fue, 2): pre = Mid(pre, 2): GoTo Sig
End If
Fin:
If invertido Then
reversa = Split(sep, guion): sep = reversa(UBound(reversa)) & sufijo
For n = UBound(reversa) - 1 To LBound(reversa) Step -1: sep = sep & IIf(sep <> "", guion, "") & reversa(n): Next
Silabeado = coma & Replace(sep & IIf(prefijo <> "", "-sub", ""), guion, divide)
Else: Silabeado = Replace(prefijo & sep & sufijo, guion, divide) & coma
End If
End Function
Columna F
Esta columna lleva la cuenta de las sílabas que tienen las palabras, utilizando la función [ Function ContarPalabras ]
Columna G
En esta columna se realiza la separación inversa utilizando la [Function Silabeado]
Rango [E35:E39]
= FraseSilabeada(frase,divpal,invpal,divfra,invfra)
[E36] =FraseSilabeada(E35) => es-ta fra-se con-tie-ne va-rias pa-la-bras
[E37] =FraseSilabeada(E35,,1) => ta-es se-fra ne-tie-con rias-va bras-la-pa
[E38] =FraseSilabeada(E35,,,,1) => pa-la-bras va-rias con-tie-ne fra-se es-ta
[E38] =FraseSilabeada(E35,,1,,1) => bras-la-pa rias-va ne-tie-con se-fra ta-es

- Por último sólo os queda probar el artículo y aplicarlo a vuestras necesidades... No hagáis mal uso de los conocimientos que se os ofrecen


Descarga del Archivo de ejemplo para pruebas:
Separar Silabas (