** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Importar determinadas columnas de excel a access
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoImportar determinadas columnas de excel a access

 Responder Responder
Autor
Mensaje
Sherezade81 Ver desplegable
Habitual
Habitual


Unido: 14/Septiembre/2011
Localización: España
Estado: Sin conexión
Puntos: 84
Enlace directo a este mensaje Tema: Importar determinadas columnas de excel a access
    Enviado: 12/Octubre/2016 a las 16:42
Buenas tardes a todos!
Estoy liada intentando importar determinadas columnas de una hoja de Excel cuyos titulos no están en la primera celda de la hoja de Excel a una tabla de Access que tiene ya 3 campos que no quiero que los tenga en cuenta dado  que ya están cubiertos.
A ver si me explico, son tarifas con el membrete de la empresa, datos adicionales y más abajo la tarifa, que es la que quiero exportar a Access.
He indicado este código:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "Tarifa/2016-Nueva", "C:\bd\Tarifa2007.xls", False, "B10:J34", pero me salta que el campo F1 no está definido en la tabla, supongo que porque antes de los campos donde quiero que se copien las columnas tengo los 3 campos cuyos datos ya están cubiertos... no se si me explico...
Las columnas que quiero importar en la tabla de Excel les he puesto el mismo nombre que a los campos donde quiero que se me vuelquen los datos... jejeje pero me da que no es suficiente.
¿Alguien me podría orientar si es posible como lo debería enfocar?
Gracias,
Saludos!
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12019
Enlace directo a este mensaje Enviado: 12/Octubre/2016 a las 17:54
Ya que has pedido una orientación, yo lo enfocaria por alguna de estas dos líneas:
- Abrir un Recordset directamente sobre la hoja de Excel. De ese recordset solo tendría en cuenta los datos que quisiera importar.
- Abrir de forma oculta el Excel y recorrer por automatización las celdas rescatando los datos

De la primera línea me parece que Emilio tiene algo en su web
Del segundo caso seguro que también. Si no busca por automatización excel

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
Sherezade81 Ver desplegable
Habitual
Habitual


Unido: 14/Septiembre/2011
Localización: España
Estado: Sin conexión
Puntos: 84
Enlace directo a este mensaje Enviado: 13/Octubre/2016 a las 00:08
Buenas,
No he encontrado el artículo de Emilio pero he conseguido este código, lo único que solo me vuelca la primer fila y por más que he revisado el código.
¿Alguien me puede indicar donde estoy metiendo la pata?
Gracias!!
Private Function Excel_a_Access( _
    Path_BD As String, _
    Path_XLS As String, _
    La_Tabla As String, _
    Filas As Integer, _
    Columnas As Integer) As Boolean

    ' -- Variables para acceder al libro de excel,
    ' -- para la base de datos y el recordset dao
    Dim Obj_Excel       As Object
    Dim Obj_Hoja        As Object
    Dim bd              As Database
    Dim rst             As Recordset
   
    ' -- Variables para la fila, la columna y el dato a copiar
    Dim Fila_Actual     As Integer
    Dim Columna_Actual  As Integer
    Dim Dato            As Variant

   ' Screen.MousePointer = vbHourglass

    ' -- Crea una Nueva instancia de Excel
    Set Obj_Excel = CreateObject("Excel.Application")

    ' -- Abre el libro pasandole el path
    Obj_Excel.Workbooks.Open FileName:=Path_XLS

    ' -- si es la versión de Excel 97, asigna la hoja activa ( ActiveSheet )
    If Val(Obj_Excel.Application.Version) >= 8 Then
        Set Obj_Hoja = Obj_Excel.ActiveSheet
    Else
        Set Obj_Hoja = Obj_Excel
    End If
   
    ' -- Abrir la base de datos
    Set bd = OpenDatabase("C:\Strans\Strans_be.accdb")
       
    ' -- Llenar el recordset indicándole la tabla
    Set rst = bd.OpenRecordset(La_Tabla, dbOpenTable)
   
    'Columnas = 9
   
    ' -- Recorrer las filas y columnas de la hoja
    For Fila_Actual = 10 To Filas
        ' -- Agregar un nuevo registro
        rst.Edit
       
        ' -- REcorrer las columnas del libro
        For Columna_Actual = 1 To Columnas - 1
       
            ' -- Almacena le dato de la celda actual
            Dato = Trim$(Obj_Hoja.Cells(Fila_Actual, Columna_Actual + 1))
            Do While rst.EOF
            ' -- Agrega los datos al campo indicado
            rst(Columna_Actual + 2).Value = Dato
            rst.MoveNext
            Loop


        Next
        ' -- Actualiza los datos en la tabla
        rst.Update
    Next
   
    Excel_a_Access = True
    ' -- Descargar los objetos
   
    Call Descargar_Objetos(rst, bd, Obj_Excel, Obj_Hoja)
 

Exit Function

' -- Error
' --------------------------------------------------------------
ErrSub:

' -- Descargar las referencias y cierra la base de datos
Call Descargar_Objetos(rst, bd, Obj_Excel, Obj_Hoja)
MsgBox Err.Description, vbCritical
'Screen.MousePointer = vbDefault
   
End Function

'Descarga los objetos y los cierra
Sub Descargar_Objetos( _
    rst As Recordset, _
    bd As Database, _
    Obj_Excel As Object, _
    Obj_Hoja As Object)

   
    Set rst = Nothing
    bd.Close
    Set bd = Nothing
    Obj_Excel.ActiveWorkbook.Close False
    Obj_Excel.Quit
    Set Obj_Hoja = Nothing
    Set Obj_Excel = Nothing

End Sub



Private Sub Comando2_Click()
 
  Dim ret As Boolean
 
    ret = Excel_a_Access("C:\Strans\Strans_be.accdb", "C:\STRANS\TARIFA2007.xls", "Tarifa/2016-Nueva", 10, 10)
   
    If ret Then 'Ok
        MsgBox " Datos copiados a Access ", vbInformation
    End If

End Sub
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12019
Enlace directo a este mensaje Enviado: 13/Octubre/2016 a las 08:56
El código que has puesto permite una serie de parámetros. Entre ellos la fila y la columna. A ti te importa solo el primer dato porque tu origen empieza en la fila 10 y (intuyo) no has cambiado ese valor en la llamada a la función.

En cualquier caso la función Excel_a_Access debería ser únicamente un punto de partida para lo que deseas hacer. Lo normal seria ejecutarla paso a paso viendo que hace cada uno de ellos y experimentando hasta encontrar la solución.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
Sherezade81 Ver desplegable
Habitual
Habitual


Unido: 14/Septiembre/2011
Localización: España
Estado: Sin conexión
Puntos: 84
Enlace directo a este mensaje Enviado: 13/Octubre/2016 a las 18:56
Muchas gracias Xavi, Efectivamente tuve que modificar los parámetros de Excel_a_Access a 24,10 dado que de la primer forma solo me leía la primer linea. El caso es que no acabo de conseguir que me recorra todas las celdas y me las traspase a la tabla.
De esta forma solo me lee la primer fila.
    ' -- Recorrer las filas y columnas de la hoja
    For Fila_Actual = 10 To Filas
    rst.Edit
        ' -- REcorrer las columnas del libro
        For Columna_Actual = 1 To Columnas - 1
            ' -- Agregar un nuevo registro
       
            ' -- Almacena le dato de la celda actual
            Dato = Trim$(Obj_Hoja.Cells(Fila_Actual, Columna_Actual + 1))
            rst(Columna_Actual + 2).Value = Dato
            Next
    
        ' -- Actualiza los datos en la tabla
        rst.Update
    Next


He probado de nuevo con el recordset para ver que valores recibía pero no recibo ninguno dado que me da error: 3020 update o CancelUpdate sin addnew o edit

Y por otro lado he probado con msgbox al no aclararme con el recorset y sí que me recorre varias filas, pero claro no me las traslada a la tabla.

¿Alguna sugerencia porfi a ver si me voy aclarando?
Gracias,
Saludos,
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11092
Enlace directo a este mensaje Enviado: 13/Octubre/2016 a las 19:19
Así, a bote pronto, .... le estás diciendo que edite el registro del Recordset:

 rst.Edit

Debes decirle que añada registro:

rst.Addnew



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

Access Aplicaciones
Tecsys.es
Arriba
Sherezade81 Ver desplegable
Habitual
Habitual


Unido: 14/Septiembre/2011
Localización: España
Estado: Sin conexión
Puntos: 84
Enlace directo a este mensaje Enviado: 13/Octubre/2016 a las 19:28
es que en la tabla, ya tengo digamos los primeras tres columnas de la tabla con datos.
quiero que me edite las columnas a partir de la  cuarta
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11092
Enlace directo a este mensaje Enviado: 13/Octubre/2016 a las 19:52
Es complicado dar la respuesta correcta cuando en cada nuevo post aparece un nuevo 'matiz' que cambia la pregunta (en parte o en su total) ....

Pues si quieres actualizar un recordset, tendrás que posicionarte en el registro que quieres editar y 'abrirlo' con un rst.Edit

Para posicionarte tendrás que usar un rst.FindFirst con los valores adecuados. Lo mejor es que uses la ayuda de Access sobre este tema que trae buenos ejemplos.

Saludos.




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

Access Aplicaciones
Tecsys.es
Arriba
Sherezade81 Ver desplegable
Habitual
Habitual


Unido: 14/Septiembre/2011
Localización: España
Estado: Sin conexión
Puntos: 84
Enlace directo a este mensaje Enviado: 13/Octubre/2016 a las 20:00
disculpa, quizá no me había explicado bien, la tabla es de la siguiente forma
ID         DEKILO   AKILO          T1       T2        T3      T4          T5
1              1            5
2              6            10
3             11           15
4             16           20
5              21          30
6              31          40
ETC        ETC         ETC
Son los campos T1,T2,T3....los que quiero rellenar.
Con findfirst no sabría que buscar para solucionarlo... Voy a seguir haciendo pruebas por si acaso.
Muchas gracias.

Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11092
Enlace directo a este mensaje Enviado: 14/Octubre/2016 a las 08:55
No es cuestión de hacer pruebas, ... es cuestión de saber como actualizar una tabla usando un recordset.

El bucle de acciones es:

1.- Adquiero datos identificativos del registro (en tu caso, ID, ¿DEKILO AKILO?
2.- Compruebo si existe el registro
3.- Si existe lo actualizo (rst.Edit)
4.- Si  no existe lo creo (rst.AddNew)
5.- Si más datos a tratar vuelvo al punto 1, si no los hay fin proceso.

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

Access Aplicaciones
Tecsys.es
Arriba
Sherezade81 Ver desplegable
Habitual
Habitual


Unido: 14/Septiembre/2011
Localización: España
Estado: Sin conexión
Puntos: 84
Enlace directo a este mensaje Enviado: 14/Octubre/2016 a las 18:44
Muchas gracias Mihura. He simplificado la hoja de excel para evitarme quebraderos de cabeza porque me da que se sale de mis posibilidades. La tabla la dejaré vacía y en la hoja de excel con las tarifas pondré todos los campos, hasta el autonumérico invisible!!!
Muchisimas gracias a ambos por vuestra ayuda. Pego el código por si acaso le sirve a alguien.
Un saludo!!!

Private Function Excel_a_Access( _
    Path_BD As String, _
    Path_XLS As String, _
    La_Tabla As String, _
    Filas As Integer, _
    Columnas As Integer) As Boolean

    ' -- Variables para acceder al libro de excel,
    ' -- para la base de datos y el recordset dao
    Dim Obj_Excel       As Object
    Dim Obj_Hoja        As Object
    Dim bd              As Database
    Dim rst             As Recordset
   
    ' -- Variables para la fila, la columna y el dato a copiar
    Dim Fila_Actual     As Integer
    Dim Columna_Actual  As Integer
    Dim Dato            As Variant
    Dim i As Long
   

   ' Screen.MousePointer = vbHourglass

    ' -- Crea una Nueva instancia de Excel
    Set Obj_Excel = CreateObject("Excel.Application")

    ' -- Abre el libro pasandole el path
    Obj_Excel.Workbooks.Open FileName:=Path_XLS

    ' -- si es la versión de Excel 97, asigna la hoja activa ( ActiveSheet )
    If Val(Obj_Excel.Application.Version) >= 8 Then
        Set Obj_Hoja = Obj_Excel.ActiveSheet
    Else
        Set Obj_Hoja = Obj_Excel
    End If
   
    ' -- Abrir la base de datos
    Set bd = OpenDatabase("C:\Strans\Strans_be.accdb")
       
    ' -- Llenar el recordset indicándole la tabla
    Set rst = bd.OpenRecordset(La_Tabla, dbOpenTable)
   
  
   
    ' -- Recorrer las filas y columnas de la hoja
    For Fila_Actual = 12 To Filas
    rst.AddNew
        ' -- REcorrer las columnas del libro
        For Columna_Actual = 0 To Columnas - 1
            ' -- Agregar un nuevo registro
       
            ' -- Almacena le dato de la celda actual
            Dato = Trim$(Obj_Hoja.Cells(Fila_Actual, Columna_Actual + 1))
           
            rst(Columna_Actual).Value = Dato
    'MsgBox (Dato)
     Next
    
        ' -- Actualiza los datos en la tabla
        rst.Update
    Next


   
    Excel_a_Access = True
    ' -- Descargar los objetos
   
    Call Descargar_Objetos(rst, bd, Obj_Excel, Obj_Hoja)
 

Exit Function


' -- Error
' --------------------------------------------------------------
ErrSub:

' -- Descargar las referencias y cierra la base de datos
Call Descargar_Objetos(rst, bd, Obj_Excel, Obj_Hoja)
MsgBox Err.Description, vbCritical
'Screen.MousePointer = vbDefault
   
End Function

'Descarga los objetos y los cierra
Sub Descargar_Objetos( _
    rst As Recordset, _
    bd As Database, _
    Obj_Excel As Object, _
    Obj_Hoja As Object)

   
    Set rst = Nothing
    bd.Close
    Set bd = Nothing
    Obj_Excel.ActiveWorkbook.Close False
    Obj_Excel.Quit
    Set Obj_Hoja = Nothing
    Set Obj_Excel = Nothing

End Sub



Private Sub Comando2_Click()
 
  Dim ret As Boolean
 
    ret = Excel_a_Access("C:\Strans\Strans_be.accdb", "C:\STRANS\TARIFA2007-1.xls", "Tarifa/2016-Nueva", 36, 5)
   
    If ret Then 'Ok
        MsgBox " Datos copiados a Access ", vbInformation
    End If

End Sub

Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable