Mayúsculas, minúsculas y palabras compuesta o con separadores en Access

Tengo una pequeña base de datos de uso personal y encontré este código realizado por Jacinto Trillo que cumple a la perfección con lo que deseo ( poner la primera letra en mayúscula de cada palabra y las demás en minúsculas respetando determinadas reglas ortográficas), pero me surge un pequeño problemilla y es que si escribo algo así PLÁSTICO/ACERO me gustaría que me devolviese Plástico/Acero y no Plástico/acero, los separadores podrían ser "/" ó "-". Obviamente podría modificar el separador para que dejase un espacio después (Texto = Replace(Texto, "/", "/ ")pero quedaría un poco chapuza

El código

Option Compare Database

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 = "?" Or FinPalabra = "/") Then

Alerta = True

End If

Next I

PrimeraLetraMayuscula = Join(Cadenas)

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

Llamaremos al modulo como queramos, por ejemplo Primera­_Mayuscula, y después tendremos que llamar la función desde el cuadro de texto en la que queramos que se ejecute por ejemplo si el cuadro de texto se llamase “Color” pondríamos en el evento “Despues de Actualizar” el siguiente código

Private Sub Color_AfterUpdate()

Me.Color = PrimeraLetraMayuscula(Me.Color)

End Sub

2 respuestas

Respuesta
2

Con permiso de Jacinto, con tu "idea chapuza" puedes modificar fácilmente la función para que te quede como quieres, solo has de usar replace() dos veces, una al principio para añadirle los espacios antes y después y otra al final de la función para quitarlos (te pongo en negrita las lineas nuevas dónde deberías añadirlas):

Public Function PrimeraLetraMayuscula(ByVal Texto As String) As String

....

NumPalabra = 0

Texto=Replace(Texto,"/"," / ")

Cadenas = Split(Texto)

....

PrimeraLetraMayuscula = Join(Cadenas)

PrimeraLetraMayuscula =Replace(PrimeraLetraMayuscula ," / ","/")

End Function 

Como ves, ibas bien encaminado...

Un saludo.


Respuesta

Supongamos que tengo una tabla(fíjate en el campo NombreCompañia)

Y tengo un formulario al que para que puedas verlo bien le añado un cuadro de texto llamado Texto 16

Verás que madera lo pone con mayúscula

La f de... igual

Emparedados y Helados también

El código es simplemente

Lo que hace es que si en el nombre hubiera una barra divide el nombre en dos cadenas, pone en mayúscula cada una y vuelve a unirlas.

En tu caso, donde pone texto 16 bastaría con que pusieras Nombrecompañia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas