Problemas para pasar datos de excel a access

08/09/2006 - 14:13 por Monty | Informe spam
Hola

He hecho una aplicación en access que se conecta a una hoja de excel la lee
y crea una tabla en access.

El problema esta en cuanto me encuentra una celda que contiene un error en
excel, en este caso
( #¡DIV/0! ) me deja de leer el fichero.

Se porque me produce el error, pero me gustaria saber (manteniendo el
error), si la aplicacion podria saltarse el error o cambiarlo por un caracter
y que siga con la lectura de la hoja de excel.

La dirección que sigue el cursor en la hoja de excel es de fila a fila.
Seria posible que lo hiciera columna a columna.

( adjunto el codigo en access)

Private Sub Actualizar_Click()

Dim xls As Object, _
strLibro As String, _
rst As DAO.Recordset, _
db As Database


DoCmd.Hourglass True


Set db = OpenDatabase("C:\Documents and
Settings\andres.montejo\Escritorio\BBDD\prueba\bdatos.mdb")
' ruta de la hoja de calculo
strLibro = "C:\Documents and
Settings\andres.montejo\Escritorio\BBDD\prueba\cuadro de mando.xls"


' abro Excel
Set xls = CreateObject("Excel.Application")
' abro el libro
xls.Workbooks.Open strLibro
' activo la hoja 1 o la que quieras
xls.Worksheets("Hoja1").Activate


xls.Visible = False ' o True si prefieres


' abro un recordset de la tabla 1 o la que quieras
Set rst = CurrentDb.OpenRecordset("Tabla1")


reg = rst.RecordCount
'MsgBox (reg)
If reg > 0 Then
db.Execute "delete * from [Tabla1]"
End If

' me situo en la celda A1 o en la que quieras
xls.activesheet.range("A1").SELECT


' leo celdas hasta que encuentre una vacía
Do While Not IsEmpty(xls.ActiveCell)
rst.AddNew ' añado un registro vacio
rst!Nº = xls.ActiveCell ' meto en el campo1 la celda
activa
rst!Código_BSC = xls.ActiveCell.Offset(0, 1) ' meto en campo2 la
celda de una columna a la derecha de la activa
rst!Area_BSC = xls.ActiveCell.Offset(0, 2)
rst!Nombre = xls.ActiveCell.Offset(0, 3)
rst!Descripción = xls.ActiveCell.Offset(0, 4)
rst!Datos_Necesarios = xls.ActiveCell.Offset(0, 5)
rst!Fuente = xls.ActiveCell.Offset(0, 6)
rst!Nivel = xls.ActiveCell.Offset(0, 7)
rst!Ejercicio = xls.ActiveCell.Offset(0, 8)
rst!Enero = xls.ActiveCell.Offset(0, 9)
rst!Febrero = xls.ActiveCell.Offset(0, 10)
rst!Marzo = xls.ActiveCell.Offset(0, 11)
rst!Abril = xls.ActiveCell.Offset(0, 12)
rst!Mayo = xls.ActiveCell.Offset(0, 13)
rst!Junio = xls.ActiveCell.Offset(0, 14)
rst!Julio = xls.ActiveCell.Offset(0, 15)
rst!Agosto = xls.ActiveCell.Offset(0, 16)
rst!Septiembre = xls.ActiveCell.Offset(0, 17)
rst!Octubre = xls.ActiveCell.Offset(0, 18)
rst!Noviembre = xls.ActiveCell.Offset(0, 19)
rst!Diciembre = xls.ActiveCell.Offset(0, 20)
rst!Acumulado = xls.ActiveCell.Offset(0, 21)
rst!Media = xls.ActiveCell.Offset(0, 22)
rst!Hito = xls.ActiveCell.Offset(0, 23)

rst.Update ' guardo el registro
xls.ActiveCell.Offset(1, 0).SELECT
Loop


' al acabar cierro el recordset
If Not rst Is Nothing Then
rst.Close
Set rst = Nothing

End If
' cierro Excel
xls.ActiveWorkbook.Close
Set xls = Nothing

db.Close
Set db = Nothing

DoCmd.Hourglass False


End Sub

Muchas gracias por su tiempo
 

Leer las respuestas

#1 Héctor Miguel
10/09/2006 - 04:34 | Informe spam
hola, Monty !

... una aplicacion en access que se conecta a una hoja de excel la lee y crea una tabla en access.
... en cuanto me encuentra una celda que contiene un error en excel, en este caso ( #¡DIV/0! ) me deja de leer el fichero.
Se porque me produce el error, pero me gustaria saber (manteniendo el error)
si la aplicacion podria saltarse el error o cambiarlo por un caracter y que siga con la lectura de la hoja de excel...



es probable que la detencion se deba a que el campo en el recordset 'espera' recibir un tipo de datos distinto de un 'valor de error' -?-
una posible alternativa pudiera ser con una instruccion inicial [o antes de empezar a 'leer' las celdas] del tipo: On Error Resume Next
otra es 'evaluando' [antes de...] si la celda 'en lectura' contiene un valor de error... 'pasar' al recordset un vbNullString/0/Empty/... -?-

[podrias 'agilizar' el codigo si puedes sustituir las lineas de 'traspaso celda-a-celda' por un bucle For...Next para las columnas 1,2...23]

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ el codigo expuesto __
Private Sub Actualizar_Click()
Dim xls As Object, _
strLibro As String, _
rst As DAO.Recordset, _
db As Database
DoCmd.Hourglass True
Set db = OpenDatabase("C:\Documents and
Settings\andres.montejo\Escritorio\BBDD\prueba\bdatos.mdb")
' ruta de la hoja de calculo
strLibro = "C:\Documents and Settings\andres.montejo\Escritorio\BBDD\prueba\cuadro de mando.xls"
' abro Excel
Set xls = CreateObject("Excel.Application")
' abro el libro
xls.Workbooks.Open strLibro
' activo la hoja 1 o la que quieras
xls.Worksheets("Hoja1").Activate
xls.Visible = False ' o True si prefieres
' abro un recordset de la tabla 1 o la que quieras
Set rst = CurrentDb.OpenRecordset("Tabla1")
reg = rst.RecordCount
'MsgBox (reg)
If reg > 0 Then
db.Execute "delete * from [Tabla1]"
End If
' me situo en la celda A1 o en la que quieras
xls.activesheet.range("A1").SELECT
' leo celdas hasta que encuentre una vacia
Do While Not IsEmpty(xls.ActiveCell)
rst.AddNew ' a#ado un registro vacio
rst!Nº = xls.ActiveCell ' meto en el campo1 la celda activa
rst!Codigo_BSC = xls.ActiveCell.Offset(0, 1) ' meto en campo2 la celda de una columna a la derecha de la activa
rst!Area_BSC = xls.ActiveCell.Offset(0, 2)
rst!Nombre = xls.ActiveCell.Offset(0, 3)
rst!Descripcion = xls.ActiveCell.Offset(0, 4)
rst!Datos_Necesarios = xls.ActiveCell.Offset(0, 5)
rst!Fuente = xls.ActiveCell.Offset(0, 6)
rst!Nivel = xls.ActiveCell.Offset(0, 7)
rst!Ejercicio = xls.ActiveCell.Offset(0, 8)
rst!Enero = xls.ActiveCell.Offset(0, 9)
rst!Febrero = xls.ActiveCell.Offset(0, 10)
rst!Marzo = xls.ActiveCell.Offset(0, 11)
rst!Abril = xls.ActiveCell.Offset(0, 12)
rst!Mayo = xls.ActiveCell.Offset(0, 13)
rst!Junio = xls.ActiveCell.Offset(0, 14)
rst!Julio = xls.ActiveCell.Offset(0, 15)
rst!Agosto = xls.ActiveCell.Offset(0, 16)
rst!Septiembre = xls.ActiveCell.Offset(0, 17)
rst!Octubre = xls.ActiveCell.Offset(0, 18)
rst!Noviembre = xls.ActiveCell.Offset(0, 19)
rst!Diciembre = xls.ActiveCell.Offset(0, 20)
rst!Acumulado = xls.ActiveCell.Offset(0, 21)
rst!Media = xls.ActiveCell.Offset(0, 22)
rst!Hito = xls.ActiveCell.Offset(0, 23)
rst.Update ' guardo el registro
xls.ActiveCell.Offset(1, 0).SELECT
Loop
' al acabar cierro el recordset
If Not rst Is Nothing Then
rst.Close
Set rst = Nothing
End If
' cierro Excel
xls.ActiveWorkbook.Close
Set xls = Nothing
db.Close
Set db = Nothing
DoCmd.Hourglass False
End Sub

Preguntas similares