如何将UserForm中ListBox内容按行写入工作表指定区域
问题排查与修复方案
核心问题分析
你的代码中ListBox内容写入部分的错误在于数组维度处理和区域Resize方向错误:
- 单列ListBox的
List属性返回二维数组,结构为ListItem(行索引, 0)(行索引从0到ListCount-1,仅1列) - 当前代码用
Resize(UBound(ListItem) + 1, UBound(ListItem, 1)),其中UBound(ListItem,1)是数组的行上界,导致Resize出的区域是多行1列,内容会纵向写入并覆盖后续行数据 - 你需要将单列数组转置为1行多列,再写入目标行的横向区域
修复后的代码片段
替换原代码中rsho.Range("O" & nextRow).Resize(UBound(ListItem) + 1, UBound(ListItem, 1)).Value = ListItem这一行,改为:
' 先判断ListBox是否有内容,避免空数组报错 If Me.LstItem.ListCount > 0 Then Dim listArr As Variant listArr = Me.LstItem.List ' 转置单列数组为横向,写入从O列开始的当前行 rsho.Range("O" & nextRow).Resize(1, UBound(listArr, 1) + 1).Value = Application.Transpose(listArr) End If
额外优化建议
- 变量类型修正:
nextRow建议用Long类型,避免行数超过Integer上限(Excel行数远大于32767)Dim nextRow As Long - 移除不必要的
On Error Resume Next:该语句会掩盖其他错误,建议只在必要处使用,或后续添加On Error GoTo 0恢复错误捕获 - 清空控件的简化写法:批量处理相同类型控件,减少重复代码:
' 清空文本框、组合框 Dim ctrl As Control For Each ctrl In Me.Controls If TypeName(ctrl) = "TextBox" Or TypeName(ctrl) = "ComboBox" Then ctrl.Text = "" Next ctrl ' 清空列表框 LstDisplay.Clear LstItem.Clear ' 清空标签 lblItemCo.Caption = "" lblOrderTime.Caption = "" ' 原代码漏写了.Caption属性
内容的提问来源于stack exchange,提问作者A.Sergio
相关产品推荐
相关产品推荐

