Excel - función hallar y extraer

Por favor necesito extraer de una celda los nombres y apellidos y colocarlos en otra celda vacía.
¿Cómo puedo aplicar la función de extraer y hallar? (En bold está lo que deseo extraer)
Por ejemplo:
En A1 tengo
Transferencia de: 2043 0066 Marcos Costa Graciano Donativo - Nif 65900888J
En A20 tengo
Ingreso en efectivo en suc 0049 0229 de Ronald Portalupi Antunes Sanz en concepto de compra biblioteca
Gracias por la ayuda

1 respuesta

Respuesta
1
No es función, es una macro, para hacer un función es más complicado.
Sub hjasdfadf()
Dim textonegrita As String
'Activecell: donde está el texto a EXTRAER
For i = 1 To Len(ActiveCell)
If ActiveCell.Characters(Start:=i, Length:=1).Font.FontStyle = "Negrita" Then
Exit For
End If
Next i
'i almacena el inicio del texto en Negrita
For j = i To Len(ActiveCell)
If Not ActiveCell.Characters(Start:=j, Length:=1).Font.FontStyle = "Negrita" Then
Exit For
End If
Next j
'j almacana el inicio del texto normal, despues del fin del texto negrita
textonegrita = Trim(Mid(ActiveCell, i, j - i))
MsgBox textonegrita
End Sub
Disculpa no pude leer antes tu respuesta por tener mucho trabajo.
Pero 1º en negrita lo puse yo para que supieras el texto que quiero extraer pero en el excel original no viene en negrita. El estilo del texto es todo igual. Sin negrita
2º Luego cómo puedo crear una macro en el excel que tengo.
Disculpa pero soy una novata en excel.
Si puedes dime paso a paso como hacer
Muchas gracias
mmm... si así es, la cosa está difícil.
Porque no se me ocurre cómo el código pueda reconocer cuándo una palabra es un nombre propio o un apellido.
Si la inicial de cada nombre y de cada apellido está en mayúsculas, y si el nombre de la persona es de mínimo dos palabras, continuas una de la otra, es decir, separadas por espacios, como lo pones en el ejemplo; y no habiendo otras dos palabras diferentes al nombre, seguidas, y que tengan también las iniciales en mayúsculas, podría crearte un código que extraiga esas palabras.
¿Te sirve así?
En el original el nombre y los apellidos son todos en MAYÚSCULAS.
Si la cosa está difícil y es como me viene la información del banco, que luego todos los meses tengo el trabajo de una a una cortar y pegar en otro sitio esta información.
Si el original viene con todas las letras del nombre en mayúsculas, es muchísimo más fácil, te haré entonces un código que extraiga todas las "PALABRAS CONTINUAS UNAS DE LAS OTRAS" que tengan todas sus letras en mayúsculas.
¿Necesitas convertir también el NOMBRE COMPLETO todo a minúsculas con sólo la primera en mayúscula?
(¿Nombre Completo)?
Si, en otra columna lo convierto con la función de Nombrepropio, para que quede el nombre completo con solamente la primera con Mayúsculas.
Gracias por tu ayuda
Macro que extrae nombre en MAYÚSCULAS de la celda activa
NOta: sólo se toman en cuenta las letras de la A a la Z en mayúsculas y también la Ñ. No se están tomando en cuenta vocales con tildes o demás caracteres.
Sub hjasdfadf()
Dim Asd As Integer
Dim ConteoLetrasCapitales As Integer
Dim ConteoEspacios As Integer
Dim Inicio As Integer
Dim Fin As Integer
Dim NumeroMinimoDeLetrasEnElNombre As Integer
Dim NumeroMinimoDeEspaciosEnElNombre As Integer
Dim Nombre As String
Dim temp As String
NumeroMinimoDeLetrasEnElNombre = 4
NumeroMinimoDeEspaciosEnElNombre = 1
'For para recorrer los caracteres de la celda
For i = 1 To Len(ActiveCell)
If (Asc(Mid(ActiveCell, i, 1)) >= 64 And Asc(Mid(ActiveCell, i, 1)) <= 90) Or Asc(Mid(ActiveCell, i, 1)) = 165 Then
    If Inicio = 0 Then Inicio = i
    ConteoLetrasCapitales = ConteoLetrasCapitales + 1
ElseIf Asc(Mid(ActiveCell, i, 1)) = 32 And ConteoLetrasCapitales <> 0 Then
    ConteoEspacios = ConteoEspacios + 1
Else
    If ConteoLetrasCapitales >= NumeroMinimoDeLetrasEnElNombre And ConteoEspacios >= NumeroMinimoDeEspaciosEnElNombre Then
        Fin = i - 1
        Exit For
    Else
        ConteoLetrasCapitales = 0
        ConteoEspacios = 0
        Inicio = 0
        Fin = 0
    End If
End If
Next
'_______________________________________________
'IF de control
If Inicio <> 0 And Fin < Inicio Then Fin = Len(ActiveCell)
'_____________
'Pasando a Tipo Titulo
Nombre = LCase(Trim(Mid(ActiveCell, Inicio, Fin - Inicio + 1)))
temp = UCase(Mid(Nombre, 1, 1))
For i = 2 To Len(Nombre)
If Mid(Nombre, i, 1) = " " Then
    temp = temp & " " & UCase(Mid(Nombre, i + 1, 1))
    i = i + 1
Else
    temp = temp & Mid(Nombre, i, 1)
End If
Next
Nombre = temp
'________________________
MsgBox Nombre
End Sub
'Perfeccionando:
'Olvida lo que te dije de las tildes y demás caracteres
'Esta versión simplemente los salta y sólo se fija en las letras del alfabeto.
Sub hjasdfadf()
Dim Asd As Integer
Dim ConteoLetrasCapitales As Integer
Dim ConteoEspacios As Integer
Dim Inicio As Integer
Dim Fin As Integer
Dim NumeroMinimoDeLetrasEnElNombre As Integer
Dim NumeroMinimoDeEspaciosEnElNombre As Integer
Dim Nombre As String
Dim temp As String
NumeroMinimoDeLetrasEnElNombre = 4
NumeroMinimoDeEspaciosEnElNombre = 1
'For para recorrer los caracteres de la celda
For i = 1 To Len(ActiveCell)
Salta:
If (Asc(Mid(ActiveCell, i, 1)) >= 64 And Asc(Mid(ActiveCell, i, 1)) <= 90) Or Asc(Mid(ActiveCell, i, 1)) = 165 Then
    If Inicio = 0 Then Inicio = i
    ConteoLetrasCapitales = ConteoLetrasCapitales + 1
ElseIf Asc(Mid(ActiveCell, i, 1)) = 32 And ConteoLetrasCapitales <> 0 Then
    ConteoEspacios = ConteoEspacios + 1
ElseIf (Asc(Mid(ActiveCell, i, 1)) < 65 Or Asc(Mid(ActiveCell, i, 1)) > 90) And (Asc(Mid(ActiveCell, i, 1)) < 97 Or Asc(Mid(ActiveCell, i, 1)) > 122) Then
i = i + 1
    GoTo Salta
Else
    If ConteoLetrasCapitales >= NumeroMinimoDeLetrasEnElNombre And ConteoEspacios >= NumeroMinimoDeEspaciosEnElNombre Then
        Fin = i - 1
        Exit For
    Else
        ConteoLetrasCapitales = 0
        ConteoEspacios = 0
        Inicio = 0
        Fin = 0
    End If
End If
Next
'_______________________________________________
'IF de control
If Inicio <> 0 And Fin < Inicio Then Fin = Len(ActiveCell)
'_____________
'Pasando a Tipo Titulo
Nombre = LCase(Trim(Mid(ActiveCell, Inicio, Fin - Inicio + 1)))
temp = UCase(Mid(Nombre, 1, 1))
For i = 2 To Len(Nombre)
If Mid(Nombre, i, 1) = " " Then
    temp = temp & " " & UCase(Mid(Nombre, i + 1, 1))
    i = i + 1
Else
    temp = temp & Mid(Nombre, i, 1)
End If
Next
Nombre = temp
'________________________
MsgBox Nombre
End Sub
Para probarlo mi duda:
¿Cómo agrego esta macro en mi hoja de excel?
¿Tengo qué colocarme un una celda vacía? Y luego ¿cómo coloco esta macro?
Disculpa mi ignorancia
1. Selecciona la columna que contiene los nombres y para copiarla a un libro nuevo.
2. Pégala en la columna A del libro nuevo.
3. Presiona Alt+F11
4. En el explorador que muestra al lado izquierdo da clic derecho sobre "ThisWorkBook"(el que corresponde al libro nuevo), y selecciona insertar-modulo
5. A la hoja en blanco que te apareció al lado derecho, pega el código siguiente:
Private Sub asd()
Dim asd As Integer
Dim ConteoLetrasCapitales As Integer
Dim ConteoEspacios As Integer
Dim Inicio As Integer
Dim Fin As Integer
Dim NumeroMinimoDeLetrasEnElNombre As Integer
Dim NumeroMinimoDeEspaciosEnElNombre As Integer
Dim Nombre As String
Dim temp As String
NumeroMinimoDeLetrasEnElNombre = 4
NumeroMinimoDeEspaciosEnElNombre = 1
'For para recorrer los caracteres de la celda
For i = 1 To Len(ActiveCell)
Salta:
If (Asc(Mid(ActiveCell, i, 1)) >= 64 And Asc(Mid(ActiveCell, i, 1)) <= 90) Or Asc(Mid(ActiveCell, i, 1)) = 165 Then
    If Inicio = 0 Then Inicio = i
    ConteoLetrasCapitales = ConteoLetrasCapitales + 1
ElseIf Asc(Mid(ActiveCell, i, 1)) = 32 And ConteoLetrasCapitales <> 0 Then
    ConteoEspacios = ConteoEspacios + 1
ElseIf (Asc(Mid(ActiveCell, i, 1)) < 65 Or Asc(Mid(ActiveCell, i, 1)) > 90) And (Asc(Mid(ActiveCell, i, 1)) < 97 Or Asc(Mid(ActiveCell, i, 1)) > 122) Then
i = i + 1
    GoTo Salta
Else
    If ConteoLetrasCapitales >= NumeroMinimoDeLetrasEnElNombre And ConteoEspacios >= NumeroMinimoDeEspaciosEnElNombre Then
        Fin = i - 1
        Exit For
    Else
        ConteoLetrasCapitales = 0
        ConteoEspacios = 0
        Inicio = 0
        Fin = 0
    End If
End If
Next
'_______________________________________________
'IF de control
If Inicio <> 0 And Fin < Inicio Then Fin = Len(ActiveCell)
'_____________
'Pasando a Tipo Titulo
Nombre = LCase(Trim(Mid(ActiveCell, Inicio, Fin - Inicio + 1)))
temp = UCase(Mid(Nombre, 1, 1))
For i = 2 To Len(Nombre)
If Mid(Nombre, i, 1) = " " Then
    temp = temp & " " & UCase(Mid(Nombre, i + 1, 1))
    i = i + 1
Else
    temp = temp & Mid(Nombre, i, 1)
End If
Next
Nombre = temp
'________________________
ActiveCell.Offset(0, 1) = Nombre
End Sub
Sub EXTRAERNOMBRES()
Application.ScreenUpdating = False
 While ActiveCell <> ""
    Application.Run "asd"
    ActiveCell.Offset(1, 0).Select
 Wend
Range("a1").Select
End Sub
6. Ya puedes cerrar esa aplicación de "Microsoft Visual basic" donde pegaste el código.
7. Pásate al libro nuevo, y selecciona la primera celda donde pegaste los nombres, es decir, selecciona A1.
8. Ve al menú VISTA (el último ícono) MACROS, busca la macro EXTRAERNOMBRES, selecciónala y da clic en ejecutar.
9. Finalizar la pregunta y puntuar excelente. :)
Disculpa me olvide de comentarte que trabajo con excel 2007. Es un poco diferente
Voy a probar si encuentro todo y te comento que tal
Esas instrucciones son para 2007
Realicé los pasos que tu me indicas y me da error: argumento o llamada a procedimiento no valida
entrando en el modulo está señalado con amarillo lo siguiente:
If (Asc(Mid(ActiveCell, i, 1)) >= 64 And Asc(Mid(ActiveCell, i, 1)) <= 90) Or Asc(Mid(ActiveCell, i, 1)) = 165 Then
A mí me sale perfectamente en el archivo de prueba, descárgalo y pruébalo:
http://rapidshare.com/files/315365483/EXTRAER_NOMBRE.xlsm.html
Si te sigue saliendo error, pruébalo con este:
http://rapidshare.com/files/315366925/EXTRAER_NOMBRE-.xlsm.html
Solamente ahora pude descargar los dos ficheros pues tuve que pagar para descargarlos.
Los voy a probar y ya te comentaré
Te pido disculpas por todo el trabajo de estos días y tu ayuda, pues tengo un problema:
Al final mi hermana (por la cual hago todo esto) ahora me dice que la información viene toda con letra mayúsculas.
Ahora que todo funcionaba, pues probé tu excel y funcionó, me dice esto.
Te pregunto: ¿Es muy difícil o imposible extraer los nombres: JOSEFA RAMONA PORTALUPI PEDRO y el otro nombre abajo: MARÍA AURORA CHAVEZ?
Transferencia de Josefa ramona portalupi pedro, concepto do nativo.
Ingreso en efectivo en suc.0049 2439 de ong ayuda al anciano en concepto de maría aurora chavez
Si es imposible, me lo dices y disculpa la molestia que te cause
No te preocupes, todo lo que creo lo guardo, siempre alguien lo ha necesitado, incluyéndome.
Te contesto: así la cosa es prácticamente imposible, porque estaríamos hablando de inteligencia artificial, un código que piense como nosotros y que comprenda cuáles palabras son NOMBRES, cuáles APELLIDOS, cuáles ARTÍCULOS, SUSTANTIVOS, etc etc etc.
Lamento no poder ayudarte, pero como decía, algún día este código le servirá a alguien.
Si, realmente tu código esta perfecto y para otros casos seguro sirve un montón.
Pienso como tú, que es casi imposible por eso te decía lo de la función de Hallar y extraer como indica microsoft pero es tan complicado que todavía no conseguí.
Lástima que los bancos no faciliten el trabajo de los contables. Pues al exportar el cuaderno 43 vienen todos los datos de la forma que yo te indiqué.
Lo que obliga a todos los meses limpiar a mano todos los ingresos e transferencias para después poderlos importar al programa contable Logoconta.
Gracias igualmente por tu trabajo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas