Comprobar que una BBDD Access no esté abierta desde macro Excel

30/11/2009 - 09:40 por Seepy | Informe spam
Hola a todos, os comento el problema que tengo:
Dispongo de un excel con varias llamadas a un BBDD Access con tal de
traerme información para unas cuantas tablas dinámicas. Las llamadas
las hago de la siguiente forma:

Select Case hoja
Case "Hoja1"
'codigo para comprobar si la BBDD está en uso...
ActiveSheet.PivotTableWizard SourceType:=xlExternal,
SourceData:=Array(SQL1), Connection:=Array("ODBC;DSN=MS Access
Database;DBQ=Ruta_donde_tengo_la_BBDD
\BBDD.mdb;DefaultDir=Nombre_de_la_BBDD;DriverId%;FIL=MS
Access;MaxBufferSize@96;PageTimeout;")
Case "Hoja2"
'codigo para comprobar si la BBDD está en uso...
ActiveSheet.PivotTableWizard SourceType:=xlExternal,
SourceData:=Array(SQL2), Connection:=Array("ODBC;DSN=MS Access
Database;DBQ=Ruta_donde_tengo_la_BBDD
\BBDD.mdb;DefaultDir=Nombre_de_la_BBDD;DriverId%;FIL=MS
Access;MaxBufferSize@96;PageTimeout;")
Case "Hoja3"
'codigo para comprobar si la BBDD está en uso...
ActiveSheet.PivotTableWizard SourceType:=xlExternal,
SourceData:=Array(SQL3), Connection:=Array("ODBC;DSN=MS Access
Database;DBQ=Ruta_donde_tengo_la_BBDD
\BBDD.mdb;DefaultDir=Nombre_de_la_BBDD;DriverId%;FIL=MS
Access;MaxBufferSize@96;PageTimeout;")

El problema viene cuando, tras realizar la primera de las llamadas,
paso a la siguiente y según parece la BBDD se queda como "abierta",
entonces me lanza un error de automatización -21474417848 (80010108),
el cual según parece trata de acceder a la BBDD, pero como está
abierta... además aparece siempre en el directorio donde tengo la BBDD
un fichero con el mismo nombre que la BBDD, pero con extensión .lbd,
que cuando lo borro manualmente, me permite funcionar correctamente.

Ahora bien, lo que me gustaría que me ayudarais es a comprobar antes
de hacer la llamada a la BBDD si está abierta y en caso de que así
sea, cerrarla o eliminar este fichero .lbd, para evitarme estos
errores que me están dando un gran dolor de cabeza.

Muchas gracias por adelantado. Un saludo a todos!

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
01/12/2009 - 04:07 | Informe spam
hola, !

... varias llamadas a un BBDD Access con tal de traerme informacion para unas... tablas dinamicas.
Las llamadas las hago de la siguiente forma: ... (codigo al final ...)
El problema viene cuando, tras realizar la primera de las llamadas, paso a la siguiente
y segun parece la BBDD se queda como "abierta", entonces me lanza un error de automatizacion -21474417848 (80010108)
el cual segun parece trata de acceder a la BBDD, pero como esta abierta...
ademas aparece siempre en el directorio donde tengo la BBDD un fichero con el mismo nombre que la BBDD
pero con extension .lbd, que cuando lo borro manualmente, me permite funcionar correctamente.
Ahora bien, lo que me gustaria que me ayudarais es a comprobar antes de hacer la llamada a la BBDD si esta abierta
y en caso de que asi sea, cerrarla o eliminar este fichero .lbd, para evitarme estos errores que me estan dando un gran dolor de cabeza.



1) si borrar el archivo "fantasma" resuelve todos tus problemas de conexion (?), prueba con una linea +/- como esta:

if (dir("ruta completa donde se genera el archivo .LDB") <> "" then kill "ruta completa donde se genera el archivo .LDB"

2) comprobar si el archivo que consultas (DDBB de access) esta "abierto aun", podria requerir de que informes mas detalles (p.e.)

a) el metodo PivotTableWizard (aunque no presenta al asistente)... CREA el origen (o re-defne el arreglo) de una TD
es lo mismo que usar el asistente para casi-casi empezar desde CERO la definicion y el arreglo de los campos de la TD
REQUIERE: que la hoja donde se ha de activar el asistente...
o NO contenga ninguna TD (dicha hoja se auto-activa despues del asistente) o...
o SEA la hoja activa y la primer celda de la TD este como activa -tambien-
de lo contrario, el metodo PovotTableWizard fallara !!!

b) dentro del cripticismo de algunas fracciones de la fraccion de codigo que expones...
- no queda claro si esta parte (la conexion de tu cadenas): "...;DefaultDir=Nombre_de_la_BBDD;..."
esta haciendo referencia AL NOMBRE de la DDBB, o... A LA RUTA donde esta almacenada (???)
- tampoco es claro si se trata de la misma DDBB o que es lo que cambia "segun" el case ("hoja1", etc.) -???-

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ (fraccion d)el codigo expuesto __
Select Case hoja
Case "Hoja1"
'codigo para comprobar si la BBDD esta en uso...
ActiveSheet.PivotTableWizard SourceType:=xlExternal, SourceData:=Array(SQL1), Connection:=Array("ODBC;DSN=MS Access Database;DBQ=Ruta_donde_tengo_la_BBDD\BBDD.mdb;DefaultDir=Nombre_de_la_BBDD;DriverId%;FIL=MS Access;;PageTimeout;")
Case "Hoja2"
'codigo para comprobar si la BBDD esta en uso...
ActiveSheet.PivotTableWizard SourceType:=xlExternal, SourceData:=Array(SQL2), Connection:=Array("ODBC;DSN=MS Access Database;DBQ=Ruta_donde_tengo_la_BBDD\BBDD.mdb;DefaultDir=Nombre_de_la_BBDD;DriverId%;FIL=MS Access;;PageTimeout;")
Case "Hoja3"
'codigo para comprobar si la BBDD esta en uso...
ActiveSheet.PivotTableWizard SourceType:=xlExternal, SourceData:=Array(SQL3), Connection:=Array("ODBC;DSN=MS Access
Database;DBQ=Ruta_donde_tengo_la_BBDD\BBDD.mdb;DefaultDir=Nombre_de_la_BBDD;DriverId%;FIL=MS
Access;;PageTimeout;")
Respuesta Responder a este mensaje
#2 Seepy
01/12/2009 - 11:38 | Informe spam
On 1 dic, 04:07, "Héctor Miguel"
wrote:
hola, !

> ... varias llamadas a un BBDD Access con tal de traerme informacion para unas... tablas dinamicas.
> Las llamadas las hago de la siguiente forma: ... (codigo al final ...)
> El problema viene cuando, tras realizar la primera de las llamadas, paso a la siguiente
> y segun parece la BBDD se queda como "abierta", entonces me lanza un error de automatizacion -21474417848 (80010108)
> el cual segun parece trata de acceder a la BBDD, pero como esta abierta...
> ademas aparece siempre en el directorio donde tengo la BBDD un fichero con el mismo nombre que la BBDD
> pero con extension .lbd, que cuando lo borro manualmente, me permite funcionar correctamente.
> Ahora bien, lo que me gustaria que me ayudarais es a comprobar antes de hacer la llamada a la BBDD si esta abierta
> y en caso de que asi sea, cerrarla o eliminar este fichero .lbd, para evitarme estos errores que me estan dando un gran dolor de cabeza.

1) si borrar el archivo "fantasma" resuelve todos tus problemas de conexion (?), prueba con una linea +/- como esta:

  if (dir("ruta completa donde se genera el archivo .LDB") <> "" then kill "ruta completa donde se genera el archivo .LDB"

2) comprobar si el archivo que consultas (DDBB de access) esta "abierto aun", podria requerir de que informes mas detalles (p.e.)

    a) el metodo PivotTableWizard (aunque no presenta al asistente)... CREA el origen (o re-defne el arreglo) de una TD
        es lo mismo que usar el asistente para casi-casi empezar desde CERO la definicion y el arreglo de los campos de la TD
        REQUIERE: que la hoja donde se ha de activar el asistente...
        o NO contenga ninguna TD (dicha hoja se auto-activa despues del asistente) o...
        o SEA la hoja activa y la primer celda de la TD este como activa -tambien-
           de lo contrario, el metodo PovotTableWizard fallara !!!

    b) dentro del cripticismo de algunas fracciones de la fraccion de codigo que expones...
        - no queda claro si esta parte (la conexion de tu cadenas): "...;DefaultDir=Nombre_de_la_BBDD;..."
          esta haciendo referencia AL NOMBRE de la DDBB, o... A LA RUTA donde esta almacenada (???)
        - tampoco es claro si se trata de la misma DDBB o que es lo que cambia "segun" el case ("hoja1", etc.)  -???-

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ (fraccion d)el codigo expuesto __
Select Case hoja
        Case "Hoja1"
    'codigo para comprobar si la BBDD esta en uso...
            ActiveSheet.PivotTableWizard SourceType:=xlExternal, SourceData:=Array(SQL1), Connection:=Array("ODBC;DSN=MS Access Database;DBQ=Ruta_donde_tengo_la_BBDD\BBDD.mdb;DefaultDir=Nombre_de_la_BBDD­;DriverId%;FIL=MS Access;;PageTimeout;")
        Case "Hoja2"
    'codigo para comprobar si la BBDD esta en uso...
            ActiveSheet.PivotTableWizard SourceType:=xlExternal, SourceData:=Array(SQL2), Connection:=Array("ODBC;DSN=MS Access Database;DBQ=Ruta_donde_tengo_la_BBDD\BBDD.mdb;DefaultDir=Nombre_de_la_BBDD­;DriverId%;FIL=MS Access;;PageTimeout;")
        Case "Hoja3"
    'codigo para comprobar si la BBDD esta en uso...
            ActiveSheet.PivotTableWizard SourceType:=xlExternal, SourceData:=Array(SQL3), Connection:=Array("ODBC;DSN=MS Access
Database;DBQ=Ruta_donde_tengo_la_BBDD\BBDD.mdb;DefaultDir=Nombre_de_la_BBDD­;DriverId%;FIL=MS
Access;;PageTimeout;")



Gracias por responder, te comento punto por punto:

1) He tratado de borrar ese fichero con ese tipo de instrucción, pero
no parece hacer la acción, puesto que no lo borra muchas veces, porque
según parece la BBDD se queda "abierta indefinidamente" y el código no
puede seguir para borrar el fichero. ¿Cómo podría manejar el error que
me aparece -2147417848 (80010108) Error de automatización, para que
siguiera el código o hiciera el borrado de ese fichero y volviera a
probar?

2) a) Cuando empleo este método, tengo la precaución de ubicarme en la
primera celda de una TD existente para poder volver a llamar. Lo que
se trata es que a partir de un archivo XML me traigo la configuración
de datos que quiero mostrar en la TD, por eso ese montaje.
b) -En DefaultDir pongo tan sólo el nombre de la BBDD son la
extensión .mdb, realmente no sé porqué, pero me está funcionando así
en muchas veces
-En los cases, realmente cambio la tabla o consulta a la que accedo,
pero de la misma BBDD. Hace llamadas a diferentes SQL1, SQL2, SQL3.Te
pongo ejemplo:
Private Function SQL1() As String
SQL1 = ""
SQL1 = "SELECT Tbl.*" & Chr(13) & "" & Chr(10) & "FROM `RutaBBDD
ombreBBDD`.nombreconsulta1 Tbl"
SQL1 = SQL1 & Chr(13) & "" & Chr(10)
SQL1 = SQL1 & "WHERE (Tbl.Acceso= '" & Acceso & "') and
(Tbl.Entrad=1)
End Function
Private Function SQL2() As String
SQL2 = ""
SQL2 = "SELECT Tbl.*" & Chr(13) & "" & Chr(10) & "FROM `RutaBBDD
ombreBBDD`.nombreconsulta2 Tbl"
SQL2 = SQL2 & Chr(13) & "" & Chr(10)
SQL2 = SQL2 & "WHERE (Tbl.Acceso= '" & Acceso & "') and
(Tbl.Entrad=1)
End Function
Private Function SQL3() As String
SQL3 = ""
SQL3 = "SELECT Tbl.*" & Chr(13) & "" & Chr(10) & "FROM `RutaBBDD
ombreBBDD`.nombreconsulta3 Tbl"
SQL3 = SQL3 & Chr(13) & "" & Chr(10)
SQL3 = SQL3 & "WHERE (Tbl.Acceso= '" & Acceso & "') and
(Tbl.Entrad=1)
End Function

Muchas gracias por la ayuda prestada!
Respuesta Responder a este mensaje
#3 Héctor Miguel
01/12/2009 - 20:54 | Informe spam
hola, !

1) He tratado de borrar ese fichero con ese tipo de instruccion, pero no parece hacer la accion
puesto que no lo borra muchas veces porque segun parece la BBDD se queda "abierta indefinidamente"
y el codigo no puede seguir para borrar el fichero.



es probable que el *.LDB sea generado durante el proceso de la consulta (?)
en ese caso, convendria probar esa linea (kill ...) como ultima instruccion de la macro (no como instruccion "previa")

Como podria manejar el error que me aparece -2147417848 (80010108) Error de automatizacion
para que siguiera el codigo o hiciera el borrado de ese fichero y volviera a probar?



en otra consulta (a la que no diste seguimiento), ya te habia comentado que este tipo de errores (800xxx y -2147xxx)
se ocasionan por codigos que hacen "llamadas" a clientes, provedores, objetos, ... que NO estan disponibles al llamarlos

b) -En DefaultDir pongo tan solo el nombre de la BBDD son la extension .mdb
realmente no se porque, pero me esta funcionando asi en muchas veces



prueba especificando en esa parte (solamente) "la ruta" (por ello el parametro se llama "DefaultDir")

-En los cases, realmente cambio la tabla o consulta a la que accedo
pero de la misma BBDD. Hace llamadas a diferentes SQL1, SQL2, SQL3. Te pongo ejemplo:
Private Function SQL1() As String
SQL1 = ""
SQL1 = "SELECT Tbl.*" & Chr(13) & "" & Chr(10) & "FROM `RutaBBDDombreBBDD`.nombreconsulta1 Tbl"
SQL1 = SQL1 & Chr(13) & "" & Chr(10)
SQL1 = SQL1 & "WHERE (Tbl.Acceso= '" & Acceso & "') and (Tbl.Entrad=1)
End Function
[ ... ]



tambien (en esa otra consulta) te preguntaba por el "caracter" (real) que necesitas administrar en la cadena "SQL"
siendo una variable de tipo String (texto puro y duro), no se cual es el sentido de mezclar: Chr(10) y Chr(13)
estas son secuencias que corresponden a "saltos de linea" y "avances de carro" (no creo que apliquen a una "consulta") -???-

saludos,
hector.
Respuesta Responder a este mensaje
#4 Jumpas
03/12/2009 - 10:38 | Informe spam
perdonar que me meta

el archivo .ldb que se genera es el que tiene los bloqueos de la base de
datos y se crea al abrirla, bien con acces o con codigo VB o VBA, creo que lo
primero que tienes que hacer es ver si esta abierta por ti o por otra
aplicación y cerrarla para poder abrirla con tu codigo VBA y luego cada vez
que haces la llamada con codigo antes de hacer otra llamada cerrara, tiene
que haber una instrucción .Close que realiza esa acción

Se que no es mucho pero si se que es la forma correcta aunque no se
explicarte como hacerlo con VBA.

"Héctor Miguel" escribió:

hola, !

1) He tratado de borrar ese fichero con ese tipo de instruccion, pero no parece hacer la accion
> puesto que no lo borra muchas veces porque segun parece la BBDD se queda "abierta indefinidamente"
> y el codigo no puede seguir para borrar el fichero.

es probable que el *.LDB sea generado durante el proceso de la consulta (?)
en ese caso, convendria probar esa linea (kill ...) como ultima instruccion de la macro (no como instruccion "previa")

> Como podria manejar el error que me aparece -2147417848 (80010108) Error de automatizacion
> para que siguiera el codigo o hiciera el borrado de ese fichero y volviera a probar?

en otra consulta (a la que no diste seguimiento), ya te habia comentado que este tipo de errores (800xxx y -2147xxx)
se ocasionan por codigos que hacen "llamadas" a clientes, provedores, objetos, ... que NO estan disponibles al llamarlos

> b) -En DefaultDir pongo tan solo el nombre de la BBDD son la extension .mdb
> realmente no se porque, pero me esta funcionando asi en muchas veces

prueba especificando en esa parte (solamente) "la ruta" (por ello el parametro se llama "DefaultDir")

> -En los cases, realmente cambio la tabla o consulta a la que accedo
> pero de la misma BBDD. Hace llamadas a diferentes SQL1, SQL2, SQL3. Te pongo ejemplo:
> Private Function SQL1() As String
> SQL1 = ""
> SQL1 = "SELECT Tbl.*" & Chr(13) & "" & Chr(10) & "FROM `RutaBBDDombreBBDD`.nombreconsulta1 Tbl"
> SQL1 = SQL1 & Chr(13) & "" & Chr(10)
> SQL1 = SQL1 & "WHERE (Tbl.Acceso= '" & Acceso & "') and (Tbl.Entrad=1)
> End Function
> [ ... ]

tambien (en esa otra consulta) te preguntaba por el "caracter" (real) que necesitas administrar en la cadena "SQL"
siendo una variable de tipo String (texto puro y duro), no se cual es el sentido de mezclar: Chr(10) y Chr(13)
estas son secuencias que corresponden a "saltos de linea" y "avances de carro" (no creo que apliquen a una "consulta") -???-

saludos,
hector.


.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida