是否有可以检查单元格属性更改的VBA流程

时间:2019-07-16 18:48:33

标签: excel vba

我有一个电子表格,其中所有条目都必须通过vba Userform输入和编辑。我有一个过程可以检查用户是否直接在单元格中键入内容,并告诉他们是否可以,并撤消他们的键入操作。该陷阱仍然允许用户更改单元格的属性,例如颜色和文本粗体。有什么办法可以捕获该信息以及直接在单元格中输入吗?

我使用Worksheet_Change(ByVal Target As Range)来捕获键入,如下所示。 “ updateIND”是一个值(1或0),用于打开或关闭此功能:

Private Sub Worksheet_Change(ByVal Target As Range)
  If ThisWorkbook.Sheets("Updates").Range("updateIND") = 0 Then
    With Application
      .EnableEvents = False
      .Undo
      .EnableEvents = True
      End With
    MsgBox ("No direct typing please")
    End If
End Sub

我想让我的流程捕获用户对单元格的任何直接更改。

2 个答案:

答案 0 :(得分:1)

建议使用更好的解决方案-在工作表中使用“保护”。 (我增强了保护例程,以允许自动过滤器从标题开始工作并允许隐藏和取消隐藏列。1):

Sub ProtectIt()
Dim myPassword As String
myPassword = "openopen"
Sheets("DataTable").Protect Password:=myPassword, _
  DrawingObjects:=True, _
  Contents:=True, _
  Scenarios:=True, _
  AllowSorting:=True, _
  AllowFiltering:=True, _
  AllowUsingPivotTables:=True, _
  AllowFormattingColumns:=True
End Sub

Sub UnprotectIt()
Dim myPassword As String
myPassword = "openopen"
Sheets("DataTable").Unprotect Password:=myPassword
End Sub

这里有一些优雅而明智的建议。我确实知道某些应用程序需要对用户完全隐藏的密码。就我而言,我只是希望他们遵循数据输入规则。如果他们要查找密码,取消保护选项卡并保存密码,则不会对服务器副本进行任何更改,因为仅通过宏进行保存,而手动保存将被复制宏删除,该宏可刷新表中的表。客户副本。如果将来需要更好的方法,我仍然对密码的评论表示赞赏。

答案 1 :(得分:0)

这些评论已经提到使用保护。在您的OP中,建议您劝告用户尝试输入任何内容,但是更好的方法是完全阻止用户进行输入。

在Microsoft网站上,Protect命令的语法为:

  

expression.Protect(密码,DrawingObjects,内容,方案,   仅UserInterface ,AllowFormattingCells,AllowFormattingColumns,   AllowFormattingRows,AllowInsertingColumns,AllowInsertingRows,   AllowInsertingHyperlinks,AllowDeletingColumns,AllowDeletingRows,   AllowSorting,AllowFiltering,AllowUsingPivotTables

我将其中一个参数加粗了,因为这对我要建议的内容很重要。

对于任何用户输入,您都完全锁定了工作表,但允许宏进行更改。这样,如果他们尝试编辑任何内容,他们将无法执行。但是当他们使用表格时,就会进行更改。

Private Const UPDATES_PASSWORD As String = "DumbPassword"

Sub ProtectUpdateSheet(Optional private as Boolean)
    ThisWorkbook.Sheets("Updates").Protect UPDATES_PASSWORD, True, True, True, _
            True, False, False, False, False, False, False, False, False, _
            False, False, False)
            ' The True on the second line sets it to user interface only

Sub UnprotectProtectUpdateSheet(Optional private as Boolean)
    ThisWorkbook.Sheets("Updates").Unprotect Password:=UPDATES_PASSWORD
End Sub

这是一个重要的注意事项:当您保存带有受保护图纸的Excel文件时,它不会保存“仅接口”标志!因此,每次打开工作簿时都必须将其重置-现在非常简单:

' In ThisWorkbook code module
Private Sub Workbook_Open()
    ProtectUpdateSheet
End Sub

有了这个,您就可以在想要更改工作表的任何时候运行代码,但是用户不能直接做任何事情!

测试笔记:我已经从内存中对以上代码进行了编码。但是我已经在工作系统上使用了这种方法,它非常健壮且用户安全。

@MathieuGuindon突出显示了Option Private Module的使用。上面的Optional Boolean的使用是防止例程在开发人员功能区上显示“宏”对话框的另一种方法。这样,例程仍可用于其他项目,但对用户不可见。