提问人:Mohamad Noruznia 提问时间:7/8/2023 最后编辑:Mayukh BhattacharyaMohamad Noruznia 更新时间:7/12/2023 访问量:82
如果Excel工作簿的当前用户不在数组中,则隐藏列(“O:P”)
If current user of Excel workbook is not in Array then hide columns ("O:P")
问:
我有一个工作簿的用户数组,如果用户名不在我的数组中,则必须隐藏。columns (O:P)
我遇到了类型不匹配错误,不知道问题出在哪里。 谢谢
这是我的代码:
userlist = Array("user1", "user2", "user3", "user4")
If Application.UserName <> userlist Then
Worksheets("Master").Range("O:P").EntireColumn.Hidden = True
End If
答:
1赞
kevin
7/8/2023
#1
问题是代码试图测试字符串是否等于字符串数组。字符串和数组是不同的数据类型,这会产生错误。
如果要测试字符串是否等于数组中的任何字符串,这是一种常用方法:
userlist = Array("user1", "user2", "user3", "user4")
If UBound(Filter(userlist, Application.UserName)) > -1 Then
Worksheets("Master").Range("O:P").EntireColumn.Hidden = True
End If
Filter
将数组过滤为匹配的项目。UserName
如果过滤后的数组有一个匹配项,则等于 0。如果过滤后的数组没有匹配项,则等于 -1。UBound
UBound
2赞
taller
7/9/2023
#2
有多种方法可以检查用户名是否存在。
- for 循环
userlist = Array("user1", "user2", "user3", "user4")
bFound = False
For i = LBound(userlist) To UBound(userlist)
If userlist(i) = Application.UserName Then
bFound = True
Exit For
End If
Next
If Not bFound Then _
Worksheets("Master").Range("O:P").EntireColumn.Hidden = True
- instr
userlist = Array("user1", "user2", "user3", "user4")
strUserlist = "|" & Join(userlist, "|") & "|"
strUser = "|" & Application.UserName & "|"
If InStr(1, strUserlist, strUser) = 0 Then _
Worksheets("Master").Range("O:P").EntireColumn.Hidden = True
- 滤波器
userlist = Array("user1", "user2", "user3", "user4")
strUser = Application.UserName
If UBound(Filter(userlist, strUser)) = -1 Then _
Worksheets("Master").Range("O:P").EntireColumn.Hidden = True
评论
2赞
VBasic2008
7/9/2023
我希望您假设 OP 知道放在每个模块的顶部并声明所有变量。此外,这确实是一种可怕的 If 语句编写方式。在 1 中,要强制不区分大小写,可以使用 .此外,应该考虑将用户名存储在变量中,因为我们处于循环中。还有一个 For...下一个循环“技巧”,通过删除布尔变量来简化:...Option Explicit
If StrComp(userlist(i), Application.UserName, vbTextCompare) = 0 Then Exit For
If i > Ubound(userList) Then
2赞
VBasic2008
7/9/2023
...在 2 中,您需要更正 .同样,要强制不区分大小写,可以使用:。同样,在 3 中,为了强制不区分大小写,您可以使用或更安全的(与选项库相关):。strUserlist = "|" & Join(userlist, "|") & "|"
If InStr(1, strUserlist, strUser, vbTextCompare) = 0 Then
If UBound(Filter(userlist, strUser, , vbTextCompare)) = -1 Then
Dim arr: arr = Filter(userlist, strUser, , vbTextCompare): If UBound(arr) < LBound(arr) Then
1赞
VBasic2008
7/12/2023
代码段中唯一的错误是 .我的其余评论应该是有教育意义的,例如关于声明所有变量(它们都是你的代码片段中的变体)和考虑区分大小写(如果你知道一个用户名,你为什么要关心它是 、 ,还是在将其写入列表(数组)时?如果大小写不正确,您的所有代码段都将失败。此外,最终的 If 语句是正确的,但 IMO 的格式很糟糕。请注意,我也在我的一些答案中使用了这种格式,但由于我认为它的可读性较差,因此放弃了它。Join(userlist)
USER1
user1
UsEr1
1赞
VBasic2008
7/12/2023
没有正确或不正确,这是关于可读性的。如果你总是这样写你的 If 语句,请继续这样做。我更喜欢(三行),很少在一行中(如果它们适合(我不喜欢行长超过 80 个字符)),大多数 SO 贡献者都使用这两种方式。If...Then...End If
If...Then...
1赞
taller
7/12/2023
明白了。每个人对最喜欢的饼干都有自己喜欢的选择。
1赞
VBasic2008
7/9/2023
#3
用户名是否在数组 () 中找到?Application.Match
Dim UserList(): UserList = Array("user1", "user2", "user3", "user4")
If IsError(Application.Match(Application.UserName, UserList, 0)) Then
Worksheets("Master").Columns("O:P").Hidden = True
End If
评论