首页 > 解决方案 > 在 ComboBox 中列出名称但将 Id 放入单元格的 excel 中进行验证

问题描述

在此处输入图像描述

在上图中,我想设置一个人的语言。我可以使用 Id-s 进行验证,但我想在 ComboBox 中显示语言名称(英语、德语、西班牙语),但选择后我想在单元格中显示语言 ID。

看来我不能用简单的“数据/数据验证”来做到这一点。我对吗?

我可以选择带有数据验证的语言名称,然后我可以从中确定语言 ID。这不是我想要的,因为名称应该取决于 id 而不是其他方式。

我尝试使用 ComboBox(表单控件),它返回所选元素的索引,从该索引我可以确定 Id,但我有语言的索引和语言的 id 似乎很愚蠢。

基于 COY 答案的解决方案

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

标签: excelvalidation

解决方案


我想不出更好的选择......你可能真的需要一些 VBA 并把你的工作簿变成 .xlsm

关键思想是在 ThisWorkbook 中添加对 Workbook_SheetChange 的处理

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. 将值设置并显示为 id(从我的示例代码中删除 NumberFormat 更改)
  2. 将值保留为语言名称,仅显示为 Id
  3. 像我的示例代码一样,将值设置为 id,显示语言名称

推荐阅读