如果Excel工作簿的当前用户不在数组中,则隐藏列(“O:P”)

If current user of Excel workbook is not in Array then hide columns ("O:P")

提问人:Mohamad Noruznia 提问时间:7/8/2023 最后编辑:Mayukh BhattacharyaMohamad Noruznia 更新时间:7/12/2023 访问量:82

问:

我有一个工作簿的用户数组,如果用户名不在我的数组中,则必须隐藏。columns (O:P)

我遇到了类型不匹配错误,不知道问题出在哪里。 谢谢

这是我的代码:

userlist = Array("user1", "user2", "user3", "user4")
If Application.UserName <> userlist Then
Worksheets("Master").Range("O:P").EntireColumn.Hidden = True
End If
数组 excel vba 隐藏 工作表函数

评论


答:

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。UBoundUBound

2赞 taller 7/9/2023 #2

有多种方法可以检查用户名是否存在。

  1. 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
  1. 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
  1. 滤波器
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 ExplicitIf StrComp(userlist(i), Application.UserName, vbTextCompare) = 0 Then Exit ForIf i > Ubound(userList) Then
2赞 VBasic2008 7/9/2023
...在 2 中,您需要更正 .同样,要强制不区分大小写,可以使用:。同样,在 3 中,为了强制不区分大小写,您可以使用或更安全的(与选项库相关):。strUserlist = "|" & Join(userlist, "|") & "|"If InStr(1, strUserlist, strUser, vbTextCompare) = 0 ThenIf UBound(Filter(userlist, strUser, , vbTextCompare)) = -1 ThenDim arr: arr = Filter(userlist, strUser, , vbTextCompare): If UBound(arr) < LBound(arr) Then
1赞 VBasic2008 7/12/2023
代码段中唯一的错误是 .我的其余评论应该是有教育意义的,例如关于声明所有变量(它们都是你的代码片段中的变体)和考虑区分大小写(如果你知道一个用户名,你为什么要关心它是 、 ,还是在将其写入列表(数组)时?如果大小写不正确,您的所有代码段都将失败。此外,最终的 If 语句是正确的,但 IMO 的格式很糟糕。请注意,我也在我的一些答案中使用了这种格式,但由于我认为它的可读性较差,因此放弃了它。Join(userlist)USER1user1UsEr1
1赞 VBasic2008 7/12/2023
没有正确或不正确,这是关于可读性的。如果你总是这样写你的 If 语句,请继续这样做。我更喜欢(三行),很少在一行中(如果它们适合(我不喜欢行长超过 80 个字符)),大多数 SO 贡献者都使用这两种方式。If...Then...End IfIf...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