Programación

Vamos a analizar distintos códigos de VBA para Office y poder sacarles el máximo rendimineto.

Separar en Sílabas

Separar en Sílabas

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.

habilitar macros

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).

Modulos Separar Sílabas

#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

Reglas separar silabas

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

formula silabica

Palabras de Ejemplos

Palabras Separar Sílabas

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)

frase: la frase a separar en sus silabas (o la celda que la contiene)
divpal: el carácter para dividir las silabas de cada palabra (por omisión: "-")
invpal: [0/<>0 | verdadero/falso] para invertir las silabas de la palabra (por omisión: falso)
divfra: el carácter para dividir las palabras en la frase (por omisión: " ")
invfra: [0/<>0 | verdadero/falso] para invertir las palabras en la frase (por omisión: falso)
Los ejemplos en el rango [E35:E39]
[E35] una farse como ejemplo: => esta frase contiene varias palabras
[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

Separar palabras y frases en sílabas

Descarga del Archivo de ejemplo para pruebas:

 Separar Silabas (44.8 kB)

 

Imprimir