Convertir primera letra en mayúscula con excepciones Macros Excel

Siempre he tenido una curiosidad y es que Excel tiene una formula llamada NOMPROPIO que me pone la primera letra de cada Palabra, articulo, conector, etc en mayúscula. Sin embargo, no creo que sea correcta la formula ya que solo debería ejecutarse para las Palabras y no para los conectores, me explico con un ejemplo:

Mi texto: La papa se encuentra en mucha demanda que refleja crecimiento.

Con NOMPROPIO: La Papa Se Encuentra En Mucha Demanda Que Refleja Crecimiento.

Lo ideal: La Papa se Encuentra en Mucha Demanda que Refleja Crecimiento.

Como pueden observar lo ideal desde mi punto de vista seria lo correcto, pero esto tiene otra complejidad, ya que los conectores sombreados también se pueden ubicar al principio de un texto y en esos casos si tendría que ponerme la primera letra en mayúscula, es decir:

Mi texto: se tiene claro la responsabilidad de las autoridades.

Lo ideal: Se Tiene Claro la Responsabilidad de las Autoridades.

Mi pregunta es, se podría crear una macro que tenga las siguientes condiciones:

Poner la primera letra en mayúscula si:

  • Es diferente de "se, la, que, en" (Teniendo en cuenta que yo pueda agregar en la macro otros conectores mas delante para que sea mas completo)
  • Que si algún conector de la lista anterior se encuentra al inicio del texto, entonces que si se ponga le primera letra mayúscula si no seria minúscula.

2 respuestas

Respuesta
2

Aquí otra función a considerar.

Function ConvPalabras(pal As String) As String
  Dim tx As Variant, c As String
  Dim f As Range, i As Long
  '
  tx = Split(pal & " |", " ")
  c = WorksheetFunction.Proper(tx(0)) & " "
  For i = 1 To UBound(tx)
    Set f = Range("D:D").Find(tx(i), , xlValues, xlWhole, , , False)
    If f Is Nothing Then c = c & WorksheetFunction.Proper(tx(i)) & " " Else c = c & tx(i) & " "
  Next
  If c <> "" Then ConvPalabras = Left(c, Len(c) - 3)
End Function

Resultado:


Sigue las Instrucciones para una Función

  1. Abre tu libro de excel
  2. Para abrir VBA y poder pegar la función, Presiona Alt + F11
  3. En el menú elige Insertar / Módulo
  4. En el panel del lado derecho copia la función
  5. En cualquier celda utiliza la función, como cualquier otra función de excel

Hola Señor buenas tardes,

Estoy probando la formula pero el resultado es igual al NOMPROPIO.

Adicionalmente, seria posible ingresar dentro del código los conectores que quiero que sean validados para que no se convierta la primera letra en mayúscula. Es decir, algo así como un array de los conectores que quiero evaluar, y que yo vaya aumentando los conectores para ir mejorando el código. Cumpliendo la condición que si algún conector se ubica al inicio del texto entonces allí si aplicaría la primera letra mayúscula.

Perdona, debes poner las palabras en la columna D, como se muestra en la imagen, los resultados son los esperados.

Si lo quieres en el código:

Function ConvPal(pal As String) As String
  Dim tx As Variant, c As String, arr As Variant
  Dim i As Long, x As Variant
  '
  arr = Array("SE", "la", "que", "en", "el", "los", "las")
  tx = Split(pal & " |", " ")
  c = WorksheetFunction.Proper(tx(0)) & " "
  For i = 1 To UBound(tx)
    x = Application.Match(tx(i), arr, 0)
    If IsError(x) Then c = c & WorksheetFunction.Proper(tx(i)) & " " Else c = c & tx(i) & " "
  Next
  If c <> "" Then ConvPal = Left(c, Len(c) - 3)
End Function

¡Muchas Gracias señor Dante! Es un sueño hecho realidad :). Voy a estudiar bien su código para ver como lo hizo, es impresionante.

Respuesta
1

He realizado esto que espero te sirva.

Option Explicit
Public Function superNOMPROPIO(celda As Range) As String
'@dj.vivanco'
    Dim texto As String, ufLista As Long
    Dim lista As Variant, primera As String, sunPrimera As String
    texto = celda.Value
    ufLista = Range("D" & Rows.Count).End(xlUp).Row
    lista = Range("D2:D" & ufLista)
    texto = StrConv(texto, vbProperCase)
    texto = replaceIt(texto, lista)
    primera = UCase(Left(texto, 1))
    sunPrimera = Right(texto, Len(texto) - 1)
    superNOMPROPIO = primera & sunPrimera
End Function
Private Function replaceIt(texto, lista) As String
'@dj.vivanco'
    Dim x As Integer, val As String, valu As String
    For x = 1 To UBound(lista)
        valu = StrConv(lista(x, 1), vbProperCase)
        val = LCase(lista(x, 1))
        texto = Replace(texto, valu, val)
    Next x
    replaceIt = texto
End Function

Hola Señor buenas tardes,

Ante todo muchas gracias por sus respuestas. He revisado su código pero no me esta convirtiendo la primera letra en mayúscula de algunas palabras.

En la siguiente oración no pone el codigo no funciona en las palabras: encuentra, mucha y refleja.

Adicionalmente, seria posible que la lista se encuentre dentro del código y no en Excel.

Muchas Gracias

Siento no haber respondido antes. Efectivamente envía ese error ya que la función REPLACE reemplaza por substring, es decir, "en" y "encuesta" reemplaza ambas "en", no lo vi bien. De todas maneras la respuesta de Dante es espectacular, poco código y al grano.

Reparé mi código y hace lo mismo, pero ahora bien, je je. Un saludo a todos!

Public Function superNOMPROPIO(celda As String) As String
'@dj.vivanco'
    Dim stexto As String, pal As String, newpal As String
    Dim alista As Variant, aSeparado As Variant
    Dim i As Integer, u As Integer
    alista = Array("la", "es", "de", "en", "y")
    aSeparado = Split(StrConv(celda, vbProperCase))
    For i = 0 To UBound(aSeparado)
        pal = aSeparado(i)
        For u = 0 To UBound(alista)
            If StrComp(pal, alista(u), vbTextCompare) = 0 Then pal = LCase(pal)
        Next u
        newpal = Trim(newpal & " " & pal)
    Next i
    superNOMPROPIO = UCase(Left(newpal, 1)) & Right(newpal, Len(newpal) - 1)
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas