Проверка в Excel, где имена перечислены в ComboBox, но идентификатор помещается в ячейку - PullRequest
0 голосов
/ 09 марта 2020

enter image description here

На изображении выше я хочу установить язык человека. Я могу выполнить проверку с помощью идентификаторов, но я хочу отобразить названия языков (Engli sh, немецкий, испанский sh) в ComboBox, но после выбора я хочу идентификатор языка в ячейке.

Кажется, я не могу сделать это с помощью простой «Проверка данных / данных». Я прав?

Я мог выбрать название языка с проверкой данных, и после этого я мог определить из него идентификатор языка. Это не я хочу, потому что имя должно зависеть от идентификатора, а не наоборот.

Я пытался использовать ComboBox (контроль формы), который возвращает индекс выбранного элемента, из этого индекса, который я могу определить Идентификатор, но кажется глупым, что у меня есть индекс языка и идентификатор языка.

РЕШЕНИЕ НА ОСНОВЕ ОТВЕТА Кой

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("Persons[LanguageId]")) Is Nothing Then
        If VarType(Target.Value) = vbString Then
            Position = Application.Match(Target.Value, Range("Languages[Language]"), 0)
            Target.Value = WorksheetFunction.Index(Range("Languages[Id]"), Position)
        End If
    End If
End Sub

1 Ответ

1 голос
/ 09 марта 2020

Я не могу придумать лучшего выбора ... вам действительно может понадобиться VBA для этого и перевернуть вашу книгу .xlsm

Основная идея заключается в том, чтобы добавить обработку для Workbook_SheetChange в ThisWorkbook

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Column = 7 Then
    'this example simply take Column G
    'given you have more knowledge on your workbook, you should have better condition here
        If Not IsNumeric(Target.Value) Then
            Target.NumberFormat = """" + Target.Value + """"
            Target.Value = WorksheetFunction.Match(Target.Value, Range("LangTable[Language]"), 0)
            Target.Value = WorksheetFunction.Index(Range("LangTable[Id]"), Target.Value)
        End If
    End If
End Sub

Чтобы сделать это в VBA, нужно выбрать несколько различных настроек.

  1. установить и отобразить значение в качестве идентификатора (удалите изменение NumberFormat из моего примера кода)
  2. сохранить значение в качестве имени языка, отображать только как Id
  3. , как в моем примере кода, установить значение в качестве идентификатора, отобразить имя языка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...