exportar de excel a access (porrrrrsupuesto con VB)

31/05/2006 - 11:53 por xabi | Informe spam
Buenas!!!
Aqui sigo pegandome con el Visual.Lo que intento hacer aora es exportar
una tabla de Excel a Access.Anteriormente he comprobado que los campos estan
en el orden adecuado(menos una columna en la tabla access llamanada id para
identificar cada grupo nuevo que importo)
Es decir:
tabla access
id lote sublote denominacion
tabla excel
lote sublote denominacion

Lo que quiero aora es rellenar mi tabla de acces con los datos que el
usuario a matido en el EXCEL.He encontrado varias maneras pero no se si sera
cosa de la configuracion de la conexion pero no hace nada.La que mas me
atraia era la de INSERT INTO tabla access IN ruta SELECT * FROM Hoja1$
pero no he conseguido nada.Mi ruta la tengo en una variable que se llama
NombreArchivo.Trabajo con un projecto de access(*.adp).
Alguien sabe como hacer esto?
Mi conexio al EXCEL es esta:
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source = " + NombreArchivo
.Properties("Extended Properties") = "Excel 8.0;HDR=Yes"
.Open
End With

lo hago al principio del projecto visual y no la vuelvo a cambiar...le falta
algo para poder hacer la exportacion?
muchisimas gracias como siempre!!!
:):)

Preguntas similare

Leer las respuestas

#11 xabi
01/06/2006 - 19:55 | Informe spam
Bueno...este va a ser un post largo porque estoy llegando a cotas altas de
desesperacion.
Tengo la tabla hdi_reducido en el SQL-SERVER.

id lote sublote denominacion
1 2 2 maquina de desgranar

Tengo el archivo EXCEL en mi escritorio(NombreArchivo es toda la ruta):
lote sublote denominacion
4 4 herr.

La columna id es para identificar los diferentes projectos o registros que
vaya AÑADIENDO a la tabla hdi_reducido.Esta definida como que soporta
valores nulos,de hecho todos los campos lo soportan.

