我有一个电子表格,其中所有条目都必须通过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
我想让我的流程捕获用户对单元格的任何直接更改。
答案 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
的使用是防止例程在开发人员功能区上显示“宏”对话框的另一种方法。这样,例程仍可用于其他项目,但对用户不可见。