Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-如何指定有效用户以执行某些操作_Vba_Excel - Fatal编程技术网

VBA-如何指定有效用户以执行某些操作

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,

在关闭之前,我已经创建了一些强制单元格,并且希望有一些用户可以对强制单元格进行escae。从中找到这些代码,正在尝试编辑这些代码,但无效

希望有人能给我解释一下。 u、sers1、u、sers2是不需要填写必填单元格的用户,他们可以在保留单元格空白的同时关闭工作簿。excel中的用户名格式为
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需要正确。