Quiero una macro que indique que si el archivo esta en uso me devuelva una respuesta V o F

Hola Valedor,
Espero que te encuentres bien mi nombre es Jery y conozco algo del trabajo con macros, bueno la consulta es la siguiente(espero no este un poco enredada):
Deseo trabajar con un archivo excel en RED, es decir que varias maquinas lo usen a la vez para transacciones rápidas es decir SE ABRE EL ARCHIVO SE GUARDA INFORMACIÓN Y SE CIERRA INMEDIATAMENTE, pero lo que pasa es que cuando una PC ya abrió el archivo, y en la otra quiere abrirse ese mismo archivo por una orden dada desde un botón de un formulario se abre de frente como solo lectura.
Lo que yo deseo hacer es lo siguiente:
-Crear una macro que me indique si el archivo que yo quiero abrir esta siendo usado o no, y que me devuelva una respuesta V o F con la cual yo podría condicionar mis opciones.
Muchas gracias anticipadamente por tu respuesta !
Jery
Respuesta
1
Te felicito ampliamente, ¿sabes por qué?, por que el planteamiento de tu pregunta, es clara y concisa, estableces tus bases, lo que sabes y lo que quieres, me da mucho gusto por que es muy raro que te hagan preguntas tan claras, tanto gusto me dio que te contesto lo más rapido posible...
'Declaracion de funciones API usadas en nuestra funcion
Private Declare Function lOpen Lib "kernel32" Alias "_lopen" _
(ByVal lpPathName As String, ByVal iReadWrite As Long) As Long
Private Declare Function lClose Lib "kernel32" Alias "_lclose" _
(ByVal hFile As Long) As Long
'Esta macro tiene el inconveniente de que si tu archivo es muy grande
'mas si estan en red, notaras como lo abre, hice la prueba con un
'archivo de 10 MB y si bien no es tan lento si se nota
Public Sub VerificarDisponibilidad_1()
Dim strRuta As String
Dim Res As Boolean
Dim wbTmp As Workbook
'Ruta del archivo del que queremos saber si esta abierot
strRuta = "\\Servidor\doc servidor\Mis documentos\Prueba.xls"
'Abrimos el archivo, como es por código no nos dice si lo
'queremos para solo lectura, también se puede ocultar la ventana
Set wbTmp = Workbooks.Open(strRuta)
'Checamos la propiedad ReadOnly si es verdadera quiere decir
'que alguien más tiene abierto el archivo
Res = wbTmp.ReadOnly
'Lo cerramos
wbTmp.Close
'Vaciamos la memoria
Set wbTmp = Nothing
'Informamos del estado del archivo
If Res Then
MsgBox "El archivo esta siendo usado"
Else
MsgBox "El archivo esta listo para usarse"
End If
End Sub
'Esta otra es mucho más eficiente, te dice al instante si tu
'archivo esta abierto o cerrado, claro pero aqui usamos API
'las funciones que esta arriba las usa esta macro
Public Sub VerificarDisponibilidad2()
Dim strRuta As String
Dim Res As Boolean
strRuta = "\\Servidor\doc servidor\Mis documentos\Prueba.xls"
Res = EstaAbierto(strRuta)
If Res Then
MsgBox "El archivo esta siendo usado"
Else
MsgBox "El archivo esta listo para usarse"
End If
End Sub
Private Function EstaAbierto(ByVal RutaArchivo As String) As Boolean
Dim hFile As Long
Dim lastErr As Long
' Inicialzamos el manejador del archivo y la variable para los errores
hFile = -1
lastErr = 0
' Abrimos el archivo para lectura y de modo exclusivo
hFile = lOpen(RutaArchivo, &H10)
' Si el archivo esta abierto, se obtiene un error
If hFile = -1 Then
lastErr = Err.LastDllError
Else
' Cerramos el archivo
lClose (hFile)
End If
EstaAbierto = (hFile = -1) And (lastErr = 32)
End Function
Puedes solicitar el archivo donde hice las pruebas a mi correo, saludos desde México...
Mauricio Baeza
[email protected]
Todo lo que no es dado es perdido
*==========================================*
La presente respuesta ha demandado un tiempo de lectura,
análisis, elaboración y redacción. A cambio, simplemente,
pretendo que te tomes un minuto para FINALIZARLA, si
hubiera satisfecho -en alguna medida- tu requerimiento.
En caso contrario, puedes preguntarme nuevamente
aclarando qué entendí mal o qué faltó.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas