我有以下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下拉列表中选择一个项目时,链接的单元格会显示1
或2
(索引号)。我希望它显示msg1
或msg2
。
这可能吗?
答案 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