Backup de base de datos dividida con ruta relativa

Quería saber si me podrían ayudar, tengo una base de datos que la dividí para que trabaje en entorno de red, y necesito que mediante un botón pueda realizar una backup; y que me permita hacerla en la posición que yo escoja.

2 Respuestas

Respuesta
2

Hola, buen día, Sveinbjorn.

Bueno he estado tratando de combinarlo; pero me sale error en el modulo de la backup, justo en este línea Dim fso As Scripting.FileSystemObject y me dice que no lo he definido, primero busco el archivo a copiar; pero cuando quiero copiarlo me sale error.

Si puedes echarme una mano.

¿Has registrado las referencias que se mencionan en los ejemplos? Para que funcione el Filedialog has de activar la referencia "Microsoft Office x.xx Library"

Hola buen día, si ya lo hice y nada.

Gracias

¿Y esta otra librería también la has registrado: "Microsoft Scripting Runtime"?

El error que comentas en esa línea es porque te faltan librerías por registrar

Hola buen día.

Si es raro ya seleccione todas la librerías pero la verdad no logro que me funcione.

Gracias.

Pues es muy raro que obtengas ese error con esas librerías referenciadas.

Pero como veo que ya lo solucionaste con la ayuda de Pere (básicamente es la misma solución que te proponía yo), no le doy más vueltas a este tema.

Si afortunadamente lo solucione con la ayuda de pere millares; pero sabes me di cuenta que debo tener más cuidado con las referencias a las librerías, la verdad me parece mejor referenciarlas o activarlas por vba. Te agradezco por tu información pues me hiciste caer encuenta de eso también.

Respuesta
1

En el evento del botón deberías llamar a la rutina HacerCopia cuyo código te copio más abajo.

Verás que este código llama a dos funciones que también te copio y que te pueden ser útiles para otras cosas.

Lógicamente deberás cambiar el nombre de la tabla que he usado en el ejemplo (Membres) por el de una tabla vinculada de tu base de datos.

Con ello tendrás una copia de la base de datos que contiene las tablas.

Si quieres hacer una copia de tu BDD front-end, entonces la ruta la puedes obtener así:

Ruta=currentdb.Name

Finalmente, decirte que cuando lances esta rutina no deberás tener ninguna tabla abierta, ni en la ventana de la BDD, ni con código (recordset) ni con un formulario que esté vinculado a una tabla.

Si no lo cierras todo la copia fallará al activarse el archivo .laccdb

Debes tener en cuenta que esta rutina siempre nombra la copia de la misma forma, por lo que deberías:

. Borrar primero la copia previa con un Kill, o

. Modificar esta rutina para que añada al nombre de la copia, por ejemplo, la fecha y hora del dia (función Now).

Espero que te sirva

Sub HacerCopia()

'Requiere Microsoft Office 11.0 Object Library.

Dim Ruta As String, Destino As String, NombreBDD As String

Dim FSO As New FileSystemObject, Carpeta As String

'Obtengo la ruta de la BDD de datos a través de una tabla vinculada

Ruta = CurrentDb.TableDefs("Membres").Connect

'Esto me da un string como este: ;DATABASE=\\Mac\Home\Documents\Access\AJPBS_Taller\AASALDades.accdb

'Ahora quito la parte izquierda de la cadena

Ruta = Replace(Ruta, ";DATABASE=", "")

'Ahora tengo cargada en la variable ruta la duta de la BDD de datos: \\Mac\Home\Documents\Access\AJPBS_Taller\AASALDades.accdb

'Pido al usuario que seleccione la carpeta donde quiere hacer la copia

Destino = EscojeCarpeta(Ruta, "Escoge la carpeta ddonde quieres dejar la copia de la base de datos", "Escoje")

'Verifico que hayan slecionado una una carpeta

If Destino = "" Then Exit Sub

'Obtengo el nombre de la base de datos

NombreBDD = BuscaNombreArchivo(Ruta)

'Añado al nombre del archivo la partícula '_BackUp'

NombreBDD = Replace(NombreBDD, ".", "_BackUp.")

'Completo la ruta de destino

Destino = Destino & "\" & NombreBDD

'Hago la copia

FSO.CopyFile Ruta, Destino, True

End Sub

Function EscojeCarpeta(ByVal RutaBase As String, Missatge As String, TitolBoto As String) As String

'Abre un explorador de Windows para escojer una carpeta

'Requiere Microsoft Office 11.0 Object Library.

Dim Explorador As Office.FileDialog

Set Explorador = Application.FileDialog(msoFileDialogFolderPicker)

'Opciones: msoFileDialogOpen, msoFileDialogSaveAs, msoFileDialogFolderPicker

With Explorador

     .AllowMultiSelect = False

     .Title = Missatge If Right(RutaBase, 1) <> "\" Then RutaBase = RutaBase & "\"

     .InitialFileName = RutaBase .ButtonName = TitolBoto

     If  .Show = True Then

          EscojeCarpeta = .SelectedItems(1)

     Else

          EscojeCarpeta = ""

      End If

End With

End Function

Function BuscaNombreArchivo(Ruta As String) As String

'Devuelve el nombre del archivo a partir de una ruta completa

Dim Posicio As Integer, DarrerMatch

Do

     Posicio = InStr(Posicio + 1, Ruta, "\")

     If Posicio <> 0 Then DarrerMatch = Posicio Else Exit Do

Loop

BuscaNombreArchivo = Right(Ruta, Len(Ruta) - DarrerMatch)

End Function  

Hola buen día.

He estado intentando con el código que me facilitaste; pero no logro que funcione, copie las funciones y luego las llame con un botón para seleccionar carpeta y la otra para la backup, pero parte del código me lo coloca en rojo y no me deja avanzar.

Gracias.

¿Me podrías copiar alguna de las líneas que se ponen de color rojo?

     .Title = Missatge If Right(RutaBase, 1) <> "\" Then RutaBase = RutaBase & "\"

     .InitialFileName = RutaBase .ButtonName = TitolBoto

¿BuscaNombreArchivo esta función la debo llamar en el mismo botón?

En el evento del botón "Al hacer click" únicamente has de llamar a la rutina HacerCopia

Call HacerCopia

Es esta rutina la que llama a las Funciones

Respecto a las líneas que se te ponen en rojo, tiene toda la pinta que no has cargado la libreria Microsoft Office 11.0 Object Library u otra versión superior (yo uso la Microsoft Office 16.0 Object Library)

Para cargarla, cuando estés en la ventana del módulo VBA, en el menú superior escoge Herramientas--> Referencias. Ahí te aparaceran todas las librerías disponibles. Busca la 11 o superior i la activas marcándola con un "tic".

La versión de la librería depende de la versión de Access que estés utilizando

Hola buen día.

Transcribí tu ejemplo tal cual y registre las librerias; pero a un no funciona, si eres tan amable y me das una idea de que puede ser.

Gracias.

Te reproduzco a continuación las librerías que estoy usando para que podamos sincronizarnos

Pruba a conectarlas. La de Outlook no la necesitas.

También te adjunto imagen del programa y la función para que puedas chequear que la tengas bien.

Yo lo que compilado y lo he ejecutado, y funciona correctamente.

Caray que ya seleccione las librerías que me dices y revise el codigo; pero la verdad no encuentro el problema y  sigo con el mismo error.

Seria posible que me envíes un ejemplo que te funcione pues la verdad, no encuentro el error.

Gracias.

Estoy fuera de casa.

Cuando llegue miro de hacer una bdd de prueba y te la mando

Te lo agradezco

Ya he hecho la BDD y funciona.

He estado probando sin algunas de las librerías y la que me daba el error que me indicabas era la Microsoft Scripting Runtime.

¿Ésta también la tienes activada?

Si sí, dame un e-mail donde mandarte la BDD

Si no, actívala y pruébalo de nuevo.

Si la desactive, pero nada, hay alguna forma de que se las active mediante VBA.

[email protected]

Gracias.

Esta precisamente debe estar activada.

En cuanto a hacerlo con VBA, seguro. Pero hace mucho tiempo que no lo uso y debería revisar el modelo de objetos de Access para refrescar el como.

Te he mandado las BDD por correo

Muchas gracias, eres muy amable

Ya lo probé y excelente, Muchas gracias.

Es curioso funciono perfecto, te quedo muy agradecido.

Fantástico

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas