Borrar celdas y acceder a ACCESS

04/03/2005 - 11:52 por Principiante | Informe spam
Hola grupo, estoy haciendo una aplicación en ACCESS y tengo que abrir un
archivo de EXCEL e ir a una hoja determinada para traspasar una
información desde una tabla de ACCESS. Esto lo se hacer pero lo que no
se es como hacer (por código) para borrar todo el contenido de esa hoja
antes de hacer el traspaso de información desde la tabla de ACCESS.
Necesito hacerlo pues siempre voy escribiendo sobre la misma hoja en
cada traspaso.

Supongo que será sencillo pero es que en EXCEL no he hecho nada con código.

Otra cosilla que si que la veo algo mas difícil (para mi claro). Una vez
tengo hecho el traspaso, me quedan 2 columnas "CODIGO" y "DESCRIPCION"
con los datos de la tabla X de ACCESS. Bien, pues ahora lo que se me
plantea es como hacer para que si se desea en la columna CODIGO añadir
otro (por ejemplo el 8), acceder a la tabla X de ACCESS (mediante código
desde EXCEL) para que aparezca de forma automática la DESCRIPCION al
lado (correspondiente al código 8 de la tabla claro). Sería saber como
asignar a toda la columna de CODIGO un evento "AL SALIR" o algo así para
que busque en la tabla de ACCESS.

Esto si que es verdad que no se como hacerlo en EXCEL pues no he usado
código nunca en EXCEL. Me han pasado código para acceder a la tabla de
ACCESS pero no se como hacer que se ejecute cuando "SALGA" de alguna
celda de la columna CODIGO.

Muchísimas gracias por cualquier ayuda.

Principiante.

Preguntas similare

Leer las respuestas

#6 Principiante
04/03/2005 - 17:07 | Informe spam
Hola de nuevo, había probado lo de borrar las celdas y la función por
separado y funcionan, es decir, van de maravilla.

Ahora lo que pasa es que desde ACCESS, borro todas las celdas de la hoja
y hago el traspaso, pero antes de poder hacer el traspaso, la función
de la hoja de EXCEL se ejecuta pues se producen cambios en la hoja y
entonces se produce el error de que no coinciden los tipos en:

rsMiRS.FindFirst "CódigoProducto='" & Target & "'"

Supongo que es porque al borrar los datos de las celdas de la columna 1,
ese valor vacio es el que se pasa en TARGET a la función. Pues bien, he
intentado controlar con IsNull(Target.Value), IsEmpty(Target.Value) pero
no se detiene y llega hasta el FindFirst.

Que valor puede ser? Es otra cosa?

Esto si que me mata todo el tema pues es sobre el mismo documento de
EXCEL sobre el que voy a ir trabajando y necesito ir borrando la hoja
cada vez que hago un traspaso.

Gracias por vuestro tiempo.

Principiante.

Fernando Arroyo escribió:
He modificado el código que pones para poder hacer algunas pruebas con una base de datos que tengo:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 1 Then Exit Sub
Dim dbMiDB As DAO.Database, rsMiRS As DAO.Recordset
Set dbMiDB = DBEngine.Workspaces(0).OpenDatabase("C:\prueba.mdb")
Set rsMiRS = dbMiDB.OpenRecordset("Productos", dbOpenSnapshot)

rsMiRS.FindFirst "CódigoProducto=" & Target
If Not rsMiRS.NoMatch Then
Application.EnableEvents = False
Target.Offset(, 1) = rsMiRS.Fields("NombreProducto")
Application.EnableEvents = True
End If

rsMiRS.Close
Set rsMiRS = Nothing
dbMiDB.Close
Set dbMiDB = Nothing
End Sub

Tendrías que poner los nombres de tu base de datos, la tabla, los campos...

Si lo pegas en el módulo de la hoja (click derecho sobre su etiqueta->Ver código), cada vez que se modifique una celda de la columna A automáticamente se buscará el valor de la celda en la tabla de Access y, si se encuenta, se pondrá el contenido de otro campo (en este caso, NombreProducto) en la celda de la columna B de la fila que se acaba de modificar.
Un saludo.


Fernando Arroyo
MS MVP - Excel

"Principiante" escribió en el mensaje news:%

Gracias Fernando por la información.

Lo primero ha funcioando a las mil maravillas.

Voy a echar un vistazo a la página a ver si saco algo que me pueda valer.

Este es el código que me pasaron que tendría que adaptar para hacer lo
que comento, es decir, que al salir de una celda de la columna código se
ejecute la función (el código estaba pensado para cuando se tiene sólo
la columna CODIGO con los códigos y que se recorra para poner las
DESCRIPCIONES pero como yo ya los tengos sería adaptarla para cuando se
ponga un código nuevo en una celda vacía de la columna):

public sub Recorre()
dim dbMiDB as DAO.Database, rsMiRS as DAO.Recordset,i as integer
Set dbMiDB = DBEngine.Workspaces(0).OpenDatabase([Aquí pon tu base de
datos con ruta completa])
Set rsMiRS=dbMiDB.OpenRecordset([Aqui pon tu origen de
datos],dbOpenSnapshot)
'Recorro la columna hasta que no haya datos. Inicializo los datos
i=1'Primera fila
do until cells(i,1)=""
rsMiRS.FindFirst "CODIGO=" & Cells(i,1)
if not rsMiRS.NoMatch then
cells(i,2)=rsMiRS.Fields("DESCRIPCION")
end if
i=i+1
loop
rsMiRS.close
set rsMiRS=nothing
dbMiDB.close
set dbMiDB=nothing
end sub

Repito que el código en parte me podría valer y lo adaptaría para hacer
lo que quiero, pero por ejemplo, como hacer para que al salir de una
celda se ejecute por ejemplo un MSGBOX en EXCEL?

Quisiera saber eso para entonces intentar lo que comento accediendo
desde EXCEL a la tabla del MDB.

Gracias de nuevo.

Principiante.





Respuesta Responder a este mensaje
#7 Principiante
04/03/2005 - 17:22 | Informe spam
Lo he medio solucionado con un On Error Goto Etiqueta pero lo ideal
sería poder controlar bien ese valor o porqué lo da.

Principiante.

Principiante escribió:
Hola de nuevo, había probado lo de borrar las celdas y la función por
separado y funcionan, es decir, van de maravilla.

Ahora lo que pasa es que desde ACCESS, borro todas las celdas de la hoja
y hago el traspaso, pero antes de poder hacer el traspaso, la función
de la hoja de EXCEL se ejecuta pues se producen cambios en la hoja y
entonces se produce el error de que no coinciden los tipos en:

rsMiRS.FindFirst "CódigoProducto='" & Target & "'"

Supongo que es porque al borrar los datos de las celdas de la columna 1,
ese valor vacio es el que se pasa en TARGET a la función. Pues bien, he
intentado controlar con IsNull(Target.Value), IsEmpty(Target.Value) pero
no se detiene y llega hasta el FindFirst.

Que valor puede ser? Es otra cosa?

Esto si que me mata todo el tema pues es sobre el mismo documento de
EXCEL sobre el que voy a ir trabajando y necesito ir borrando la hoja
cada vez que hago un traspaso.

Gracias por vuestro tiempo.

Principiante.

Fernando Arroyo escribió:

He modificado el código que pones para poder hacer algunas pruebas con
una base de datos que tengo:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 1 Then Exit Sub
Dim dbMiDB As DAO.Database, rsMiRS As DAO.Recordset
Set dbMiDB = DBEngine.Workspaces(0).OpenDatabase("C:\prueba.mdb")
Set rsMiRS = dbMiDB.OpenRecordset("Productos", dbOpenSnapshot)
rsMiRS.FindFirst "CódigoProducto=" & Target
If Not rsMiRS.NoMatch Then
Application.EnableEvents = False
Target.Offset(, 1) = rsMiRS.Fields("NombreProducto")
Application.EnableEvents = True
End If
rsMiRS.Close
Set rsMiRS = Nothing
dbMiDB.Close
Set dbMiDB = Nothing
End Sub

Tendrías que poner los nombres de tu base de datos, la tabla, los
campos...

Si lo pegas en el módulo de la hoja (click derecho sobre su
etiqueta->Ver código), cada vez que se modifique una celda de la
columna A automáticamente se buscará el valor de la celda en la tabla
de Access y, si se encuenta, se pondrá el contenido de otro campo (en
este caso, NombreProducto) en la celda de la columna B de la fila que
se acaba de modificar.
Un saludo.


Fernando Arroyo
MS MVP - Excel

"Principiante" escribió en el mensaje
news:%

Gracias Fernando por la información.

Lo primero ha funcioando a las mil maravillas.

Voy a echar un vistazo a la página a ver si saco algo que me pueda
valer.

Este es el código que me pasaron que tendría que adaptar para hacer
lo que comento, es decir, que al salir de una celda de la columna
código se ejecute la función (el código estaba pensado para cuando se
tiene sólo la columna CODIGO con los códigos y que se recorra para
poner las DESCRIPCIONES pero como yo ya los tengos sería adaptarla
para cuando se ponga un código nuevo en una celda vacía de la columna):

public sub Recorre()
dim dbMiDB as DAO.Database, rsMiRS as DAO.Recordset,i as integer
Set dbMiDB = DBEngine.Workspaces(0).OpenDatabase([Aquí pon tu
base de
datos con ruta completa])
Set rsMiRS=dbMiDB.OpenRecordset([Aqui pon tu origen de
datos],dbOpenSnapshot)
'Recorro la columna hasta que no haya datos. Inicializo los datos
i=1'Primera fila
do until cells(i,1)=""
rsMiRS.FindFirst "CODIGO=" & Cells(i,1)
if not rsMiRS.NoMatch then
cells(i,2)=rsMiRS.Fields("DESCRIPCION")
end if
i=i+1
loop
rsMiRS.close
set rsMiRS=nothing
dbMiDB.close
set dbMiDB=nothing
end sub

Repito que el código en parte me podría valer y lo adaptaría para
hacer lo que quiero, pero por ejemplo, como hacer para que al salir
de una celda se ejecute por ejemplo un MSGBOX en EXCEL?

Quisiera saber eso para entonces intentar lo que comento accediendo
desde EXCEL a la tabla del MDB.

Gracias de nuevo.

Principiante.





Respuesta Responder a este mensaje
#8 Fernando Arroyo
04/03/2005 - 17:34 | Informe spam
"Principiante" escribió en el mensaje news:
Lo he medio solucionado con un On Error Goto Etiqueta pero lo ideal
sería poder controlar bien ese valor o porqué lo da.

Principiante.




Antes de borrar los datos de la hoja, desactiva los eventos mediante

Application.EnableEvents = False

y después del borrado reactívalos con

Application.EnableEvents = True

Un saludo.


Fernando Arroyo
MS MVP - Excel
Respuesta Responder a este mensaje
#9 Fernando Arroyo
04/03/2005 - 17:49 | Informe spam
"Principiante" escribió en el mensaje news:
Abusando un poco :) he probado a usar CurrentProject.Path para que la
ruta no sea C:\ pero me da error al ejecutar el código (he añadido
la referencia de ACCESS). En ACCESS la utilizo para poder "colgar" los
archivos desde la MDB y no tener que llevar la ruta. No se puede en EXCEL?




Puedes averiguar la ruta en la que está guardado el libro mediante su propiedad Path. Por ejemplo, para el libro donde se está ejecutando el código:

ThisWorkbook.Path

Y otra cosilla, en principio tengo pensado que en esta hoja de EXCEL se
realicen todos los traspasos desde ACCESS, es decir, abro el libro, voy
a la hoja, borro las celdas, hago el traspaso y permito (gracias a tu
función) que puedan añadir algún producto mas pues sólo se trasapasan
aquellos artículos que cumplen una determinada condición.

En el caso de que quisiese crear por cada traspaso un archivo de EXCEL
distinto (esto se hacerlo), como se puede añadir esta función a una
hoja?. Pues al crear el archivo tendría que entrar y ponerle la función.
Se puede? Imaginemos que la función la tengo en un módulo de la MDB de
ACCESS por si se puede simplemente acceder desde la hoja EXCEL a esa
función por si es mas fácil.




Si no te quieres complicar demasiado la vida, guarda un libro en que hayas puesto la función como plantilla (Archivo->Guardar como->Plantilla), y basa los libros nuevos en dicha plantilla. Los nuevos libros "heredarán" el código, así como otras características.
Por ejemplo, para crear mediante código un libro nuevo, basándolo en

Dim wkb As Workbook
Set wkb = Workbooks.Add(Template:="C:\Ruta\NombreDeLaPlantilla.xlt")

También se puede hacer por código, usando el objeto VBIDE, pero (a mi juicio) muchas veces no merece la pena...
Un saludo.


Fernando Arroyo
MS MVP - Excel

estos son añadidos pues con lo anterior puedo "funcionar" :).

Bueno, gracias de nuevo.

Principiante.

Respuesta Responder a este mensaje
#10 Principiante
04/03/2005 - 18:03 | Informe spam
Muchas gracias. Es la solución.

Principiante.

Fernando Arroyo escribió:
"Principiante" escribió en el mensaje news:

Lo he medio solucionado con un On Error Goto Etiqueta pero lo ideal
sería poder controlar bien ese valor o porqué lo da.

Principiante.





Antes de borrar los datos de la hoja, desactiva los eventos mediante

Application.EnableEvents = False

y después del borrado reactívalos con

Application.EnableEvents = True

Un saludo.


Fernando Arroyo
MS MVP - Excel



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