Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 获取下拉列表中所选项目的位置(数量)_Vba_Excel - Fatal编程技术网

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,我稍后再看,但我不这么认为。更重要的是,我认为为用户提供两个完全相同的选择是一个设计缺陷。他们如何知道首先选择哪个相同的选项?