Lo que tengo que hacer aora es leer la info del EXCEL y pasarlo a la tabla
hdi_reducido,voy a ir AÑADIENDO registros asique la tabla ya ESTA CREADA
anteriormente,lo que necesito es poder ir añadiendo registros a esa tabla.Lo
que tendre que hacer es darle una nueva id cada vez que añada un registro y
meter esa id y mis datos del excel en la tabla de access.
Como he dicho no entiendo porque ME LEE BIEN DE LA TABLA DE ACCESS y me
inserta datos correctamente en el EXCEL pero no me lee del EXCEL y me
inserta en el access.
Os posteo todo el codigo,se que no deberia de hacerlo pero fijo que es algun
fallo tonto como no cerrar alguna conexion o algo y todo lo que me esteis
diciendo este siendo en balde por esa chorrada.
Funciones como las de mas abajo funcionan correctamente y no creo que sea
ese el problema.La verdad esque estara en la parte de conexiones.La parte de
la aplicacion que no funciona es la que esta entre asteriscos.No me ejecuta
esa consulta para insertar datos en la tabla YA EXISTENTE de SQL Server.
Muchisimas gracias y siento ser tan pesado. :(


Dim cnn As ADODB.Connection
Dim rs As New ADODB.Recordset 'estas variables son para el recordset del
EXCEL
Dim fld As ADODB.Field

Dim cnn_ac As ADODB.Connection 'estas variables son para el recordset del
ACCESS
Dim rs_ac As New ADODB.Recordset
Dim fld_ac As ADODB.Field
Dim nuevo_id As Integer

Dim kont_errores As Integer
Dim cadena_err As String

kont_errores = 0
' Establecemos una conexión con el libro de trabajo de EXCEL
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source = " + NombreArchivo
.Properties("Extended Properties") = "Excel 8.0;HDR=Yes"
.Open
End With
'hacemos lo mismo con ACCESS
Set cnn_ac = CurrentProject.Connection

' Creamos un nuevo objeto Recordset...estamos trabajando en EXCEL
With rs
Set .ActiveConnection = cnn
' Indicamos el nombre de la hoja
.Source = "[Hoja1$]"
.Open
End With

rs_ac.Open "SELECT * FROM hdi_reducido", cnn_ac
rs.Open "[hdi_reducido$]", cnn

'recorremos el excel ya que es el archivo ke menos columnas tiene
CompararColumnas rs_ac, rs, kont_errores, cadena_err
If kont_errores <> 0 Then
MsgBox "No se han encontrado: " + cadena_err + " por favor cambie el
archivo y importe de nuevo"
Exit Sub
End If
'cerramos recordsets
rs_ac.Close
rs.Close

'aki nos compararia si los campos del excel se encuantran en el
access...esto de momento es innecesario
'dejamos esta parte de codigo por si un dia es necesario..como ejemplo:
'MsgBox "Inicio comparación Excel -> Access"
'CompararColumnas rs, rs_ac

'2)darle un ID
rs_ac.Open "SELECT * FROM hdi_reducido", cnn_ac
rs_ac.MoveLast
nuevo_id = rs_ac.Fields("id").Value + 1 'encontramos en nuevo ID y le
sumamos 1 para que sea el ID del archivo importado
rs_ac.Close

'aora hay que insertar los datos del hdi que viene de pdf en la base de
datos...rellenar los campos que haya llenado
'el usuario desde el excel.
'la id la piya automaticamente y rellena el access por cada registro leido
'id lote sublote item subitem etc
'***************************************************************************
**********************************
'AKI
FAYO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Dim sql As String

' Exportamos la hoja completa de Excel utilizando una cadena ODBC
sql = "SELECT * INTO hdi_reducido " & _
"IN ''[ODBC;Driver{SQL Server};" & _
"Server=ALEB2B;" & _
"Database=master;" & _
"UID=sa;" & _
"PWD=manager] " & _
"FROM [Hoja1$]"

' Ejecutamos la consulta
cnn.Execute sql, , adCmdText + adExecuteNoRecords

' Cerramos la conexión
cnn.Close



'***************************************************************************
***********************
'aora tenemos validados los campos y tenemos el nuevo ID de nuestro
archivo...es ora de meterlo en la tabla
'3)sumarle columnas
'le sumamos columnas al fitxero de excel para que tenga forma de hdi


cnn.Close 'no kitar
rs_ac.Open "SELECT * FROM hdi_reducido", cnn_ac
excel NombreArchivo, rs_ac, 1
rs_ac.Close
rs_ac.Open "SELECT * FROM hdi_reducido WHERE id=2", cnn_ac
excel NombreArchivo, rs_ac, 2

cnn_ac.Close
Set cnn_ac = Nothing
cnn.Close
Set cnn = Nothing

rs_ac.Close
Set rs_ac = Nothing
rs.Close
Set rs = Nothing

End If

End Sub

Private Sub CompararColumnas(oRSOrigen As ADODB.Recordset, oRSDestino As
ADODB.Recordset, kont_errores As Integer, cadena_err As String)
Dim oCol As ADODB.Field
Dim kont As Integer 'EL NUMERO DE CAMPOS QUE DEBEN DE COINCIDIR CON LA
TABLA DE ACCESS!!!!IMPORTANTE!!!

kont = 0
For Each oCol In oRSOrigen.Fields 'para cada columna del archivo de
access
If Not ExisteColumnaEnRS(oRSDestino, oCol.Name, kont - 1) Then
cadena_err = cadena_err + oCol.Name + " "
kont_errores = kont_errrores + 1
End If
kont = kont + 1
If kont = 4 Then 'cambiar esta variable para saber el numero de
campos iniciales a tener en cuenta
MsgBox "ya he revisado los campos deseados"
Exit For
End If
Next
End Sub

Private Function ExisteColumnaEnRS(oRs As ADODB.Recordset, sNombreColumna As
String, kont As Integer) As Boolean
On Error GoTo Err1
Dim s As String

If (sNombreColumna = "id") Then
ExisteColumnaEnRS = True
Exit Function
Else
If (oRs.Fields(kont).Name = sNombreColumna) Then
s = oRs.Fields(sNombreColumna).Name
ExisteColumnaEnRS = True
Exit Function
Else
ExisteColumnaEnRS = False
End If
End If
Err1:
End Function


Private Sub Salir_Click()
DoCmd.SetWarnings True
DoCmd.Close
End Sub



Function ActivaBoton()
If NombreArchivo <> "" Then
Importar.Enabled = True
Else
Importar.Enabled = False
End If
End Function

Private Sub excel(ByVal NombreArchivo As String, rs As ADODB.Recordset, op
As Integer)
Dim objExcel As excel.Application
Dim objLibro As excel.Workbook
Dim oCol As ADODB.Field
Dim kont_col As Integer
Dim kont_fila As Integer

kont_fila = 2
kont_col = 1
On Error Resume Next

Set objExcel = GetObject(, "Excel.Application")
If Err.Number = 429 Then
Err.Clear
Set objExcel = CreateObject("Excel.Application")
End If

'Ruta de un archivo de Excel existente

'Verificamos que exista el archivo
If Len(Dir(NombreArchivo)) > 0 Then
'Abrimos un libro existente
Set objLibro = objExcel.Workbooks.Open(NombreArchivo)
'Escribimos en las celdas los registros...es decir el nombre de las
columnas de la tabla access

If op = 1 Then
For Each oCol In rs.Fields
If oCol.Name <> "id" Then
objLibro.Worksheets(1).Cells(1, kont_col).Value = oCol.Name
kont_col = kont_col + 1
End If
Next
End If



If op = 2 Then
Do
For Each oCol In rs.Fields
If oCol.Name <> "id" Then
objLibro.Worksheets(1).Cells(kont_fila, kont_col).Value
= oCol.Value
kont_col = kont_col + 1
End If
Next
rs.MoveNext
kont_col = 1
kont_fila = kont_fila + 1
Loop Until rs.EOF
End If

'Guardamos el libro
objLibro.Save
objLibro.Close
Else
MsgBox "El archivo no existe"
End If

objExcel.Quit
Set objLibro = Nothing
Set objExcel = Nothing
End Sub
Respuesta Responder a este mensaje
#12 SoftJaén
01/06/2006 - 20:44 | Informe spam
"xabi" escribió:

Lo que tengo que hacer aora es leer la info del EXCEL y pasarlo a la tabla
hdi_reducido,voy a ir AÑADIENDO registros asique la tabla ya ESTA CREADA
anteriormente,lo que necesito es poder ir añadiendo registros a esa
tabla.Lo que tendre que hacer es darle una nueva id cada vez que añada
un registro y meter esa id y mis datos del excel en la tabla de access.
Como he dicho no entiendo porque ME LEE BIEN DE LA TABLA DE ACCESS y me
inserta datos correctamente en el EXCEL pero no me lee del EXCEL y me
inserta en el access.



¡Vaya jaleo! Vuelvo a insistirte, que si trabajas con un proyecto de Access,
estás trabajando con una base de datos de SQL Server, desde la interfaz de
usuario de Microsoft Access, pero que te quede bien claro, que la base de
datos NO ES DE ACCESS. ¿OK?

Los dos ejemplos que te he aconsejado, funcionan correctamente, siempre y
cuando sepas cómo ejecutarlos. En el primer ejemplo, debes de abrir una
conexión con la base de datos de SQL Server, y ejecutar la consulta T-SQL
para IMPORTAR los datos. En el segundo, debes de abrir una conexión con el
libro de Excel para EXPORTAR los datos a SQL Server, creando con ellos una
nueva tabla en la base de datos. Ahora bien, si no diferencias bien entre
IMPORTAR y EXPORTAR datos, el "hilo" éste se puede alargar demasiado.

Si la tabla ya existe en la base de datos de SQL Server (o si lo prefieres,
en el proyecto de Access), en lugar de ejecutar una consulta SELECT * INTO,
deberás de ejecutar una consulta de datos añadidos INSERT INTO, para añadir
un sólo registro o varios registros a la tabla, dependiendo de lo que desees
hacer.

Referente al campo identificador, si éste campo existe en la hoja de cálculo
de Excel, lo puedes importar o exportar (según la conexión que abras) a la
tabla de SQL Server, pero si no existe dicho campo ... te diré que no le
pidas peras al olmo, porque como podrás comprender, el ISAM de Excel no se
va a inventar unos datos que no existen, por lo que tendrás que crearte
algún procedimiento para actualizar el identificador en la tabla de SQL
Server.

Por si lo desconoces, te comento que los campos Autonuméricos de Access, en
Microsoft SQL Server, digamos que se llaman campos IDENTITY, por lo que si
en la tabla creas un campo de éstas características que te sirva de
identificador, cuando insertes los registros, automáticamente se enumerará
el campo, con el incremento que hayas especificado.

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
#13 SoftJaén
01/06/2006 - 21:04 | Informe spam
"xabi" escribió:

lo que no comprendo es porque lee bien de la base de datos y me realiza
consultas pero cuando intento hacer la importacion desde excel no me deja.



Porque has copiado la cadena de conexión, tal y como yo la publiqué, y he
observado que hay un error, porque falta el signo = para especificar el
Driver de SQL Server. Te pido disculpas, pero con las prisas, omití el signo
igual.

Esta es tu cadena de conexión:

' Exportamos la hoja completa de Excel utilizando una cadena ODBC
sql = "SELECT * INTO hdi_reducido " & _
"IN ''[ODBC;Driver{SQL Server};" & _
"Server=ALEB2B;" & _
"Database=master;" & _
"UID=sa;" & _
"PWD=manager] " & _
"FROM [Hoja1$]"



Deberás de cambiar por la siguiente:

sql = "SELECT * INTO hdi_reducido " & _
"IN ''[ODBC;Driver={SQL Server};" & _
"Server=ALEB2B;" & _
"Database=master;" & _
"UID=sa;" & _
"PWD=manager] " & _
"FROM [Hoja1$]"

Lo que cambia es Driver={SQL Server}. Si no se incluye el signo igual,
obtienes un fallo ODBC en la llamada.

Por último, y observando la cadena de conexión que utilizas para conectarte
a la base de datos, no me queda más que preguntarte, si deseas crear la
tabla «hdi_reducido» en la base de datos de sistema «master». Desde luego,
no es lugar más indicado para crear tablas de usuario, pero si ese es tu
deseo ..., pues nada. :-)

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
#14 Eva
02/06/2006 - 09:48 | Informe spam
Y ahora en Eskola andáis con Access???? Quién te ha visto y quién te ve
Pónme al día, anda :)

Uno de tus profes tiene una máxima: divide y vencerás. Aplícala. Primero
importa a una tabla que no sirva pa ná, comprueba que todo es correcto, y
después te haces un INSERT a tu tabla definitiva y borras la intermedia,
¿qué te parece?


"xabi" escribió en el mensaje
news:%
De eskola sijajaja...que pequeño es el mundo e?
Lo de la tablaLo que quiero no es que me cree una...sino que sume la
importacion a una tabla ya existente...imaginate que tienes una tabla
"PERSONAS",quiero que cada vez que importo de el EXCEL me sume lo que lea
a
esa tabla...

:):)

"Eva" escribió en el mensaje
news:
¿Alumno de Eskola? maremia

A ver, yo acabo de hacer lo siguiente:

DoCmd.TransferSpreadsheet acImport, 0, "mitabla", "c:\artiequi.xls",
True

Y me ha creado una tabla "mitabla", donde ha importado el contenido de mi
hoja de cálculo. Lo he probado en .MDB y en .ADP

Agur

"xabi" escribió en el mensaje
news:
> Haaaaabeer!!
> Nu sabia yo esto del transferSpreadSheet.Lo he hecho de la siguiente
> manera:
>
> DoCmd.TransferSpreadsheet acImport, , "hdi_reducido", NombreArchivo,


