Excelドロップダウンで選択した値のインデックスを取得


1

行の値からExcelで生成されたドロップダウンリストがあります。そのドロップダウンから選択し、ドロップダウン配列でその値のインデックスを取得し、それをオフセット値に使用して別の列から値を選択します。

ドロップダウンで選択した値のインデックスを取得する簡単な方法を見つけることができないようです。

私が見つけたすべての答えは、配列が生成される場所について仮定していますが、ここでは、それらはいつでも変更できるさまざまなデータのセットによって生成されます。

回答:


2

これを解決するのにVBAは必要ありません。

  1. あなたは私が持っている私の場合は(検証のために使用されているリストについては、ブック内の名前付き範囲を定義し<5>5そして>10細胞にA2A3A4サービスの年のために、その名前付き範囲が呼び出されるがYears_of_service

  2. 検証は、リストにC1定義された名前の範囲を使用するセル内にYears_of_serviceあります。

  3. D1リストで選択したオフセットまたはアイテムを計算するセル内の数式は=MATCH(C1,Years_of_service,0)です。

マーク・オラファティ


1

更新しました

次のVBAを「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
    Sheets("Sheet1").Range("E2").Value = ValidationIndex
End If
End Sub

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

いくつかのメモ:

  • これは、ドロップダウンボックス/セルの名前が「rngTest」であることを前提としています。そうでない場合は、名前を変更するか、このコード全体で既存の名前に変更します。
  • 15行目は、インデックス結果が出力される正確なセルを定義しています。シート名とセル名を自分のものに一致するように変更する必要があります。

私はこれをテストしましたが、機能しますが、元のコードは数か月前に見つけたものであったため、完全に信用することはできません。問題がある場合は、操作の理論を理解するまで、このプロセスを新しいワークシートに複製する方が簡単な場合があります。


ロバートに感謝します。私は実際にインデックスをいくつかのデータと組み合わせて使用​​し、別のセルに表示したいので、msgboxが機能するとは思わない...私が持っている唯一のオプションはこれをコンボボックスに変えることですか?
user339389 14年

コードは自動的に更新されており、セルに出力されるので、好きなように使用できます。
ロバートシール14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.