我在 excel 单元格上设置了下拉菜单(在 office365 上工作),所有员工都可以访问和修改。我希望经理在列表中有一个只有他们才能选择的额外选项。这可以做到吗?如何做到?谢谢
答案1
尝试这个示例:添加帐户的辅助列,在我的示例中是:
A1 账户
A2员工
A3 经理
转到公式 - 定义名称 - 名称员工范围和名称经理范围:
B1 列表
B2A型
B3B型
B4C型
B5D
B6E
B7F
命名范围B2:B6
是职员
命名范围B2:B7
是经理
对于下拉列表,D2
首先添加帐户列表,转到数据-数据验证,选择列表并选择来源:=Account
E2
然后通过函数添加另一个列表:=INDIRECT(D2)
结果:
答案2
我建议采用基于 VBA 的临时解决方案。请尝试一下。请注意,这仅在独立系统中的 Windows 7 64 位 Office 2013 64 位上进行了测试。
在此示例中,下拉验证列表是在单元格 E3 中创建的。
在适用的工作表中,按 ALT + F11 访问 VBA 编辑器。现在双击左侧窗格中的“Thisworkbook”。在右侧代码窗口中,选择一般的从第一个下拉菜单中声明从第二个下拉菜单中。
将以下代码放入其中
#If Win64 Then
Private Declare PtrSafe Function Get_User_Name Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#Else
Private Declare Function Get_User_Name Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#End If
这是根据操作系统位数声明正确函数的尝试。它可能会抛出编译错误或根据操作系统位数用红色突出显示其中一行。暂时忽略此错误。
如果这不起作用,如果您使用的是 64 位 Windows,则只放置第一个声明语句并删除其余语句。 Private Declare PtrSafe....
如果您使用的是 32 位 Windows,则放置第二个声明语句。
现在,就像您选择常规 - 声明一样,现在选择工作簿 打开事件
以下子程序占位符代码应显示
Private Sub Workbook_Open()
End Sub
将以下代码放在这两行之间
Dim lpBuff As String * 65
Dim username As String
Const mgr_usr = "Manager"
Get_User_Name lpBuff, 65
username = UCase(Left(lpBuff, InStr(lpBuff, Chr(0)) - 1))
If username = UCase(mgr_usr) Then
Range("E3").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="Usr1,Usr2,Usr3,Mgr1,Mgr2"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Else
Range("E3").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="Usr1,Usr2,Usr3"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If
您是否看到过这样一条声明:Const mgr_usr = "Manager"
用经理的实际用户名替换经理?
现在,每次打开工作簿时,都会触发“工作簿打开”事件。首先,它将尝试获取 Windows 用户名,然后,如果用户名是经理或其他人,则在单元格 E3 中创建自定义列表下拉菜单。根据需要将验证列表替换为实际的预期列表。
需要注意的几个假设/警告/限制
- 该代码在装有 Office 2013 独立 PC 的 Windows 7 64 位上进行了测试
- Windows 用户名不超过 64 个字符(如果允许那么长)
- 我不太确定这在 Windows 8、8.1、10 或更高版本上会如何表现
- 我不太确定这在网络环境中会如何表现,您的用户名信息如何存储/访问,是 Windows 域、LDAP 还是任何其他相关方式。我不是网络专家。
- 我不太确定是否需要任何管理权限才能在 VB/VBA 中运行“Get_User_Name”函数。如果是这样,代码可能无法在所有用户的系统上正常工作。
- 我假设您有一个桌面版 Office 365。对于 Office 365 Online,我认为 VBA 不受支持。
- 到目前为止,我还没有办法验证如果同一工作簿通过网络处于共享模式,其行为会如何。
- 没有保留历史记录,因此用户每次打开文件时都需要从下拉菜单中重新选择正确的选项。