Copiar datos de una hoja html a celdas de excel

Buenas tardes, 

Me gustaría saber si existe alguna forma de automatizar un proceso que tengo que hacer varias veces al día todos los días.

Me envían un archivo en html que cuando lo abro trae una serie de datos que debo copiar uno a uno a una base de datos (el libro de llama BASE.XLM )

La hoja tiene este formato:


Valencia, le 29/09/2014

Localidad
Calle Direccion, Plaza Plaza 
00000 Localidad
Tel : 999999999

Instalador: Nombre 
Fax : Datos
Tel : 999999999 00000 población 


Nº Servicio : 071_RT000000
Cliente : APELLIDO1 APELLIDO2 NOMBRE 
Dirección : DIRECCION COMPLETA
Ciudad : 00000 POBLACION 
Tel : 999999999

999999999
-----------------------------
SOLICITUD XXXX (continúa pero no interesa)

Necesito copiar el número de servicio y los datos del cliente. Cada uno de los datos en una celda diferente.

Supongo que se podría usar una hoja en blanco del libro BASE.XML para pegar ahí los datos y luego que la macro me los copie donde están el resto de clientes hoja llamada 2014

Cosas a tener en cuenta.....

-La hora 2014 ya tiene datos, y se tendrían que copiar en la primera fila vacía

- Sería estupendo poder cambiar el orden del nombre del cliente y  que quedase así (Nombre Apellido1 Apellido2)

Muchas gracias por todo.

2 respuestas

Respuesta
1

Podrías enviarme un par de archivos HTML para revisarlos y ver exactamente en dónde está la información.

También envíame tu archivo de excel y me dices en cuáles columnas quieres cada dato del HTML.

Lo del nombre es un poco delicado, ya que hay personas que tienen 2 nombres o apellidos compuestos, entonces no se sabría en dónde empieza el nombre y dónde terminan los apellidos, pero si tú me dices que corte la última palabra del cliente y esa la pase al principio, no hay problema.

Ya he enviado el corro.

Gracias.

Te envío la macro para leer los datos del archivo HTML.

Sub TomarDatosDeHtml()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set l1 = ThisWorkbook
    Set h1 = l1.ActiveSheet
    u = h1.Range("B" & Rows.Count).End(xlUp).Row + 1
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Seleccione archivo de excel"
        .Filters.Clear
        .Filters.Add "Todos los archivos", "*.*"
        .Filters.Add "HTML", "*.html"
        .FilterIndex = 2
        .AllowMultiSelect = False
        .InitialFileName = ThisWorkbook.Path
        '.Show
        If .Show Then
            Set l2 = Workbooks.Open(.SelectedItems.Item(1))
            Set h2 = l2.ActiveSheet
            Set b = h2.Cells.Find("Nº Servicio", LookAt:=xlPart)
            If Not b Is Nothing Then
                ser = Mid(b.Value, 15)
                num = Mid(ser, 7)
                If Right(num, 1) = "C" Then col = "D" Else col = "C"
                h1.Cells(u, "B") = ser                                  'num registro
                h1.Cells(u, col) = num                                  'ref medicion
            End If
            h1.Cells(u, "F") = h2.Range("A2")                           'Tienda
            h1.Cells(u, "G") = Right(h2.Range("B1"), 10)                'Fecha
            Set b = h2.Cells.Find("Cliente :", LookAt:=xlPart)
            If Not b Is Nothing Then
                cli = Mid(b.Value, 10)
                h1.Cells(u, "H") = Mid(b.Value, 10)                     'cliente
                h1.Cells(u, "I") = Mid(h2.Cells(b.Row + 3, "A"), 7)     'tel fijo
                h1.Cells(u, "J") = h2.Cells(b.Row + 4, "A")             'tel mov
                h1.Cells(u, "K") = Mid(h2.Cells(b.Row + 1, "A"), 13)    'dir
                h1.Cells(u, "L") = Mid(h2.Cells(b.Row + 2, "A"), 10, 5) 'cp
                h1.Cells(u, "M") = Mid(h2.Cells(b.Row + 2, "A"), 16)    'pob
            End If
            Application.DisplayAlerts = False
            l2.Close
            Application.DisplayAlerts = True
        End If
    End With
End Sub

Cuando ejecutas la macro, te pide que selecciones el archivo html. La macro abre el archivo, toma los datos del cliente y los pone en sus respectivas celdas.

Saludos. Dante Amor

No olvides valorar la respuesta.

Buenas tardes,

He observado un par de cosas.

Cuando me copia los teléfonos, me los copia en las columnas pero cambiadas. El móvil en el fijo y el fijo en el móvil. No sé si es porque a veces solo viene un teléfono y entonces se vuelve un poco loco.

Y la segunda cosa... cuando no hay fijo... me pone líneas en la columna de móvil, y el móvil lo pega en la de fijo. ¿Se podría arreglar para que cada cosa vaya en su sitio? ¿Es necesario que ponga las líneas?

Muchas gracias.

La macro está preparada para que siempre haya teléfono fijo y siempre haya teléfono móvil, tal y como lo enviaste en el ejemplo, si alguno de los dos datos no viene o ningún dato no viene, tendrías que enviar los ejemplos, ya que supongo que cuando un dato no viene los datos del formato de HTML se mueven, no es que la macro se vuelva un poco loca, lo que se viene mal es el HTML, si el HTML fuera homogéneo con o sin datos no habría problemas.

Buenas tardes, 

Tengo otro pequeño problemita. Resulta que la columna de la fecha me la pone mal. Me cambia el orden de la fecha. En vez de DD/MM/AA (dia/mes/año), me pone MM/DD/AA.

En el HTML viene bien, DD/MM/AA

Se puede corregir? Muchas gracias.

Te anexo la macro para arreglar lo de la fecha

Sub TomarDatosDeHtml()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set l1 = ThisWorkbook
    Set h1 = l1.ActiveSheet
    u = h1.Range("B" & Rows.Count).End(xlUp).Row + 1
    Dim fec As Date
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Seleccione archivo de excel"
        .Filters.Clear
        .Filters.Add "Todos los archivos", "*.*"
        .Filters.Add "HTML", "*.html"
        .FilterIndex = 2
        .AllowMultiSelect = False
        .InitialFileName = ThisWorkbook.Path
        '.Show
        If .Show Then
            Set l2 = Workbooks.Open(.SelectedItems.Item(1))
            Set h2 = l2.ActiveSheet
            Set b = h2.Cells.Find("Nº Servicio", LookAt:=xlPart)
            If Not b Is Nothing Then
                ser = Mid(b.Value, 15)
                num = Mid(ser, 7)
                If Right(num, 1) = "C" Then col = "D" Else col = "C"
                h1.Cells(u, "B") = ser                                  'num registro
                h1.Cells(u, col) = num                                  'ref medicion
            End If
            h1.Cells(u, "F") = h2.Range("A2")                           'Tienda
            fec = Right(h2.Range("B1"), 10)
            h1.Cells(u, "G") = fec                                      'Fecha
            Set b = h2.Cells.Find("Cliente :", LookAt:=xlPart)
            If Not b Is Nothing Then
                cli = Mid(b.Value, 10)
                h1.Cells(u, "H") = Mid(b.Value, 10)                     'cliente
                h1.Cells(u, "I") = Mid(h2.Cells(b.Row + 3, "A"), 7)     'tel fijo
                h1.Cells(u, "J") = h2.Cells(b.Row + 4, "A")             'tel mov
                h1.Cells(u, "K") = Mid(h2.Cells(b.Row + 1, "A"), 13)    'dir
                h1.Cells(u, "L") = Mid(h2.Cells(b.Row + 2, "A"), 10, 5) 'cp
                h1.Cells(u, "M") = Mid(h2.Cells(b.Row + 2, "A"), 16)    'pob
            End If
            Application.DisplayAlerts = False
            l2.Close
            Application.DisplayAlerts = True
        End If
    End With
End Sub
Respuesta

Ya te he enviado el correo.

Añade tu respuesta

Haz clic para o