Dave se pregunta si puede forzar el cierre de un libro después de cierto tiempo, siempre que no se esté utilizando actualmente. En su oficina, la gente abre los libros de trabajo que están en el servidor y luego se olvidan de que están abiertos. Cuando eso ocurre, nadie más puede editarlos, por lo que le gustaría forzar el cierre de los libros de trabajo si se dejan desatendidos durante 60 minutos.

Es posible hacer esto usando macros, pero es posible que realmente no desee hacerlo desde una perspectiva empresarial o orientada al usuario. Por ejemplo, digamos que un usuario tiene tres libros de trabajo abiertos en su sistema, de modo que se pueden hacer comparaciones entre ellos. Es posible estar «atado»

con dos de los libros de trabajo durante bastante tiempo, siendo el tercero el que desencadena un cierre. El VBA de Excel no discrimina demasiado: cuando se cierra un libro, normalmente es el que tiene el foco en el momento actual.

Además, ¿qué hace con los cambios no guardados al cerrar? Si los guarda, se encontrará con el problema de que quizás el usuario no tenía la intención de guardarlos. Si no los guarda, se produce el problema inverso: quizás había muchos datos que debían guardarse. No puede hacer que el procedimiento de cierre pregunte si se debe guardar la información; eso mantendría el libro atado con tanta seguridad como lo haría mantenerlo abierto (y sin usar).

Una posible solución es simplemente compartir el libro de trabajo. Si habilita el uso compartido (como se explica en otros ExcelTips), varias personas pueden tener el mismo libro abierto al mismo tiempo. Si una de esas personas lo deja abierto, nadie más se verá afectado porque aún pueden abrirlo y, opcionalmente, realizar cambios en el libro de trabajo.

Si decide seguir la ruta basada en macros, la solución es bastante simple. Necesita algún tipo de estructura de temporizador (implementada fácilmente mediante el uso del método OnTime) y alguna forma de verificar si alguien está haciendo algo en el libro de trabajo.

Para comenzar, agregue el siguiente código a un módulo de macro estándar. Tenga en cuenta que se deben agregar tres rutinas:

Dim DownTime As Date

Sub SetTimer()

DownTime = Now + TimeValue("01:00:00")

Application.OnTime EarliestTime:=DownTime, _       Procedure:="ShutDown", Schedule:=True End Sub
Sub StopTimer()

On Error Resume Next     Application.OnTime EarliestTime:=DownTime, _       Procedure:="ShutDown", Schedule:=False  End Sub
Sub ShutDown()

Application.DisplayAlerts = False     With ThisWorkbook         .Saved = True         .Close     End With End Sub

Estas tres rutinas son bastante sencillas. Los dos primeros respectivamente encienden el temporizador y lo apagan. Tenga en cuenta que estas rutinas utilizan la variable DownTime, que se declara fuera de cualquiera de las rutinas. De esta manera, su contenido se puede utilizar en múltiples rutinas.

La tercera rutina, ShutDown, es la que realmente cierra el libro de trabajo. Solo se invoca si el método OnTime expira, al cabo de una hora. Cierra el libro de trabajo sin guardar los cambios que se hayan realizado.

Las siguientes rutinas (hay cuatro) deben agregarse al objeto ThisWorkbook. Abra el Editor de VBA y haga doble clic en el objeto ThisWorkbook en el Explorador de proyectos. En la ventana de código que abre Excel, coloque estas rutinas:

Private Sub Workbook_Open()

Call SetTimer End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Call StopTimer End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

Call StopTimer     Call SetTimer End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _   ByVal Target As Excel.Range)

Call StopTimer     Call SetTimer End Sub

Las dos primeras rutinas se activan cuando se abre el libro y cuando se cierra; inician el temporizador y lo apagan. Las otras dos rutinas se ejecutan automáticamente cada vez que se recalcula una hoja de trabajo o cuando alguien hace una selección en el libro de trabajo. Ambos son buenos indicadores de que alguien está usando el libro de trabajo (no está inactivo abierto). Detienen el temporizador y luego lo reinician, de modo que la cuenta regresiva de una hora comienza de nuevo.

Hay una desventaja de usar un conjunto de macros como estas: efectivamente elimina la capacidad Deshacer de Excel. Cuando se ejecuta una macro, Excel elimina automáticamente la pila Deshacer. Dado que las macros se ejecutan con cada cambio realizado en el libro de trabajo, los cambios de la persona no se pueden deshacer. (No hay forma de evitar este inconveniente).

_Nota: _

Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.

link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador].

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (2281) se aplica a Microsoft Excel 97, 2000, 2002 y 2003. Puede encontrar una versión de este consejo para la interfaz de cinta de Excel (Excel 2007 y posterior) aquí:

link: / excelribbon-Forcing_a_Workbook_to_Close_after_Inactivity [Forcing a Workbook to Close after Inactivity].