У меня есть выпадающие меню, настроенные на ячейки Excel (работающие на Office365), которые могут просматривать и изменять все сотрудники. Я хочу, чтобы у менеджеров была дополнительная опция в списке, которую могли выбрать только они. это можно сделать и как? Спасибо

2 ответа2

0

Попробуйте этот пример: добавить вспомогательный столбец учетной записи, в моем примере это:

А1 Аккаунт
А2 Персонал
Менеджер А3

Вспомогательный столбец Аккаунта

Перейдите в Формулы- Определенные имена- Имя диапазона сотрудников и Имя менеджера диапазона:

B1 список
B2 A
B3 B
B4 C
B5 D
B6 E
B7 F

Названный диапазон B2:B6 - это Staff

Названный диапазон B2:B7 является менеджером

Имя Штатный диапазон

Диапазон имени менеджера

Для раскрывающегося списка сначала добавьте список учетных записей D2 , перейдите в раздел «Проверка данных», выберите «Список» и выберите «Источник»: =Account

Затем добавьте еще один список E2 с помощью функции: =INDIRECT(D2)

список аккаунта

Список

Результат:

Результат

0

Я предлагаю предварительное решение на основе VBA. Попробуй. Обратите внимание, что это тестируется только в 64-битной Windows 7 64-битной версии Office 2013 в автономной системе.

В этом примере раскрывающийся список проверки создается в ячейке E3.

На рабочем листе нажмите ALT + F11, чтобы получить доступ к VBA Editor. Теперь дважды щелкните «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

Это попытка объявить правильную функцию на основе ОС Bitness. Это может вызвать ошибку компиляции или выделить одну из строк красным цветом, в зависимости от того, какая у вас битность ОС. Пока игнорируем эту ошибку.

Если это не работает, если у вас 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" Замените Manager на фактическое имя пользователя менеджера.

Теперь каждый раз, когда рабочая книга открывается, событие Workbook Open запускается. Сначала он попытается получить имя пользователя Windows. Затем, если это менеджер или все остальные, создайте пользовательские выпадающие списки в ячейке E3. Замените список проверки фактическим предполагаемым списком по желанию.

Несколько предположений / предостережений / ограничений, чтобы отметить

  • Код протестирован на 64-битной Windows 7 с автономным ПК Office 2013
  • Имя пользователя Windows не более 64 символов, если разрешена такая большая длина
  • Я не очень уверен, как это будет вести себя в Windows 8,8.1,10 или около того
  • Я не очень уверен, как это будет вести себя в сетевой среде, как информация о вашем имени пользователя хранится / доступна, является ли это доменом Windows, LDAP или любым другим способом, если это уместно. Я не сетевой эксперт.
  • Я не совсем уверен, понадобятся ли какие-либо административные привилегии для запуска функции 'Get_User_Name' в VB / VBA. В этом случае код может работать некорректно на всех системах пользователя.
  • Я предполагаю, что у вас есть рабочий стол Office 365. В случае с Office 365 Online, я считаю, что VBA не поддерживается.
  • На данный момент у меня нет средств, чтобы проверить, как это будет вести себя, если одна и та же книга переведена в общий режим по сети.
  • История не поддерживается, в результате пользователь должен будет повторно выбрать правильный вариант из раскрывающегося списка каждый раз, когда файл открывается.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .