VBA-如何指定有效用户以执行某些操作
在关闭之前,我已经创建了一些强制单元格,并且希望有一些用户可以对强制单元格进行escae。从中找到这些代码,正在尝试编辑这些代码,但无效 希望有人能给我解释一下。 u、sers1、u、sers2是不需要填写必填单元格的用户,他们可以在保留单元格空白的同时关闭工作簿。excel中的用户名格式为VBA-如何指定有效用户以执行某些操作,vba,excel,Vba,Excel,在关闭之前,我已经创建了一些强制单元格,并且希望有一些用户可以对强制单元格进行escae。从中找到这些代码,正在尝试编辑这些代码,但无效 希望有人能给我解释一下。 u、sers1、u、sers2是不需要填写必填单元格的用户,他们可以在保留单元格空白的同时关闭工作簿。excel中的用户名格式为u,ser1 感谢您的建议和帮助 Function IsInvalidUser() As Boolean Dim asUsers() As String asUsers = Split("u, ser1.u,
u,ser1
感谢您的建议和帮助
Function IsInvalidUser() As Boolean
Dim asUsers() As String
asUsers = Split("u, ser1.u, ser2", ".")
IsInvalidUser = IsError(Application.Match(Environ("UserName"), asUsers, 0))
End Function
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Not (IsInvalidUser) And Cells(2, 8).Value = "" Then
MsgBox "Cell H2 requires user input", vbInformation, "Please filled up the mandatory cells"
Cancel = True
ElseIf Not (IsInvalidUser) And Cells(4, 4).Value = "" Then
MsgBox "Cell D4 requires user input", vbInformation, "Please filled up the mandatory cells"
Cancel = True
End If
End Sub
阵列似乎很难维护。我会在隐藏的工作表上使用列表。脚本字典也可以很好地工作,并具有能够比较文本的额外优势
Function IsValidUser() As Boolean
With CreateObject("Scripting.Dictionary")
.CompareMode = vbTextCompare
.Add "u, ser1", vbNullString
.Add "u, ser2", vbNullString
IsValidUser = .Exists(Environ("UserName"))
End With
End Function
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Not IsValidUser Then
If Cells(2, 8).Value = "" Then
MsgBox "Cell H2 requires user input", vbInformation, "Please filled up the mandatory cells"
ElseIf Cells(4, 4).Value = "" Then
MsgBox "Cell D4 requires user input", vbInformation, "Please filled up the mandatory cells"
End If
Cancel = True
End If
End Sub
注意:我更改了逻辑以检查有效用户。(a)您在何处/何时检查了
asuser
,并确定其为空?您当时是否正在执行IsInvalidUser
功能?(这将是唯一一次它会/应该有一个值。)(b)您的用户名(即您登录计算机时使用的名称)的格式是u,ser1
,还是Excel中的用户名?(Environ(“UserName”)
正在提取一个环境字符串,例如,我的是X312651
,尽管我的用户名显示在Excel中会更有意义。)(c)您测试的是不是IsInvalidUser
,但我认为如果IsInvalidUser和单元格(2,8),您需要然后
-即,如果用户不在您的列表中且单元格为空,则显示消息。(a)您好,我在保存前检查。使用我在网上找到的示例Dim x作为整数x=5.5 MsgBox“value is”&x
。我只是将我的x修改为我的变量名。(b)u,ser1
是excel和计算机中的用户名。我在General(b)下使用“File”=>“Options”=>“Username”找到它。File/Options/Username下显示的用户名不一定是Environ(“Username”)
返回的值。转到VBA环境中的即时窗口,键入?Environ(“用户名”)
,查看您自己的用户名在计算机上是什么,并确保其格式相同。(c) 如果您按照我之前的评论更改了If
语句,而您的代码仍然无法正常工作,我敢打赌问题在于我的观点(b),而您只是没有寻找正确的用户名。FWIW-如果您更改环境(“用户名”)
至应用程序.用户名
然后您将检查文件/Options/UserName中给出的用户名。(当然,这会使任何人都可以轻松地更改用户名以绕过您的测试。:D并不是说他们无法更改环境(“用户名”)
返回的内容,而是在Excel中更改您的名称比在系统级别上更容易。)我刚刚编辑了您的答案,使其仅在缺少值时设置Cancel=True。正在等待同行评审。是的。谢谢你的回答。对于那些试图和我做同样事情的人,请阅读@YowE3K写的评论。文件/Options/Username下显示的用户名不一定是Environ返回的值(“Username”)。转到VBA环境中的即时窗口,键入?Environ(“用户名”),查看您自己的用户名在计算机上是什么,并确保其格式相同代码>u,ser1的u需要正确。