从下拉框而不是索引号返回文本

时间:2010-11-02 14:57:49

标签: vba excel-vba drop-down-menu excel

我有以下VBA代码(来自MS Access 2007)。代码创建一个新工作簿并向单元格添加下拉列表。这个小片段会向特定单元格添加一个下拉列表并添加一些项目。

Dim myRng As Range
Dim myDD As Dropdown
Set myRng = wSheet.Cells(row, col)
With myRng
    Set myDD = .Parent.DropDowns.Add(Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
    myDD.AddItem "msg1"
    myDD.AddItem "msg2"
    myDD.LinkedCell = .Parent.Cells(row, col + 2).Address(external:=True)
End With

这一切都很有效,当我打开电子表格时,我得到一个我想要的组合框,并显示项目。但是,当我从Excel下拉列表中选择一个项目时,链接的单元格会显示12(索引号)。我希望它显示msg1msg2

这可能吗?

2 个答案:

答案 0 :(得分:3)

一些选择。

您可以将数据验证下拉放入单元格而不是Dropdown对象。这将返回实际结果而不是索引。如果您仍然需要单独的链接单元格,则可以放置一个只复制dv单元格的公式

Sub MakeDv()

    Dim wSheet As Worksheet
    Dim myRng As Range

    Set wSheet = ActiveSheet

    Set myRng = wSheet.Cells(row, col)
    myRng.Validation.Add xlValidateList, , , "msg1,msg2"
    wSheet.Cells(row, col + 2).Formula = "=" & myRng.Address

End Sub

另一个选择是不使用LinkedCell属性并使用宏来写入值。为此宏指定下拉列表

Sub ShowDDResult()

    Dim dd As DropDown

    Set dd = ActiveSheet.DropDowns(Application.Caller)

    ActiveSheet.Cells(row, col + 2).Value = dd.List(dd.Value)

End Sub

如果您要从Access创建工作表,那可能并不那么容易,因为您必须添加宏。最后一个选项是使用ListFillRange属性来填充Dropdown。将列表放在一个范围内,并使用LinkedCell的公式将日期从列表中拉出

Sub testdd()

    Dim wSheet As Worksheet
    Dim myRng As Range
    Dim myDD As DropDown
    Dim rList As Range
    Dim aList(1 To 2, 1 To 1) As String

    Set wSheet = ActiveSheet
    Set rList = wSheet.Range("D1:D2")

    Set myRng = wSheet.Cells(row, col)
    aList(1, 1) = "msg1": aList(2, 1) = "msg2"
    rList.Value = aList

    With myRng
        Set myDD = .Parent.DropDowns.Add(Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
        myDD.ListFillRange = rList.Address
        myDD.LinkedCell = wSheet.Cells(row, col + 2).Address
        wSheet.Cells(row, col + 3).Formula = "=INDEX(" & rList.Address & "," & myDD.LinkedCell & ",1)"
    End With

End Sub

答案 1 :(得分:1)

我试图找到一种更简洁的方式来做到这一点,所以不妨重新解决这个问题:)这就是我如何解决这个问题。我创建了一个我要填充下拉列表的项目数组。然后使用此数组,您可以返回与从下拉列表中获得的索引关联的字符串。

首先创建一个函数来返回一个字符串数组:

' Returns a string array of drop down items
function dditems() as string()

    Dim array(2) As String

    array(1) = "cats"
    array(2) = "dogs"

    dditems = array

end function

然后使用此数组填充下拉列表:

' To populate your drop down
sub populatedd()

    dim dd As DropDown
    dim i As Integer 
    dim itemsArray() As String

    ' Create the dd object and item array
    set dd = Worksheets("Sheet1").DropDowns("Drop Down 1")
    set itemsArray = dditems()

    ' Loop through the array to populate the drop down
    for i = 1 to UBound(itemsArray)

        dd.AddItem (itemsArray(i))

    next i
end

然后再次使用此数组,您可以使用以下代码获取与所选下拉索引关联的字符串:

' Get the string associated with the index
sub showDDResult()

    dim dd As DropDown
    dim itemsArray() As String

    ' Create the dd object and item array
    set dd = Worksheets("Sheet1").DropDowns("Drop Down 1")
    set itemsArray = dditems()

    ' dd.ListIndex returns index, call to array returns correct string
    MsgBox("Item selected is " & itemsArray(dd.ListIndex))
end