Comprobar si un documento está abierto por otro usuario

macro documento abierto openoffice libreoffice

Normalmente, para conocer si un documento está abierto actualmente por el usuario actual del ordenador, recorremos las ventanas abiertas una a una mediante un servício ofrecido por la API de OpenOffice y comprobamos si el título del documento (su nombre) se encuentra.

¿Pero y si el documento ha sido abierto por otro usuario, por ejemplo, en una unidad de red compartida, o por el mismo usuario pero con otra aplicación distinta a OpenOffice?

Para conocer si un documento ha sido abierto por el usuario actual del ordenador podemos utilizar el servicio Desktop del API de OpenOffice, que nos permite recorrer uno a uno los documentos abiertos por OpenOffice. Un ejemplo de código macro de este sistema lo mostramos a continuación:

 


Function DocumentoAbiertoLocal( rutaynombredocumento As String )
' Devuelve True si el documento está abierto por algún usuario local con OpenOffice
' Devuelve False si no lo está Dim oDesk As Object, oDocs As Object, oDoc As Object

rutaynombredocumento = ConvertToURL(rutaynombredocumento)
Set oDesk = CreateUNOService("com.sun.star.frame.Desktop")
Set oDocs = oDesk.getComponents().createEnumeration()
Do While oDocs.hasMoreElements()
Set oDoc = oDocs.nextElement()
If  rutaynombredocumento = oDoc.getURL() Then
DocumentoAbiertoLocal = True
Exit Function
End If
Loop
DocumentoAbiertoLocal=False
End Function

 

Este sistema sólo reconoce los documentos abiertos por Apache OpenOffice, por lo que si el mismo usuario u otro lo han abierto con otra aplicación nos será imposible conocer su estado. Tampoco reconoce si los documentos han sido abiertos por otros usuarios en entornos compartidos.

Una forma alternativa de conocer si el documento está abierto es intentar abrirlo en modo exclusivo. Si el intento tiene éxito, el documento no estará abierto en ese momento; si el intento no tiene éxito, significa que sí que está siendo utilizado por el mismo u otro usuario.

Este código permite averiguar si el documento está abierto (nos devuelve True) o no (nos devuelve False), independientemente de si ha sido abierto por el usuario actual u otro, o si lo abrió Apache OpenOffice o no.

 


Function DocumentoAbierto( rutaynombredocumento As String ) As Boolean
' Devuelve True si el documento está abierto por algún usuario
' Devuelve False si no lo está
Dim n As Integer
n = FreeFile()
On Error GoTo error_abrir
rutaynombredocumento = ConvertToURL(rutaynombredocumento)
Open rutaynombredocumento For Binary Access Write Lock Read Write As n
Close n
On Error GoTo 0
DocumentoAbierto= False
Exit Function

error_abrir:
On Error GoTo 0
DocumentoAbierto= True
End Function

 

 

No hay reacciones, todavía


Form is loading...