我有一个列表,其中包含我想添加到用户表单中的组合框的值。
我想要的值位于 A 列和 Z 列(因此来自 2 列的值)。我设法使用 AddItem 函数添加值,但很难向下拉列表中添加标题(一些帖子说这是不可能的)。
作为替代方案,我看到了 ListFillRange,但我无法弄清楚这是否可以用于彼此不相邻的两列。 感谢您的帮助。
最佳答案
a few posts said this is not possible
我通常不会回答那些没有表现出任何努力的问题,但这是一个有趣的问题。我倾向于同意你的观点,很多人认为你不能在ComboBox
中显示标题。
但是可以在Combobox
中显示标题。这是一个演示。如果您不想想要更改原始工作表,您当然必须借助辅助工作表。
测试用例
在我们的演示中,我们将采用 2 个非连续范围 A1-A5
和 D1-A5
逻辑
- 您要将相关数据复制到新工作表中。
- 将范围转换为表格
- 将组合框的列标题设置为 true
- 将行源设置为帮助表中的相关表格范围。
代码
Option Explicit
Dim ws As Worksheet
Private Sub UserForm_Initialize()
Dim wsInput As Worksheet
'~~> Input sheet. Change as applicable
Set wsInput = Sheet1
'~~> Add a new sheet. Hide it (Optional)
Set ws = ThisWorkbook.Sheets.Add
ws.Visible = xlSheetHidden
'~~> Copy the non-contigous range to the new sheet
wsInput.Range("A1:A5").Copy ws.Range("A1")
wsInput.Range("D1:D5").Copy ws.Range("B1")
Dim rng As Range
'~~> Get your range
Set rng = ws.Range("A1:B5")
'~~> Convert range to table
ws.ListObjects.Add(xlSrcRange, rng, , xlYes).Name = "MyTable"
'~~> Few combobox settings and we are done
With ComboBox1
.ColumnCount = 2
.ColumnHeads = True
.RowSource = "MyTable"
End With
End Sub
'~~> Delete the temp sheet we created
Private Sub UserForm_Terminate()
Application.DisplayAlerts = False
If Not ws Is Nothing Then ws.Delete
Application.DisplayAlerts = True
End Sub
输出
替代方案
如果您不同意辅助表的想法并且可以牺牲标题部分,那么您可以使用非连续范围填充组合框。请参阅Excel VBA Multicolumn Listbox add non contiguous range 。当然,您必须编辑代码以满足您的需求。由于只有两列,因此最终的数组将类似于 Dim Ar(1 To LastRow, 1 To 2)
。该数组将保存两列中的值。
关于excel - VBA Excel - 使用 AddItem 时将标题添加到组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67249418/