** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Extraer letras en una cadena en access
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Extraer letras en una cadena en access

 Responder Responder
Autor
Mensaje
chalogonza Ver desplegable
Nuevo
Nuevo


Unido: 07/Noviembre/2023
Localización: Cádiz
Estado: Sin conexión
Puntos: 1
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita chalogonza Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Extraer letras en una cadena en access
    Enviado: 07/Noviembre/2023 a las 22:18
Buenas noches, estoy haciendo una base de datos en access de mi biblioteca particular, y para poder imprimir los tejuelos tengo que extraer del título las tres primeras letras del mismo, eso no tendría problema en hacerlo, pero cuando el título comienza con un artículo la cosa se me complica y no soy capaz de hacerlo. Os pongo un ejemplo para que veáis qué es lo que quiero hacer en una consulta:
por ejemplo yo tengo un libro que se titula La verdad sobre la arena, la consulta me tendía que devolver "ver"; o si en el caso de que no tenga artículo también me tiene que devolver las tres primeras letras del título, por ejemplo: Visión de noche, el resultado tiene que ser "vis". Muchas gracias, os lo agradeceré siempre.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14646
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Noviembre/2023 a las 22:34
Hola,

En una consulta complicado ya que es difícil controlar todas las cadenas de texto que deben considerarse artículo. 
Yo me plantearía un cambio de estrategia para tener un segundo campo de búsqueda dónde almacenar el título con el artículo al final: "verdad sobre la arena, La"

Si sigues empeñado en ese planteamiento solo se me ocurre utilizar una función VBA que realice ese cambio. En la función le pasas el título y dentro colocas todas las cadenas posibles de inicio con artículo y realizas la sustitución por "". Devuelves el libro sin artículo al inicio y haces el "match" contra ese campo calculado.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5943
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Noviembre/2023 a las 19:56

¿Tal vez excluyendo espacios?


La verdad sobre la…    Lav

Visión de noche        Vis

El amante japonés      Ela

Legado en los huesos   Leg

Vestido de novia       Ves

El silencio de la…     Els


=IZQUIERDA(SUSTITUIR(A2;" ";"");3)

Estas son funciones integradas en Excel (¿Las tiene Access?).



Saludos desde Tenerife.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13867
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Noviembre/2023 a las 23:08
Publicado originalmente por AnSanVal AnSanVal escribió:

=IZQUIERDA(SUSTITUIR(A2;" ";"");3)

Estas son funciones integradas en Excel (¿Las tiene Access?).


Si, un saludo Antonio.

Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1491
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Noviembre/2023 a las 22:52
Otra posibilidad con expresiones regulares:

1. En un módulo estándar de VBA copia y pega esta función:

Public Function Tejuelo(TituloLibro) As String
    Dim re As Object    'VBScript.RegExp
    Dim s As String
    
    If IsNull(TituloLibro) Then
        'Si nos pasan un dato nulo, devolvemos una cadena vacía
        Tejuelo = vbNullString
    Else
        'Creamos el objeto
        Set re = New RegExp
        
        With re
            .Multiline = False  'No nos interesan los retornos de carro
            .IgnoreCase = True  'Nos da igual las mayúsculas y minúsculas
            .Global = False     'Alcance global. No sé bien que es, pero queda bien
            
            'Lo que hay que buscar:
            '^ indica que buscamos al principio del texto
            '(...) indica que se busca lo que hay dentro
            '| es el operador OR: o el, o la, o ...
            '\s indica que después debe haber un espacio
            .Pattern = "^(el|la|lo|los|las|un|una|unos|unas)\s"
            
            'Intentamos cambiar el artículo por una cadena vacía
            'Si no encuentra nada, devuelve el texto completo
            s = .Replace(TituloLibro, "")
            
            'Y devolvemos las 3 primeras letras en mayúscula
            Tejuelo = UCase(Left(s, 3))
        End With
        
        'Liberamos memoria
        Set re = Nothing
    End If
End Function

2. Basándonos en la lista de libros de AnSanVal, creamos una tabla de nombre Libros:

Libros
Libro
El amante japonés
El silencio de la…
La verdad sobre la arena
Legado en los huesos
Vestido de novia
Visión de noche

3. Y si creamos una consulta basada en esa tabla, y con la función que hemos creado:

SELECT Libros.Libro, Tejuelo([Libro]) AS Tejuelo
FROM Libros;

El resultado es:

Consulta1
Libro Tejuelo
El amante japonés AMA
El silencio de la… SIL
La verdad sobre la arena VER
Legado en los huesos LEG
Vestido de novia VES
Visión de noche VIS

En la función no he puesto las contracciones (al, del) porque no sé si interesan, pero es fácil agregarlas.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5943
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita AnSanVal Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 16/Noviembre/2023 a las 12:13

Pensé en tejuelos personales/simples (mi error fue no leer con calma la consulta).Confused

Tambien existen artículos indefinidos, palabras de menos de 3 letras, etc.


Suelo utilizar un truco (similar al aporte de Xavi), invisible, para dividir una cadena de texto (por ejemplo: nombre apellido1 apellido2) donde el espacio después de nombre en vez de un espacio (carácter 32) pongo un falso espacio (carácter 160), se ven iguales pero informáticamente son diferentes...



Una parte de mi par
Y amaneció lloviendo ama
Ni un paso atrás pas
Con la muerte en los… mue
Si me dices que no dic
Al final del arcoiris fin
Unos pasos detrás de el pas
¿Y tú que miras? mir


... la fórmula es:  =EXTRAE(titulo;HALLAR(CARACTER(160);titulo)+1;3)     (En Excel:  =EXTRAE(A1;HALLAR(CARACTER(160);A1)+1;3))




Saludos desde Tenerife.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable