2012-05-01 103 views
2

我有一个由多个用户编辑的电子表格。为防止篡改以前的数据,一旦输入数据并保存文件,单元就被锁定。我在虽然代码的一些小错误:数据输入后锁定单元格

  1. 即使用户手动保存,然后退出,他们依然再次提示保存应用程序。

  2. 当应用程序正在运行时,单元格应该在保存后锁定,而不是仅在退出时单元格被锁定。以前,我在before_save事件中使用了这段代码,但即使save_as事件被取消,单元格也被锁定,因此我现在删除了代码。 固定

(编辑:!我刚刚意识到这个错误多么明显是我甚至表示,在此声明试图锁定单元格后使用前保存事件部分保存事件)

代码

With ActiveSheet 
    .Unprotect Password:="oVc0obr02WpXeZGy" 
    .Cells.Locked = False 
    For Each Cell In ActiveSheet.UsedRange 
     If Cell.Value = "" Then 
      Cell.Locked = False 
     Else 
      Cell.Locked = True 
     End If 
    Next Cell 
    .Protect Password:="oVc0obr02WpXeZGy" 
End With 

工作簿开放,隐藏所有的片材,并显示潜艇用于最终用户强迫使宏所有片材。下面是完整的代码:

Option Explicit 
Const WelcomePage = "Macros" 

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 

    Dim ws As Worksheet 
    Dim wsActive As Worksheet 
    Dim vFilename As Variant 
    Dim bSaved As Boolean 

'Turn off screen updating 
    With Application 
     .EnableEvents = False 
     .ScreenUpdating = False 
    End With 

'Record active worksheet 
Set wsActive = ActiveSheet 

'Prompt for Save As 
If SaveAsUI = True Then 
    vFilename = Application.GetSaveAsFilename("", fileFilter:="Excel Files (*.xls), *.xls") 
    If CStr(vFilename) = "False" Then 
     bSaved = False 
    Else 
     'Save the workbook using the supplied filename 
     Call HideAllSheets 
     ThisWorkbook.SaveAs vFilename 
     Application.RecentFiles.Add vFilename 
     Call ShowAllSheets 
     bSaved = True 
    End If 
Else 
    'Save the workbook 
    Call HideAllSheets 
    ThisWorkbook.Save 
    Call ShowAllSheets 
    bSaved = True 
End If 


'Restore file to where user was 
wsActive.Activate 
'Restore screen updates 
With Application 
    .ScreenUpdating = True 
    .EnableEvents = True 
End With 

'Set application states appropriately 
If bSaved Then 
    ThisWorkbook.Saved = True 
    Cancel = True 
Else 
    Cancel = True 
End If 

End Sub 

Private Sub Workbook_Open() 
    Application.ScreenUpdating = False 
    Call ShowAllSheets 
    Application.ScreenUpdating = True 
    ThisWorkbook.Saved = True 
End Sub 

Private Sub HideAllSheets() 
    Dim ws As Worksheet 
    Worksheets(WelcomePage).Visible = xlSheetVisible 
    For Each ws In ThisWorkbook.Worksheets 
     If Not ws.Name = WelcomePage Then ws.Visible = xlSheetVeryHidden 
    Next ws 
    Worksheets(WelcomePage).Activate 
End Sub 

Private Sub ShowAllSheets() 
    Dim ws As Worksheet 
    For Each ws In ThisWorkbook.Worksheets 
     If Not ws.Name = WelcomePage Then ws.Visible = xlSheetVisible 
    Next ws 
    Worksheets(WelcomePage).Visible = xlSheetVeryHidden 
End Sub 

'Lock Cells upon exit save if data has been entered 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 
Dim Cell As Range 
With ActiveSheet 
    .Unprotect Password:="oVc0obr02WpXeZGy" 
    .Cells.Locked = False 
    For Each Cell In ActiveSheet.UsedRange 
     If Cell.Value = "" Then 
      Cell.Locked = False 
     Else 
      Cell.Locked = True 
     End If 
    Next Cell 
    .Protect Password:="oVc0obr02WpXeZGy" 
End With 
End Sub 

谢谢:)

回答

1

这是要求他们,即使他们已经保存,因为这些线路的退出之前保存:

'Save the workbook 
Call HideAllSheets 
ThisWorkbook.Save 
Call ShowAllSheets 
bSaved = True 

你正在改变工作表保存后(通过调用ShowAllSheets),因此需要再次保存。 saveAs代码也是如此。

0

我使用另一个IF修复了第二个问题。这确保了只有在保存数据时单元才被锁定:

'Lock Cells before save if data has been entered 
    Dim rpcell As Range 
With ActiveSheet 
    If bSaved = True Then 
    .Unprotect Password:="oVc0obr02WpXeZGy" 
    .Cells.Locked = False 
    For Each rpcell In ActiveSheet.UsedRange 
     If rpcell.Value = "" Then 
      rpcell.Locked = False 
     Else 
      rpcell.Locked = True 
     End If 
    Next rpcell 
    .Protect Password:="oVc0obr02WpXeZGy" 
    Else 
    MsgBox "The LogBook was not saved. You are free to edit the RP Log again", vbOKOnly, "LogBook Not Saved" 
    End If 
End With 
相关问题