True
>
> He dejado el ultimo argumento en blanco poruqe me dice(ayuda de VB) que


si
> lo relleno como que va a ir mal,enfin que lo he escrito TAL Y COMO


esta(AS
> IF...que parece esta de moda la expresion...jeje) PEEERO...no me
> va,pasa
> una
> cosa rara...se queda pensando algo...y me va a la seccion tablas de
> access...pero no realiza cambio alguno :(
>
> saludos desde euskadiiiiiiiiii!!
> muchas graciasssss!!!
>
> "Eva" escribió en el mensaje
> news:
>> A ver, mi chico, que ya voy entendiendo algo
>>
>> Me pai que tú has oído campanas, vaya usté a saber dónde, sobre


vincular
> una
>> hoja Excel a Access y trabajar sobre ella como si fuera una tabla. Y


eso
> va
>> a ser cierto y muy cómodo, pero imposible con un ADP
>>
>> Tu solución es importar primero la hoja a una tabla, y después
>> trabajar
> con
>> ella. ¿Cómo? Te copio un trocito de ayuda del método


TransferSpreadSheet
>>
>> Método TransferSpreadsheet
>>
>>
>> El método TransferSpreadsheet lleva a cabo la acción
>> TransferirHojaCálculo
>> en Visual Basic. Para obtener más información acerca de cómo funcionan


la
>> acción y sus argumentos, consulte el tema de la acción.
>>
>> Sintaxis
>>
>> DoCmd.TransferSpreadsheet [tipotransferencia][, tipohojacálculo],
>> nombretabla, nombrearchivo[, contienenombresdecampos][, intervalo]
>>
>> Suerte!
>>
>>
>> "xabi" escribió en el mensaje
>> news:
>> > lo que descubre uno cada dia...esto es por mandarme un proyecto
>> > sobre
>> > cosas
>> > que desconozco...
>> > como siempre mil gracias...voy a intentar esto y os cuento.
>> > Eva...no entiendes nada?Yo tampoco,que locuraes broma...gracias


por
>> > leerme,haber si lo soluciono.
>> >
>> > "SoftJaén" escribió en el mensaje
>> > news:
>> >> "xabi" escribió:
>> >>
>> >> > Lo que quiero aora es rellenar mi tabla de acces con los datos
>> >> > que el usuario a matido en el EXCEL.
>> >> > Trabajo con un projecto de access(*.adp).
>> >>
>> >> Xabi, si trabajas con un proyecto de Access, tu tabla NO ES de


Access:
> es
>> > de
>> >> una base de datos de SQL Server, y por tanto, la sintaxis SQL que
>> >> intentas
>> >> ejecutar, no sirve para insertar los datos en dicha tabla. Para una
> base
>> >> *.mdb, funciona estupendamente, siempre y cuando encierres el
>> >> nombre
>> >> de
>> >> la
>> >> hoja de cálculo entre corchetes ( ... FROM [Hoja1$]), pero para
> importar
>> > los
>> >> datos a una base de datos de SQL Server, necesitarás utilizar el
> lenguaje
>> >> T-SQL propio de Microsoft SQL Server.
>> >>
>> >> En el siguiente enlace encontrarás la manera de llevar a cabo la
>> > importación
>> >> de datos.
>> >>
>> >> Cómo importar datos a SQL Server desde distintos orígenes de datos
>> >> http://mvp-access.com/softjaen/base...ado017.htm
>> >>
>> >> Un saludo
>> >>
>> >> Enrique Martínez
>> >> [MS MVP - VB]
>> >>
>> >> Nota informativa: La información contenida en este mensaje, así
>> >> como
>> >> el
>> >> código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
>> >> garantías de ninguna clase, y no otorga derecho alguno. Usted asume
>> >> cualquier riesgo al poner en práctica, utilizar o ejecutar lo
> recomendado
>> > o
>> >> sugerido en el presente mensaje.
>> >>
>> >>
>> >>
>> >
>> >
>>
>>
>
>






Respuesta Responder a este mensaje
#15 xabi
02/06/2006 - 10:14 | Informe spam
voy aprobar...lo de la tabla master...es solo para las pruebas tontas
iniciales,tengo creada otra carpeta para cuando tengra que aplicar el
projecto ya definitivamentehaber si sale algo hoy :)
"SoftJaén" escribió en el mensaje
news:
"xabi" escribió:

> lo que no comprendo es porque lee bien de la base de datos y me realiza
> consultas pero cuando intento hacer la importacion desde excel no me


deja.

Porque has copiado la cadena de conexión, tal y como yo la publiqué, y he
observado que hay un error, porque falta el signo = para especificar el
Driver de SQL Server. Te pido disculpas, pero con las prisas, omití el


signo
igual.

Esta es tu cadena de conexión:

> ' Exportamos la hoja completa de Excel utilizando una cadena ODBC
> sql = "SELECT * INTO hdi_reducido " & _
> "IN ''[ODBC;Driver{SQL Server};" & _
> "Server=ALEB2B;" & _
> "Database=master;" & _
> "UID=sa;" & _
> "PWD=manager] " & _
> "FROM [Hoja1$]"

Deberás de cambiar por la siguiente:

sql = "SELECT * INTO hdi_reducido " & _
"IN ''[ODBC;Driver={SQL Server};" & _
"Server=ALEB2B;" & _
"Database=master;" & _
"UID=sa;" & _
"PWD=manager] " & _
"FROM [Hoja1$]"

Lo que cambia es Driver={SQL Server}. Si no se incluye el signo igual,
obtienes un fallo ODBC en la llamada.

Por último, y observando la cadena de conexión que utilizas para


conectarte
a la base de datos, no me queda más que preguntarte, si deseas crear la
tabla «hdi_reducido» en la base de datos de sistema «master». Desde luego,
no es lugar más indicado para crear tablas de usuario, pero si ese es tu
deseo ..., pues nada. :-)

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado


o
sugerido en el presente mensaje.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida