Dave tự hỏi liệu anh ta có thể buộc một sổ làm việc đóng sau một khoảng thời gian nhất định, miễn là nó hiện không được sử dụng. Trong văn phòng của ông, mọi người mở sổ làm việc trên máy chủ và sau đó quên rằng chúng đang mở. Khi điều đó xảy ra, không ai khác có thể chỉnh sửa chúng, vì vậy anh ta muốn buộc các sổ làm việc đóng lại nếu không được giám sát trong 60 phút.

Có thể làm điều này bằng cách sử dụng macro, nhưng bạn có thể không thực sự muốn làm điều đó từ quan điểm kinh doanh hoặc hướng người dùng. Ví dụ: giả sử một người dùng có ba sổ làm việc đang mở trên hệ thống của mình, để có thể thực hiện so sánh giữa chúng. Có thể bị “trói”

với hai trong số các sổ làm việc khá lâu, với sổ thứ ba là sổ kích hoạt tắt máy. VBA của Excel không phân biệt đối xử nghiêm trọng — khi một sổ làm việc bị đóng, nó thường là sổ có tiêu điểm tại thời điểm hiện tại.

Hơn nữa, bạn sẽ làm gì với các thay đổi chưa lưu khi đóng? Nếu bạn lưu chúng, bạn sẽ gặp phải vấn đề mà có lẽ người dùng không có ý định lưu chúng. Nếu bạn không lưu chúng, vấn đề xảy ra – có lẽ có rất nhiều dữ liệu cần được lưu. Bạn không thể yêu cầu thủ tục đóng cửa hỏi xem có nên lưu thông tin hay không; điều đó sẽ giữ cho sổ làm việc bị ràng buộc chắc chắn như giữ nó mở (và không sử dụng).

Một giải pháp khả thi là chỉ cần chia sẻ sổ làm việc. Nếu bạn bật chia sẻ (như đã thảo luận trong ExcelTips khác), thì nhiều người có thể mở cùng một sổ làm việc cùng một lúc. Nếu một trong những người đó để nó mở, thì không ai khác sẽ thấy bất tiện vì họ vẫn có thể mở nó và thực hiện các thay đổi trong sổ làm việc, tùy chọn.

Nếu bạn quyết định đi theo con đường dựa trên vĩ mô, thì giải pháp khá đơn giản. Bạn cần một số loại cấu trúc bộ đếm thời gian (dễ dàng triển khai thông qua việc sử dụng phương pháp OnTime) và một số cách để kiểm tra xem liệu ai đó đang làm gì đó trong sổ làm việc.

Để bắt đầu, hãy thêm mã sau vào mô-đun macro tiêu chuẩn. Lưu ý rằng có ba quy trình sẽ được thêm vào:

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

Ba thói quen này khá đơn giản. Hai lần đầu tiên lần lượt bật bộ hẹn giờ và tắt nó đi. Lưu ý rằng các quy trình này sử dụng biến DownTime, biến này được khai báo bên ngoài bất kỳ quy trình nào. Bằng cách này, nội dung của nó có thể được sử dụng trong nhiều quy trình.

Quy trình thứ ba, ShutDown, là quy trình thực sự đóng sổ làm việc. Nó chỉ được gọi nếu phương thức OnTime hết hạn, vào cuối một giờ. Nó đóng sổ làm việc mà không lưu bất kỳ thay đổi nào có thể đã được thực hiện.

Các quy trình tiếp theo (có bốn quy trình trong số đó) cần được thêm vào đối tượng ThisWorkbook. Mở VBA Editor và nhấp đúp vào đối tượng ThisWorkbook trong Project Explorer. Trong cửa sổ mã mà Excel mở ra, hãy đặt các quy trình sau:

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

Hai quy trình đầu tiên được kích hoạt khi sổ làm việc được mở và khi nó được đóng lại; họ bắt đầu hẹn giờ và tắt nó đi. Hai quy trình khác được thực thi tự động bất cứ khi nào một trang tính được tính toán lại hoặc bất cứ khi nào ai đó thực hiện lựa chọn trong sổ làm việc. Cả hai đều là chỉ báo tốt cho thấy ai đó đang sử dụng sổ làm việc (nó không được mở một cách bất hoạt). Họ dừng bộ đếm thời gian và sau đó khởi động lại nó, để bộ đếm ngược một giờ bắt đầu lại.

Có một nhược điểm khi sử dụng một tập hợp các macro như sau: bạn loại bỏ hiệu quả khả năng Hoàn tác của Excel. Khi một macro được thực thi, ngăn xếp Hoàn tác sẽ tự động bị xóa bởi Excel. Vì macro đang chạy với mọi thay đổi được thực hiện trong sổ làm việc, nên không thể hoàn tác thay đổi của người đó. (Không có cách nào để khắc phục nhược điểm này.)

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (2281) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: