excel - 在 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
解决方案
我想不出更好的选择......你可能真的需要一些 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 中执行此操作,有几个不同的设置可供选择。
- 将值设置并显示为 id(从我的示例代码中删除 NumberFormat 更改)
- 将值保留为语言名称,仅显示为 Id
- 像我的示例代码一样,将值设置为 id,显示语言名称