Anónimo
Hipervínculo utilizando comando que abra explorer
Quisiera introducir un hipervínculo en un campo, utilizando un comando que abra el explorer en una carpeta que esta al lado del archivo access i ponga el hipervínculo que quiera en el campo en cuestión.
Es muy complicado o hay alguna forma de hacer-lo
Es muy complicado o hay alguna forma de hacer-lo
1 respuesta
Respuesta de Neckkito Nck
4
4
No acabo de entender tu consulta. No entiendo qué quieres decir con eso de "abrir el explorer en una carpeta que está al lado del archivo access". ¿Te refieres al navegador o al explorador de windows?
¿Podrías especificar un poco más lo que quieres hacer, por favor? Y, si añades un ejemplo, ya sería... fantástico.
Gracias.
¿Podrías especificar un poco más lo que quieres hacer, por favor? Y, si añades un ejemplo, ya sería... fantástico.
Gracias.
Buenas,
Gracias por la rapidez, lo que quería decir era el explorador de windows. Lo que quiero en general es introducir facturas en pdf(como hipervínculos) rápidamente en la base. Lo que quisiera seria lo siguiente:
1-Al hacer click en un botón de comando de un formulario se abra el explorador de windows.
2-El explorador se abre en la misma carpeta que contiene el archivo de access o una otra que esté al mismo nivel, por ejemplo: si el archivo es c:\companyia\base.accdb, la carpeta que se abra sea c:\companyia\ o c:\companyia\facturas\
3-Yo seleccionaré el archivo necesario, i este se tendría que guardar como hipervínculo en un registro del formulario facturas.
*En el paso dos hay alguna forma de no poner toda la ruta, sinó que lea la ruta a partir de donde se encuentra \base.accdb, los hipervinculos también tienen que ser enteros o pueden partir del archivo
Muchísimas gracias
rai
Gracias por la rapidez, lo que quería decir era el explorador de windows. Lo que quiero en general es introducir facturas en pdf(como hipervínculos) rápidamente en la base. Lo que quisiera seria lo siguiente:
1-Al hacer click en un botón de comando de un formulario se abra el explorador de windows.
2-El explorador se abre en la misma carpeta que contiene el archivo de access o una otra que esté al mismo nivel, por ejemplo: si el archivo es c:\companyia\base.accdb, la carpeta que se abra sea c:\companyia\ o c:\companyia\facturas\
3-Yo seleccionaré el archivo necesario, i este se tendría que guardar como hipervínculo en un registro del formulario facturas.
*En el paso dos hay alguna forma de no poner toda la ruta, sinó que lea la ruta a partir de donde se encuentra \base.accdb, los hipervinculos también tienen que ser enteros o pueden partir del archivo
Muchísimas gracias
rai
Te explico cómo debes hacer lo que pides. De hecho, lo vamos a hacer en tres fases. Voy a dar por supuestas un par de cosas:
En la tabla donde debas guardar esa ruta tendrás un campo. Ese campo debe ser de tipo texto, con una longitud grande porque piensa que debe almacenar toda la ruta más el nombre de archivo y la extensión.
El cuadro de texto de tu formulario, que debe recoger la ruta y el archivo, lo llamaré [Archivo]. Tú deberás cambiar ese nombre por el tuyo (Propiedades del campo -> Pestaña Otras->Nombre)
FASE 1
1.- Abres la BD y, cuando se haya abierto, pulsas las teclas ALT+F11. Se te abrirá el editor de VB (VBE).
2.- Te vas a menú Herramientas->Referencias, y miras si tienes registrada la biblioteca "Microsoft Office 12.0 Object Library". Si no la tienes la buscas en la lista, marcas su check y aceptas. Así ya la tendrás registrada
3.- Ahora te vas a menú Insertar->Módulo. En el nuevo módulo (que puedes guardar con el nombre que te sale por defecto) escribes lo siguiente
---
Public Function buscaArchivo() As String
'Requiere referencia a Microsoft Office 12.0 Object Library.
Dim fDialog As Office.FileDialog
'Set up the File Dialog.
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
.AllowMultiSelect = False
.ButtonName = "Seleccionar"
.Title = "Seleccionar el archivo o la carpeta"
.InitialFileName = Application.CurrentProject.Path
.InitialView = msoFileDialogViewDetails
.Filters.Clear
.Filters.Add "All Files", "*.*"
If .Show = True Then
buscaArchivo = .SelectedItems(1)
Else
MsgBox "Ha pulsado el botón <Cancelar>."
End If
End With
End Function
---
Ya tenemos la función creada. Vamos a la fase siguiente
FASE 2
1.- Abres tu formulario de trabajo en vista diseño. Ahí añades un botón de comando y le pones de nombre cmdBuscaArchivo (Propiedades->Pestaña Otras->Nombre)
2- Todavía en las propiedades del botón te vas a la Pestaña Eventos->Al hacer click, y le generas el siguiente código:
---
Private Sub cmdBuscaArchivo_Click()
Dim vFile As Variant
vFile = buscaArchivo()
Me.Archivo.Value = vFile
End Sub
---
Con esto la ruta te pasará al campo [Archivo]
FASE 3
1.- Sacas las propiedades del campo [Archivo] del formulario de trabajo. Te vas a la pestaña Eventos->Al hacer click, y le generas el código:
---
Private Sub Archivo_Click()
Dim vDir As String
vDir = Me.Archivo.Value
Application.FollowHyperlink (vDir)
End Sub
---
Y ya está. Si tienes algún problema me lo comentas e intentamos ponerle solución.
En la tabla donde debas guardar esa ruta tendrás un campo. Ese campo debe ser de tipo texto, con una longitud grande porque piensa que debe almacenar toda la ruta más el nombre de archivo y la extensión.
El cuadro de texto de tu formulario, que debe recoger la ruta y el archivo, lo llamaré [Archivo]. Tú deberás cambiar ese nombre por el tuyo (Propiedades del campo -> Pestaña Otras->Nombre)
FASE 1
1.- Abres la BD y, cuando se haya abierto, pulsas las teclas ALT+F11. Se te abrirá el editor de VB (VBE).
2.- Te vas a menú Herramientas->Referencias, y miras si tienes registrada la biblioteca "Microsoft Office 12.0 Object Library". Si no la tienes la buscas en la lista, marcas su check y aceptas. Así ya la tendrás registrada
3.- Ahora te vas a menú Insertar->Módulo. En el nuevo módulo (que puedes guardar con el nombre que te sale por defecto) escribes lo siguiente
---
Public Function buscaArchivo() As String
'Requiere referencia a Microsoft Office 12.0 Object Library.
Dim fDialog As Office.FileDialog
'Set up the File Dialog.
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
.AllowMultiSelect = False
.ButtonName = "Seleccionar"
.Title = "Seleccionar el archivo o la carpeta"
.InitialFileName = Application.CurrentProject.Path
.InitialView = msoFileDialogViewDetails
.Filters.Clear
.Filters.Add "All Files", "*.*"
If .Show = True Then
buscaArchivo = .SelectedItems(1)
Else
MsgBox "Ha pulsado el botón <Cancelar>."
End If
End With
End Function
---
Ya tenemos la función creada. Vamos a la fase siguiente
FASE 2
1.- Abres tu formulario de trabajo en vista diseño. Ahí añades un botón de comando y le pones de nombre cmdBuscaArchivo (Propiedades->Pestaña Otras->Nombre)
2- Todavía en las propiedades del botón te vas a la Pestaña Eventos->Al hacer click, y le generas el siguiente código:
---
Private Sub cmdBuscaArchivo_Click()
Dim vFile As Variant
vFile = buscaArchivo()
Me.Archivo.Value = vFile
End Sub
---
Con esto la ruta te pasará al campo [Archivo]
FASE 3
1.- Sacas las propiedades del campo [Archivo] del formulario de trabajo. Te vas a la pestaña Eventos->Al hacer click, y le generas el código:
---
Private Sub Archivo_Click()
Dim vDir As String
vDir = Me.Archivo.Value
Application.FollowHyperlink (vDir)
End Sub
---
Y ya está. Si tienes algún problema me lo comentas e intentamos ponerle solución.
Buenas,
Funciona todo a la perfección, solo una última aclaración. En AutoCad, por ejemplo, al introducir una referencia externa puedes decir que te guarde la ruta como 'relative path', así en lugar de guardar toda la ruta, te la guarda con referencia al archivo principal. Esto va bien para compartir los archivos entre varia gente, porque cada uno guarda la carpeta que lo contiene todo en un lugar distinto. La pregunta es: ¿Se puede hacer un 'relativapath' en Access? Un ejemplo:
-Archivo = c:\empresa\datos.accdb
-Referéncia = c:\empresa\facturas\pdf1.pdf
-Referéncia a guardar = .\facturas\pdf1.pdf
Así al mover la carpeta 'empresa' de sitio se guardan correctamente los hipervínculos
Muchísimas gracias de nuevo,
rai
Funciona todo a la perfección, solo una última aclaración. En AutoCad, por ejemplo, al introducir una referencia externa puedes decir que te guarde la ruta como 'relative path', así en lugar de guardar toda la ruta, te la guarda con referencia al archivo principal. Esto va bien para compartir los archivos entre varia gente, porque cada uno guarda la carpeta que lo contiene todo en un lugar distinto. La pregunta es: ¿Se puede hacer un 'relativapath' en Access? Un ejemplo:
-Archivo = c:\empresa\datos.accdb
-Referéncia = c:\empresa\facturas\pdf1.pdf
-Referéncia a guardar = .\facturas\pdf1.pdf
Así al mover la carpeta 'empresa' de sitio se guardan correctamente los hipervínculos
Muchísimas gracias de nuevo,
rai
El tema de la ruta relativa al manejar un Access, desde yo sé, depende siempre de donde tienes ubicada la base de datos. Es decir, que la ruta relativa que el código captura es siempre la de la BD.
Es a partir de ahí donde tienes que operar manualmente.
Como supongo que lo anterior te sonará un poco a chino (je, je...) te explico primero cómo hacer lo que pides y después te comento el tema "manual".
1.- Abres el VBE de la BD y creas un nuevo módulo. En ese módulo escribes las siguientes funciones:
---
Private Declare Function GetFileTitle _
Lib "comdlg32.dll" _
Alias "GetFileTitleA" ( _
ByVal lpszFile As String, _
ByVal lpszTitle As String, _
ByVal cbBuf As Integer) As Integer
Public Function pilloNombre(ByVal p As String) As String
Dim Buffer As String
'Buffer de caracteres
Buffer = String(255, 0)
'Llamada a GetFileTitle, pasándole el path, el buffer y el tamaño
GetFileTitle p, Buffer, Len(Buffer)
'Retornamos el nombre eliminando los espacios nulos
pilloNombre = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
End Function
---
2.- El código que tienes asociado al botón lo tenemos que modificar ligeramente. Por eso debes sustituirlo por el siguiente:
---
Private Sub...
Dim vFile As Variant
vFile = buscaArchivo()
vFile = pilloNombre(vFile)
Me.Archivo.Value = vFile
End Sub
---
3.- Y ahora el código del campo (el del evento "Al hacer click") lo tenemos también que cambiar un poco. Debes poner lo siguiente:
---
Private Sub...
Dim vDir As String
vDir = Application.CurrentProject.Path & "\"
vDir = vDir & Me.Archivo.Value
Application.FollowHyperlink (vDir)
End Sub
---
Y ahora vamos a la explicación de lo "manual". El código anterior te funcionará siempre y cuando los archivos estén en el mismo directorio en el que está la base de datos. Supongamos que la BD está en c:\Bases\MiBase.accdb. Ahí también tendrás los archivos que quieres abrir a través del hipervínculo. ¿Los quieres meter en la carpeta Facturas? Pues, mientras respetes la ruta c:\Bases\ no hay problema. Ahora los archivos los metes en la carpeta Facturas. Por ejemplo, la ruta de la "factura1" sería c:\Bases\Facturas\Factura1.xlsx. ¿OK?
Pues si quieres eso lo que tienes que hacer es coger el último de los códigos e indicárselo a Access. Te explico:
Application. CurrentProject. Path -> te coge la ruta donde está la BD
Luego esa línea te debería quedar así:
vDir = Application.CurrentProject.Path & "\Facturas\"
Y eso es todo. Creo que habrás "pillado" la idea de cómo, a partir de la ruta relativa de Access, indicarle toda la ruta del archivo al código VBA para poderlo abrir.
Sort! ;)
Es a partir de ahí donde tienes que operar manualmente.
Como supongo que lo anterior te sonará un poco a chino (je, je...) te explico primero cómo hacer lo que pides y después te comento el tema "manual".
1.- Abres el VBE de la BD y creas un nuevo módulo. En ese módulo escribes las siguientes funciones:
---
Private Declare Function GetFileTitle _
Lib "comdlg32.dll" _
Alias "GetFileTitleA" ( _
ByVal lpszFile As String, _
ByVal lpszTitle As String, _
ByVal cbBuf As Integer) As Integer
Public Function pilloNombre(ByVal p As String) As String
Dim Buffer As String
'Buffer de caracteres
Buffer = String(255, 0)
'Llamada a GetFileTitle, pasándole el path, el buffer y el tamaño
GetFileTitle p, Buffer, Len(Buffer)
'Retornamos el nombre eliminando los espacios nulos
pilloNombre = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
End Function
---
2.- El código que tienes asociado al botón lo tenemos que modificar ligeramente. Por eso debes sustituirlo por el siguiente:
---
Private Sub...
Dim vFile As Variant
vFile = buscaArchivo()
vFile = pilloNombre(vFile)
Me.Archivo.Value = vFile
End Sub
---
3.- Y ahora el código del campo (el del evento "Al hacer click") lo tenemos también que cambiar un poco. Debes poner lo siguiente:
---
Private Sub...
Dim vDir As String
vDir = Application.CurrentProject.Path & "\"
vDir = vDir & Me.Archivo.Value
Application.FollowHyperlink (vDir)
End Sub
---
Y ahora vamos a la explicación de lo "manual". El código anterior te funcionará siempre y cuando los archivos estén en el mismo directorio en el que está la base de datos. Supongamos que la BD está en c:\Bases\MiBase.accdb. Ahí también tendrás los archivos que quieres abrir a través del hipervínculo. ¿Los quieres meter en la carpeta Facturas? Pues, mientras respetes la ruta c:\Bases\ no hay problema. Ahora los archivos los metes en la carpeta Facturas. Por ejemplo, la ruta de la "factura1" sería c:\Bases\Facturas\Factura1.xlsx. ¿OK?
Pues si quieres eso lo que tienes que hacer es coger el último de los códigos e indicárselo a Access. Te explico:
Application. CurrentProject. Path -> te coge la ruta donde está la BD
Luego esa línea te debería quedar así:
vDir = Application.CurrentProject.Path & "\Facturas\"
Y eso es todo. Creo que habrás "pillado" la idea de cómo, a partir de la ruta relativa de Access, indicarle toda la ruta del archivo al código VBA para poderlo abrir.
Sort! ;)
Muchísimas gracias, todo funciona a la perfección, i además le he puesto que coja como subcarpeta un valor de un cuadro combinado i todo bien, excepto una cosilla que he resuelto temporalment, el modulo que me describiste en la anterior respuesta solo coge el nombre del archivo, y no su extensión, por eso he hecho lo siguiente en el código del campo:
Private Sub pdfFactura_Click()
Dim vDir As String
vDir = Application.CurrentProject.Path & "\" & Me.Producte.Column(1) & "\07 Factures\"
vDir = vDir & Me.pdfFactura.Value & ".pdf"
Application.FollowHyperlink (vDir)
End Sub
En principio siempre seran .pdf, pero, ¿y si no lo fueran?
-El modulo1 quedó así:
Public Function buscaArchivo() As String
'Requiere referencia a Microsoft Office 12.0 Object Library.
Dim fDialog As Office.FileDialog
'Set up the File Dialog.
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
.AllowMultiSelect = False
.ButtonName = "Seleccionar"
.Title = "Seleccionar el archivo o la carpeta"
.InitialFileName = Application.CurrentProject.Path & "\" & Form_Factures.Producte.Column(1) & "\07 Factures\"
.InitialView = msoFileDialogViewDetails
.Filters.Clear
.Filters.Add "All Files", "*.*"
If .Show = True Then
buscaArchivo = .SelectedItems(1)
Else
MsgBox "Ha pulsado el botón <Cancelar>."
End If
End With
End Function
-el modulo 2 quedó así:
Private Declare Function GetFileTitle _
Lib "comdlg32.dll" _
Alias "GetFileTitleA" ( _
ByVal lpszFile As String, _
ByVal lpszTitle As String, _
ByVal cbBuf As Integer) As Integer
Public Function pilloNombre(ByVal p As String) As String
Dim Buffer As String
'Buffer de caracteres
Buffer = String(255, 0)
'Llamada a GetFileTitle, pasandole el path, el buffer y el tamaño
GetFileTitle p, Buffer, Len(Buffer)
'Retornamos el nombre eliminando los espacios nulos
pilloNombre = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
End Function
-i el boton de comando tal que así:
Private Sub cmdBuscaArchivo_Click()
Dim vFile As Variant
vFile = buscaArchivo()
vFile = pilloNombre(vFile)
Me.pdfFactura.Value = vFile
End Sub
Este problema con la extensión no es muy importante, así que no corre prisa, ahora ya seria curiosidad.
Private Sub pdfFactura_Click()
Dim vDir As String
vDir = Application.CurrentProject.Path & "\" & Me.Producte.Column(1) & "\07 Factures\"
vDir = vDir & Me.pdfFactura.Value & ".pdf"
Application.FollowHyperlink (vDir)
End Sub
En principio siempre seran .pdf, pero, ¿y si no lo fueran?
-El modulo1 quedó así:
Public Function buscaArchivo() As String
'Requiere referencia a Microsoft Office 12.0 Object Library.
Dim fDialog As Office.FileDialog
'Set up the File Dialog.
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
.AllowMultiSelect = False
.ButtonName = "Seleccionar"
.Title = "Seleccionar el archivo o la carpeta"
.InitialFileName = Application.CurrentProject.Path & "\" & Form_Factures.Producte.Column(1) & "\07 Factures\"
.InitialView = msoFileDialogViewDetails
.Filters.Clear
.Filters.Add "All Files", "*.*"
If .Show = True Then
buscaArchivo = .SelectedItems(1)
Else
MsgBox "Ha pulsado el botón <Cancelar>."
End If
End With
End Function
-el modulo 2 quedó así:
Private Declare Function GetFileTitle _
Lib "comdlg32.dll" _
Alias "GetFileTitleA" ( _
ByVal lpszFile As String, _
ByVal lpszTitle As String, _
ByVal cbBuf As Integer) As Integer
Public Function pilloNombre(ByVal p As String) As String
Dim Buffer As String
'Buffer de caracteres
Buffer = String(255, 0)
'Llamada a GetFileTitle, pasandole el path, el buffer y el tamaño
GetFileTitle p, Buffer, Len(Buffer)
'Retornamos el nombre eliminando los espacios nulos
pilloNombre = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
End Function
-i el boton de comando tal que así:
Private Sub cmdBuscaArchivo_Click()
Dim vFile As Variant
vFile = buscaArchivo()
vFile = pilloNombre(vFile)
Me.pdfFactura.Value = vFile
End Sub
Este problema con la extensión no es muy importante, así que no corre prisa, ahora ya seria curiosidad.
Debo decirte que con esta última pregunta me has pillado. He estado navegando (un buen rato) por Internet pero he sido incapaz de encontrar una solución. En pocas palabras, que no tengo ni idea del tema de cómo se puede detectar el tipo de archivo a través de VBA.
Te apunto un par de ideas por si pueden serte de utilidad. Quizás puedas adaptar alguna a tu BD de una manera "sencilla" y te solvente el problema, aunque sea un poco más "manual".
1.- El código que te pasé a mí me funcionaba perfecto porque yo tengo configurado mi Windows para que me muestre las extensiones de archivo. Por ello, al coger el nombre del archivo, el campo no sólo se me rellenaba con el nombre del archivo sino también con la extensión. Por ello, si te interesase, puedes cambiar la configuración de Windows para que te muestre las extensiones de archivo y, de rebote, se te arreglará el tema de la BD (lógicamente deberás adaptar un poco el código a la nueva situación).
Si no sabes cómo configurar Windows para eso me lo comentas y te lo explico.
2.- Otra opción, también "manual", es crear un cuadro de opciones (un marco) con las extensiones que vayas a utilizar, dejando, por ejemplo, la predeterminada como "pdf". Con eso, en el código, podrías establecer una pequeña rutina que te pillara la extensión seleccionada y, así como ahora lo escribes de forma manual (vDir = vDir & Me.pdfFactura.Value & ".pdf") podrías pasar la extensión a través de una variable, la cual obtendría el valor del cuadro de opciones.
También, si no sabes cómo hacer eso, me lo dices y te lo explico.
Y ya está. Lamento no poderte dar una solución más automática. :(
Te apunto un par de ideas por si pueden serte de utilidad. Quizás puedas adaptar alguna a tu BD de una manera "sencilla" y te solvente el problema, aunque sea un poco más "manual".
1.- El código que te pasé a mí me funcionaba perfecto porque yo tengo configurado mi Windows para que me muestre las extensiones de archivo. Por ello, al coger el nombre del archivo, el campo no sólo se me rellenaba con el nombre del archivo sino también con la extensión. Por ello, si te interesase, puedes cambiar la configuración de Windows para que te muestre las extensiones de archivo y, de rebote, se te arreglará el tema de la BD (lógicamente deberás adaptar un poco el código a la nueva situación).
Si no sabes cómo configurar Windows para eso me lo comentas y te lo explico.
2.- Otra opción, también "manual", es crear un cuadro de opciones (un marco) con las extensiones que vayas a utilizar, dejando, por ejemplo, la predeterminada como "pdf". Con eso, en el código, podrías establecer una pequeña rutina que te pillara la extensión seleccionada y, así como ahora lo escribes de forma manual (vDir = vDir & Me.pdfFactura.Value & ".pdf") podrías pasar la extensión a través de una variable, la cual obtendría el valor del cuadro de opciones.
También, si no sabes cómo hacer eso, me lo dices y te lo explico.
Y ya está. Lamento no poderte dar una solución más automática. :(
Muchísimas gracias, con cualquiera de las dos me vale, el tema de mostrar la extensión en windows ya lo he encontrado, y si lo necesitara yo lo cambiaría. Sino la segunda solución también es buena.
Gracias por el tiempo empleado,
rai
pd. te seguiré preguntando...
Gracias por el tiempo empleado,
rai
pd. te seguiré preguntando...
- Compartir respuesta
2 comentarios
Como poner el botón de comando que adjunta el archivo en un formulario principal, ya que tengo como subformulario el ingreso de los archivos. - alvaro rodriguez
A través de comentarios es imposible dar una explicación. Crea una nueva pregunta. Gracias. - Neckkito Nck