Primera letra mayúscula de cada palabra

Quisiera poner la primera letra en mayúscula de cada palabra y las demás en minúsculas pero sin tener en cuenta, símbolos, números, guiones, signos de exclamación, interrogación etc. Lo intenté con Strvconv(campo, vbpropercase) pero no sirve para lo que necesito.

He encontrado en internet una función excelente del maestro Eduardo Olaz que hace exactamente lo que quiero con las excepciones que digo, pero solo lo realiza en la primera letra de la primera palabra de la cadena y no en las restantes palabras.

Me gustaría adaptar esta función para que hago lo mismo en todas las palabras de la cadena.

La función a adaptar a lo que necesito sería ésta:

Public Function PrimeraLetraMayuscula(ByVal Cadena As String) As String
Dim lngPrimeraLetra
Dim i As Long
Dim bytCaracter As Byte
'Ponemos la cadena a minúsculas
Cadena = LCase(Cadena)
'Buscamos la primera letra
For i = 1 To Len(Cadena)
bytCaracter = Asc(Mid(Cadena, i, 1))
Select Case bytCaracter
' Si el carácter es una letra en minúscula
Case 97 To 122, 154, 156, 158, 224 To 246, 249 To 255
PrimeraLetraMayuscula = Left(Cadena, i - 1) _
& UCase(Chr$(bytCaracter)) _
& Mid(Cadena, i + 1)
Exit Function
End Select
Next i
PrimeraLetraMayuscula = Cadena
End Function

1 respuesta

Respuesta
1

Por el Texto de tupregunta deduzco que lo que buscas es una función que te ponga en Mayusculas los : Nombre, Apellidos.

Esta Función que te adjunto no recuerdo de donde la saqué:

Public Function NombrePropio(ByVal texto As String) As String
'Pone en Mayúscula la Primera letra del Nombre, Apellido1, ....... ect.
Dim Cadenas() As String
Dim I As Long
Dim StrPalabra As String

Cadenas = Split(texto)

For I = 0 To UBound(Cadenas)
StrPalabra = Cadenas(I)
StrPalabra = UCase(Left(StrPalabra, 1)) & LCase(Mid(StrPalabra, 2))
If I > 0 Then
If Len(StrPalabra) < 3 Then
StrPalabra = LCase(StrPalabra)
Else
Select Case StrPalabra
Case "Del", "Las", "Los", "Con"
StrPalabra = LCase(StrPalabra)
End Select
End If
End If
Cadenas(I) = StrPalabra
Next I

NombrePropio = Join(Cadenas)

End Function

Para llamar la Función puedes hacerlo desde el AfterUpdate de un TextBox, por Ejemplo si el TextBox tiene el Nombre de "NombreFormateado"

Private Sub NombreFormateado_AfterUpdate()
Me.NombreFormateado = NombrePropio(Me.NombreFormateado)
End Sub

Gracias por la ayuda Jacinto  pero no era lo que estaba buscando... Es cierto que la función que propones pone la primera letra en mayúscula de cada palabra pero tiene en cuenta números, guiones, signos etc. si son primera letra.

Es decir, si yo tengo "¿quien eres" como cadena devolverá = ¿quien Eres? y como hay un interrogante como primera letra no pone en mayúscula la Q de quien.

Por eso puse:

"Quisiera poner la primera letra en mayúscula de cada palabra y las demás en minúsculas pero sin tener en cuenta, símbolos, números, guiones, signos de exclamación, interrogación etc. "

y que me gustaría adaptar la función de Eduardo Olaz que SI obvia los números, guiones, signos, etc. si son primera letra.

Lo que pasa es que solo me pone la primera letra de la primera palabra en mayúscula y me gustaría adaptarla para que pusiera la primera letra de cada palabra de la cadena en mayúsculas sin tener en cuenta, obviando si es primera letra, los guiones, números, símbolos y signos.

La función que quiero usar y adaptar a lo que necesito sería ésta:

Public Function PrimeraLetraMayuscula(ByVal Cadena As String) As String
Dim lngPrimeraLetra
Dim i As Long
Dim bytCaracter As Byte
'Ponemos la cadena a minúsculas
Cadena = LCase(Cadena)
'Buscamos la primera letra
For i = 1 To Len(Cadena)
bytCaracter = Asc(Mid(Cadena, i, 1))
Select Case bytCaracter
' Si el carácter es una letra en minúscula
Case 97 To 122, 154, 156, 158, 224 To 246, 249 To 255
PrimeraLetraMayuscula = Left(Cadena, i - 1) _
& UCase(Chr$(bytCaracter)) _
& Mid(Cadena, i + 1)
Exit Function
End Select
Next i
PrimeraLetraMayuscula = Cadena
End Function

Gracias por tu interés y a ver si alguien más puede proponerme la solución para adaptar este código para que ponga en mayúscula la primera letra de cada palabra obviando guiones, signos, números, etc.

Gracias

Aunque lo citabas claro, pasé por alto el Texto que señalabas en Negrita de :

Pero sin tener en cuenta...

Prueba ésta Función MODIFICADA y creo que te funcionará.

Yo la he probado con unas cuantas frases y responde a lo esperado.

Public Function PrimeraLetraMayuscula(ByVal Texto As String) As String
'Pone en Mayúscula la Primera letra de cada palabra en un Texto
Dim Cadenas() As String
Dim I As Long, K As Long
Dim BytCaracter As Byte
Dim StrPalabra As String

Cadenas = Split(Texto)

For I = 0 To UBound(Cadenas)
StrPalabra = Cadenas(I)
StrPalabra = LCase(StrPalabra)
For K = 1 To Len(StrPalabra)
BytCaracter = Asc(Mid(StrPalabra, K, 1))
Select Case BytCaracter
'Si el carácter es una letra en minúscula
Case 97 To 122, 154, 156, 158, 224 To 246, 249 To 255
StrPalabra = Left(StrPalabra, K - 1) & UCase(Chr$(BytCaracter)) & LCase(Mid(StrPalabra, K + 1))
Exit For
End Select
Next K
Cadenas(I) = StrPalabra
Next I

PrimeraLetraMayuscula = Join(Cadenas)

End Function 'PrimeraLetraMayuscula(ByVal Texto As String) As String

Hola

Muchísimas gracias Jacinto por la ayuda. El código que me enviaste funciona a la perfección. Mil gracias.

Si no es mucho pedir sería posible que las palabras (de, del, el, la, los, la, lo, y) en caso de ser palabras, tampoco se pudieran poner en mayúsculas, estuvieran en minúsculas, salvo cuando son la primera palabra de la cadena de texto. En ese caso sí se pondrían en mayúsculas.

Ejemplo de lo que busco:

"el viejo y el mar" obtendríamos "El Viejo y el Mar"

Aquí "y" "el"  van en minúsculas salvo el primer "el" que como está en el inicio de cadena iría en mayúsculas.

Gracias por tu respuesta y a ver si con estas otras excepciones finalizaría la pregunta.

Con las notas que me has enviado, he vuelto a modificar la Función PrimeraLetraMayuscula... que queda así:

Public Function PrimeraLetraMayuscula(ByVal Texto As String) As String
'Pone en Mayúscula la Primera letra de cada palabra en un Texto, teniendo en cuenta caracteres especiales
Dim Cadenas() As String
Dim I As Long, K As Long
Dim NumPalabra As Integer 'Variable que me servirá como contador de Palabras
Dim BytCaracter As Byte
Dim StrPalabra As String

NumPalabra = 0
Cadenas = Split(Texto)

For I = 0 To UBound(Cadenas)
StrPalabra = Cadenas(I)
StrPalabra = LCase(StrPalabra)
'Cada vez sumo uno, para aprovecharlo en el Próximo >> If NumPalabra..........
NumPalabra = NumPalabra + 1
For K = 1 To Len(StrPalabra)
'Si el Numero de la Palabra es mayor que la Primera
If NumPalabra > 1 Then
'Si tiene uno de los Textos citados, salta sin hacer nada
Select Case StrPalabra
'En ésta línea y con el formato que hay se pueden añadir otras palabras y quedarán excluidas de la conversión
Case "de", "del", "el", "la", "las", "lo", "los", "o", "que", "y"
Exit For
End Select
End If
BytCaracter = Asc(Mid(StrPalabra, K, 1))
Select Case BytCaracter
'Si el carácter es una letra en minúscula
Case 97 To 122, 154, 156, 158, 224 To 246, 249 To 255
StrPalabra = Left(StrPalabra, K - 1) & UCase(Chr$(BytCaracter)) & LCase(Mid(StrPalabra, K + 1))
Exit For
End Select
Next K
Cadenas(I) = StrPalabra
Next I

PrimeraLetraMayuscula = Join(Cadenas)

End Function 'PrimeraLetraMayuscula(ByVal Texto As String) As String

La he probado con el Texto: "el viejo y el mar" y algún otro y Funciona.

En las "Palabras a excluir" verás que hay : Case "de", "el"... etc.

En esa línea de código puedes añadir alguna otra que necesites y a mi me haya pasado por alto, o quitar...

Ya me contarás

Hola

Funciona muy bien pero se nos ha pasado por alto (bueno a mí) una cosa como regla de ortografía a la hora de los títulos.

Ahora el código tiene en cuenta las excepciones (Case "de", "del", "el", "la", "las", "lo", "los", "o", "que", "y") para no ponerlas en mayúsculas nunca, si están en medio de la cadena de texto... Hasta ahora todo perfecto.

Lo que pasa que a nivel ortográfico si estas palabras están después de signos de cierre de exclamación, interrogación (!?) o puntos suspensivos o punto (dejando un espacio después del signo) deberían ir en mayúsculas incluso estas excepciones. Solo faltaría esto para cuadrar el código.

O sea que si no van detrás de estos signos concretos (dejando un espacio) entonces sí las mantendríamos como excepciones y las dejaríamos en minúsculas pero en caso contrario no.

Cuando digo signos de exclamación, interrogación me refiero solo a los de cierre "!?"

Ejemplo:

"¡buenas noches y buena suerte!"  debería quedar...

"¡Buenas Noches y Buena Suerte!" (la "y" en minúscula como dijimos)

pero si la cadena de texto es así...

"¡buenas noches! y buena suerte!"  debería quedar

"¡Buenas Noches! Y Buena Suerte!" (la "Y" en mayúscula porque va detras del ! (dejando espacio entre "!" y la siguiente letra)

Otro ejemplo:

"hola de nuevo aquí"   debería quedar

"Hola de Nuevo Aquí"

pero

"hola. de nuevo aquí"  debería quedar

"Hola. De Nuevo Aquí"

Pero esto solo debe ocurrir con las excepciones que hemos puesto si van seguidaS de estos signos concretos de cierre (! ?) de exclamación, interrogación o puntos suspensivos o punto. Si van después por ejemplo de una coma se mantienen las excepciones que teníamos siempre.

o sea

"la vida, la juventud"   debería quedar

"La Vida, la Juventud" (la excepcion "la" no va seguido de "!"  "?"  "..."   "."

Aquí como va después de una coma se mantienen las excepciones.

Perdona por todo y por tu paciencia. Espero haberme excplicado bien

Gracias de nuevo por tu tiempo. (Por cierto me hago seguidor tuyo desde ya)

Déjame unos días y a ver hasta donde llego.

Ok gracias

En realidad y para simplificar el "rollo" que te he soltado, en definitiva es:

Dejar en minúsculas las excepciones (Case "de", "del", "el", "la", "las", "lo", "los", "o", "que", "y") si están en medio de la cadena de texto (que es como está ahora la función) pero si van después de un signo de cierre de exclamación, interrogación, o después de puntos suspensivos o punto (dejando un espacio tipo "! "), solo en esos casos poner las excepciones en mayúsculas.

Creo que las frases últimas que te puse de ejemplo pueden servirte para testar el posible código.

A la espera de tu respuesta, gracias de nuevo y un saludo.

DePro":

Espero que ésta Función Remodificada cubra tus necesidades.

Ya me contarás.

Si en otra ocasión puedo ayudarte y se hacerlo, lo haré con gusto.

Yo lo poco que sé lo he ido aprendiendo siguiendo a esas personas que de modo desinteresado dedican su tiempo y esfuerzo a ayudar a los demás:

Aquí va el Código.

Public Function PrimeraLetraMayuscula(ByVal Texto As String) As String
'Pone en Mayúscula la Primera letra de cada palabra en un Texto, teniendo en cuenta caracteres especiales
Dim Cadenas() As String
Dim BytCaracter As Byte

Dim I As Long, K As Long
Dim Alerta As Boolean
Dim NumPalabra As Integer
Dim StrPalabra As String, FinPalabra As String

NumPalabra = 0

Cadenas = Split(Texto)

For I = 0 To UBound(Cadenas)
StrPalabra = Cadenas(I)
StrPalabra = LCase(StrPalabra)
'Cada vez sumo uno, para aprovecharlo en el Próximo >> If NumPalabra..........
NumPalabra = NumPalabra + 1
For K = 1 To Len(StrPalabra)
'Si el Numero de la Palabra es mayor que la Primera
If NumPalabra > 1 Then
If Alerta = True Then
'No hacemos nada
Else
'Si tiene uno de los Textos citados, salta sin hacer nada
Select Case StrPalabra
'En ésta líne se pueden añadir otras palabras y quedarán excluidas de la conversión
Case "de", "del", "el", "la", "las", "lo", "los", "o", "que", "y"
Exit For
End Select
End If
End If
BytCaracter = Asc(Mid(StrPalabra, K, 1))
Select Case BytCaracter
'Si el carácter es una letra en minúscula
Case 97 To 122, 154, 156, 158, 224 To 246, 249 To 255
StrPalabra = Left(StrPalabra, K - 1) & UCase(Chr$(BytCaracter)) & LCase(Mid(StrPalabra, K + 1))
Alerta = False
Exit For
End Select
Next K
Cadenas(I) = StrPalabra
FinPalabra = Right(StrPalabra, 1)
'En ésta línea se pueden añadir otros Caracteres de Alerta
If (FinPalabra = "." Or FinPalabra = ":" Or FinPalabra = "!" Or FinPalabra = "?") Then
Alerta = True
End If
Next I

PrimeraLetraMayuscula = Join(Cadenas)

End Function 'PrimeraLetraMayuscula(ByVal Texto As String) As String

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas