Excel VBA如何选取工作表指定列并在ListBox中同时加载ID与Question范围数据
问题原因
你代码的核心问题是RowSource属性每次赋值都会覆盖上一次的配置,先后给它赋值ID和Question两个名称,最终只会显示最后赋值的Question范围的内容。
方案1:使用数组加载数据(更灵活,推荐)
这种方法不需要预先定义名称,直接读取两个范围的内容合并为数组后赋值给列表框,可避免行计数不一致导致的错位问题:
Private Sub UserForm_Activate() Dim sh As Worksheet Dim idRow As Long, questionRow As Long, maxRow As Long Dim arrID, arrQues, arrAll, i As Long Set sh = ThisWorkbook.Sheets("Data") ' 统计两列的最后行,取最大值避免数据遗漏 idRow = sh.Range("A" & Rows.Count).End(xlUp).Row questionRow = sh.Range("G" & Rows.Count).End(xlUp).Row maxRow = WorksheetFunction.Max(idRow, questionRow) ' 有数据时才读取范围内容 If maxRow >= 2 Then arrID = sh.Range("A2:B" & maxRow).Value arrQues = sh.Range("G2:L" & maxRow).Value ' 合并两个数组为8列的总数组 ReDim arrAll(1 To UBound(arrID, 1), 1 To 8) For i = 1 To UBound(arrID, 1) ' 前2列放ID范围数据 arrAll(i, 1) = arrID(i, 1) arrAll(i, 2) = arrID(i, 2) ' 后6列放Question范围数据 arrAll(i, 3) = arrQues(i, 1) arrAll(i, 4) = arrQues(i, 2) arrAll(i, 5) = arrQues(i, 3) arrAll(i, 6) = arrQues(i, 4) arrAll(i, 7) = arrQues(i, 5) arrAll(i, 8) = arrQues(i, 6) Next i End If With Me.listBox2 .ColumnHeads = True .ColumnCount = 8 .ColumnWidths = "30,85,85,85,85,85,85,85" If IsArray(arrAll) Then .List = arrAll End With End Sub
注意:如果需要保留列头显示,建议把表头行的对应列内容也加入数组的第一行,或者改用下方的RowSource方案,List属性默认不支持直接显示关联范围的列头。
方案2:合并范围后用RowSource加载
如果你需要保留RowSource的列头自动加载特性,可以直接定义一个指向合并列的名称,不需要拆分两个名称:
Private Sub UserForm_Activate() Dim sh As Worksheet Dim idRow As Long, questionRow As Long, maxRow As Long Set sh = ThisWorkbook.Sheets("Data") idRow = sh.Range("A" & Rows.Count).End(xlUp).Row questionRow = sh.Range("G" & Rows.Count).End(xlUp).Row maxRow = WorksheetFunction.Max(idRow, questionRow) ' 定义名称直接指向合并的8列范围,从第一行开始取是为了自动加载列头 ThisWorkbook.Names.Add Name:="ListData", RefersToLocal:=sh.Range("A1:B" & maxRow & ",G1:L" & maxRow) With Me.listBox2 .ColumnHeads = True .ColumnCount = 8 .ColumnWidths = "30,85,85,85,85,85,85,85" .RowSource = "ListData" End With End Sub
内容的提问来源于stack exchange,提问作者Meranda
相关产品推荐
相关产品推荐

