Vba 获取下拉列表中所选项目的位置(数量)
在下拉列表中,我有几个项目。当我选择一个项目时,我能以数字的形式获取该项目在列表中的位置吗?如果您使用的是列表或组合框,Vba 获取下拉列表中所选项目的位置(数量),vba,excel,Vba,Excel,在下拉列表中,我有几个项目。当我选择一个项目时,我能以数字的形式获取该项目在列表中的位置吗?如果您使用的是列表或组合框,ListIndex似乎就是您想要的 ListIndex属性的VB帮助:返回或设置列表框或组合框中当前选定项的索引号。读/写长。评论。不能将此属性用于多选列表框 如果未选择任何内容,ListIndex的值为-1。如果内存可用,则它是一个基于零的索引 ListIndex无法在设计时设置,因此它不会列在“属性”窗口中 输入代码时,键入列表框名称,然后键入点,编辑器将显示所有可用属性。
ListIndex
似乎就是您想要的
ListIndex
属性的VB帮助:返回或设置列表框或组合框中当前选定项的索引号。读/写长。评论。不能将此属性用于多选列表框
如果未选择任何内容,ListIndex
的值为-1
。如果内存可用,则它是一个基于零的索引
ListIndex
无法在设计时设置,因此它不会列在“属性”窗口中
输入代码时,键入列表框名称,然后键入点,编辑器将显示所有可用属性。向下滚动列表,记下任何有趣的内容,然后向上查找 如果您正在查找数据验证列表的索引,我会这样做: 将以下代码放入ThisWorkbook模块:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ValidationIndex As Long
Dim rngTest As Excel.Range
'assumes the data validation is in a cell named "rngTest"
On Error Resume Next
Set rngTest = Sh.Range("rngTest")
If rngTest Is Nothing Then
Exit Sub
End If
On Error GoTo 0
If Not Intersect(ActiveCell, Sh.Range("rngTest")) Is Nothing Then
ValidationIndex = GetValidationIndex
MsgBox ValidationIndex
End If
End Sub
将此函数也放在ThisWorkbook模块中,或放在任何常规模块中:
Function GetValidationIndex() As Long
'returns a 1-based index
Dim rngTest As Excel.Range
Dim varValidationString As Variant
Dim ErrNumber As Long
Dim i As Long
With ActiveCell.Validation
If .Type = xlValidateList Then '3
On Error Resume Next
Set rngTest = ActiveCell.Parent.Range(.Formula1)
'I do this goofy thing with ErrNumber to keep my indenting and flow pretty
ErrNumber = Err.Number
On Error GoTo 0
'if the Validation is defined as a range
If ErrNumber = 0 Then
GetValidationIndex = Application.WorksheetFunction.Match(ActiveCell.Value2, rngTest, 0)
Exit Function
'if the validation is defined by comma-separated values
Else
varValidationString = Split(.Formula1, ",")
For i = LBound(varValidationString) To UBound(varValidationString)
If varValidationString(i) = ActiveCell.Value2 Then
GetValidationIndex = i + 1
Exit Function
End If
Next i
End If
End If
End With
End Function
我认为没有必要使用函数。您可以只使用匹配函数获得它,如上面Doug的答案所示
Dim GetValidationIndex as Integer
Dim rngTest as Range
' Get the validation list
With ActiveCell.Validation
Set rngTest = ActiveCell.Parent.Range(.Formula1)
end with
GetValidationIndex = Application.WorksheetFunction.Match(ActiveCell.Value2, rngTest, 0)
函数
GetValidationIndex
很好
但是,对于某些区域设置,行varValidationString=Split(.Formula1,“,”)
无效,因为用于分隔不同值的字符是“;”
我建议使用:
varValidationString = Split(.Formula1, Application.International(xlListSeparator))
就这样。我知道这是一个简单的函数,但我找不到它。谢谢你的帮助!@Jean-François Corbett谢谢!我很确定这不是OP想要的,也没想到有什么实际用途,但写起来很有趣。这很好,但如果下拉列表中有多个相同的成员,它就失败了。它只提供第一个相同成员的编号,而不是您实际单击的编号。我需要解决这个问题来解决其他人设计中的多对一问题。@James,我稍后再看,但我不这么认为。更重要的是,我认为为用户提供两个完全相同的选择是一个设计缺陷。他们如何知道首先选择哪个相同的选项?