Tu blog sobre Excel. Email.

Te escribo privadamente porque la dirección de correo que aparece en tu blog no funciona.

Te pego mi correo:

Hola Dante,

Hace un par de semanas contestaste muy amablemente a una pregunta mía en todo expertos: “Cadenas en Excel. Extraer datos”. Hoy, cuando estaba revisando de nuevo tu contestación he ido a tu perfil y de ahí a tu blog, donde he encontrado tu email.

Realmente creo que tus macros podrían ayudarme enormemente en lo que hago. Lo malo es que mi base en Excel con código es mínima.

Soy estadístico de atletismo. Básicamente lo que hago es elaborar los rankings mundiales de los diferentes eventos de este deporte: 100 m, salto de altura, maratón, etc. Para que te hagas una idea, te pongo un enlace a uno de mis trabajos. Esos datos los obtengo normalmente a través de resultados de competiciones que se publican en Internet. En la actualidad saco prácticamente todo de la Red.

Trabajo con Access y, en vez de teclear marca por marca (a veces no hay otro remedio) trato de automatizar el proceso y realizar importaciones de archivos de Excel que he previamente preparado y formateado debidamente. Naturalmente a veces es sencillo, ya que al pegarlo en Excel ya me sale tabulado, pero otras veces el formato es complicado para mi conocimiento, ya que no se me pega de una forma “natural” como en el anterior caso y al final tengo que hacerlo todo manualmente, lo que me puede ser desesperadamente lento. Naturalmente, y como bien sabes, hay tantos posibles casos como formatos de web existen…

Precisamente estaba con este último enlace que te he mandado. Una maratón que se ha celebrado hoy en Dubai (naturalmente no es que guarde todo en la base, solo dentro de unos límites de calidad). Al final he metido los datos manualmente en la base (han entrado 20 marcas) pero me ha costado dios y ayuda (de hecho aún no he terminado) elaborar esto que mando también a una publicación americana:

Marathon (gun times):

MEN -

  1. Mosinet Geremew Bayih, ETH          2:04:00 PB/WL/CR* USD 200,000

    [1:01:38 / 1:02:22]

  1. Leul Gebresilase Aleme, ETH 2:04:02 PB 80,000
  2. Tamirat Tola Adere, ETH 2:04:06 PB 40,000
  3. Asefa Mengstu Negewo, ETH 2:04:06 PB 20,000
  4. Sisay Lemma Kasaye, ETH 2:04:08 PB 13,000
  5. Birhanu Legese Gurmesa, ETH 2:04:15 PB 12,000
  6. Seifu Tura Abdiwak, ETH 2:04:44 PB 11,500
  7. Yenew Alamirew Getahun, ETH 2:08:56 PB 11,000
  8. Mekuant Ayenew Gebre, ETH 2:09:20 SB 10,500
  9. Berhanu Teshome Demisie, ETH 2:10:27 SB 10,000
  10. Ronald Kipkoech Korir, KEN 2:13:03 SB
  11. Herpassa Negasa Kitesa, ETH 2:13:20 SB
  12. Kuma Terecha Chuko, ETH 2:13:28 PB
  13. Jean Marie Vianney Uwajeneza, RWA 2:16:54 PB
  14. Kedir Namo Urji, ETH 2:19:19 PB
  15. Ken-Ichi Jiromaru, JPN 2:22:11 SB
  16. Domen Hafner, SLO 2:22:19 PB
  17. Endeshaw Negesse Shumi, ETH 2:26:17 SB
  18. Sean SteVens, AUS 2:27:41 PB
  19. Aki Nummela, FIN 2:28:47 SB

*Course record; previous 2:04:11, Tamirat Tola Adere (ETH), 2017

Una vez lo tengo todo en columnas me manejo razonablemente bien con las cadenas y las funciones derecha, izquierda, extraer, concatenar, encontrar, etc., pero mi problema es llegar a tener la información tabulada.

¿Podrías ayudarme al respecto? Naturalmente, sé que, dependiendo del tipo de fuente, las soluciones posibles son infinitas, pero al menos tener un punto de partida desde el que poder ir iniciándome y modificarlo cuando fuera necesario.

Discúlpame si esto te parece un atraco, pero al ver tu ofrecimiento de ayuda me he decidido a escribirte.

1 Respuesta

Respuesta
1

Con mucho gusto te ayudo con todas tus peticiones.

Tienes razón cada listado podría ser un escenario diferente.

Lo que hago es encontrar un patrón en todos los registros y de ahí hacer la separación.

Por ejemplo, supongo que quieres separar la cadena y poner cada dato en una celda.

Te anexo la macro con unos comentarios para que sepas a qué se refiere cada instrucción

Sub separa()
'Por.Dante Amor
    For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
        cadena = Cells(i, "A")
        coma = InStr(1, cadena, ",")    'posición de la primera coma
        nombre = Left(cadena, coma - 1) 'obtner el nombre hasta la coma
        cadena2 = Mid(cadena, coma + 2) 'obtner la cadena después de la primera coma
        datos = Split(cadena2, " ")     'separar datos por cada espacio
        'pasar los datos a cada columna
        Cells(i, "B") = nombre
        k = 3
        For j = LBound(datos) To UBound(datos)  'para cada texto en datos
            Cells(i, k) = datos(j)
            k = k + 1
        Next
    Next
    MsgBox "Fin"
End Sub

Pon tus datos en la columna A, el resultado quedará a partir de la columna B

El resultado se vería así:


Avísame cualquier duda


.

.

Muchísimas gracias por tu amabilidad Dante.

Debo de mejorar muchísimo en VBA para habituarme a esas macros. Por ejemplo, desconocía la funcion Split. ¿Conoces algún buen tutorial o libro a través del cual pueda empezar paso a paso?

Igual he complicado un poco la explicación. En realidad el listado que te he pegado no es lo que quería separar, si no el resultado de combinar los distintos campos ya separados a efectos de remitirlo a esa publicación.

Así, tras copiar en la web y pegar como texto, obtuve inicialmente esta cadena:

1Geremew Bayih, Mosinet (ETH)502:04:0002:04:00

Jugando con FIND para localizar el primer espacio, coma, paréntesis, etc, y luego con MID para realizar las extracciones de lo que debe ser cada campo, lo he concatenado todo en un campo único y he obtenido:

1. Mosinet Geremew Bayih, ETH          2:04:00

Pero a efectos de tenerlo listo para importar desde Access debo de tenerlo obviamente separado en columnas.

Tu ejemplo es magnífico porque automatiza todo este proceso. Vamos a ver si consigo entender cada instrucción.

Gracias de nuevo.

Carlos.

La pregunta no admite más respuestas

Más respuestas relacionadas