我正在寻找一个Excel VBA用户表单列表框,其中包含工作表1,第1行中带有动态列数的列(列可以在22到30列之间)。
到目前为止,我有以下代码,但它只填充列表框中单元格“A1”的值。
Dim rngSource As Range
Dim lCol As Long
'Determine last column
lCol = Cells(1, Columns.Count).End(xlToLeft).Column
'Set range source data to be included in listbox
Set rngSource = Worksheets("Sheet1").Range(Cells(1, 1), Cells(1, lCol))
'Populate listbox with range source data
lstAllFields.List = rngSource.Cells.Value
感谢您的帮助。
答案 0 :(得分:1)
更改您的陈述
ListBox1.List = rngSource.Cells.Value
是
ListBox1.List = Application.Transpose(rngSource.Cells.Value)
以便将单元格视为一列值而不是一行值。
正如ASH的评论中指出的那样,您还拥有不合格的属性(例如Cells
之类的内容,您没有指定该属性所引用的工作表,因此它默认为有效片)。一旦您开始需要在宏中使用多个工作表,这些就会导致问题,因此最好养成现在完全符合条件的习惯。
目前,您的代码(在我建议的修正之后)相当于:
Dim rngSource As Range
Dim lCol As Long
'Determine last column
lCol = ActiveSheet.Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column
'Set range source data to be included in listbox
Set rngSource = Worksheets("Sheet1").Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(1, lCol))
'Populate listbox with range source data
lstAllFields.List = Application.Transpose(rngSource.Cells.Value)
使用属于Cells
的{{1}}作为ActiveSheet
上Range
的界限,Worksheets("Sheet1")
和ActiveSheet
正常同样的事情,但如果它们不同则会崩溃。
我建议使用Worksheets("Sheet1")
块,这样我们就可以在语法上将所有出现的With Worksheets("Sheet1")
简化为Worksheets("Sheet1")
。您的代码将如下所示:
.