You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:38:14