Sugiro uma solução experimental baseada em VBA. Faça uma tentativa. Observe que isso só é testado no Windows 7 64 bits do Office 2013 64 bits em um sistema autônomo.
Neste exemplo, a lista de validação suspensa é criada na célula E3.
Na planilha aplicável, pressione ALT + F11 para acessar o VBA Editor. Agora clique duas vezes em 'Thisworkbook' no painel esquerdo. Na janela de código do lado direito, selecione Geral no primeiro menu suspenso e Declarações no segundo menu suspenso.
Coloque o seguinte código nele
#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
Esta é uma tentativa de declarar a função correta com base no Bitness do sistema operacional. Ele pode lançar um erro de compilação ou destacar uma das linhas em vermelho com base em que bitness do sistema operacional você tem. Por enquanto, ignore este erro.
Se isso não funcionar, se você tiver o Windows de 64 bits, coloque apenas a primeira instrução de declaração e remova o restante. Private Declare PtrSafe....
e segundo caso você tenha 32 bits do Windows.
Agora, assim como você selecionou Geral - Declarações, agora selecione o evento Pasta de trabalho Abrir
Após o código do espaço reservado da sub-rotina deve aparecer
Private Sub Workbook_Open()
End Sub
Coloque o seguinte código entre estas duas linhas
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
Você viu uma instrução Const mgr_usr = "Manager"
Substituir gerente pelo nome de usuário real do gerente.
Agora, toda vez que a pasta de trabalho for aberta, o evento Abrir da Pasta de Trabalho será disparado.
Primeiro, ele tentará obter o nome de usuário do Windows
Então, se for do Manager ou de todos os demais, crie menus suspensos na lista personalizada na célula E3.
Substitua a lista de validação com a lista pretendida, conforme desejado.
Poucas suposições / ressalvas / limitações a serem anotadas
- O código é testado no Windows 7 64 Bit com o Office 2013 Standalone PC
- O nome de usuário do Windows não tem mais de 64 caracteres, se esse tamanho for permitido
- Não sei ao certo como isso se comportará no Windows 8,8,1,10 ou mais
- Não sei ao certo como isso se comportará em um ambiente de rede, como as informações de nome de usuário são armazenadas / acessadas, se são do domínio do Windows, LDAP ou de qualquer outra forma, se relevante. Eu não sou um especialista em redes.
- Não tenho certeza se algum Privilégio Administrativo seria necessário para executar a função 'Get_User_Name' em VB / VBA. Se sim, o código pode não funcionar corretamente em todos os sistemas do usuário.
- Estou assumindo que você tenha um desktop do Office 365. No caso do Office 365 Online, o VBA é, acredito que não suportado.
- A partir de agora, não tenho como verificar como isso se comportará se a mesma pasta de trabalho for colocada no modo compartilhado pela rede.
- Não há histórico mantido; como resultado, o usuário precisaria selecionar novamente a opção correta na lista suspensa sempre que o arquivo fosse aberto.