VBA跨列表框转移条目时含单引号文本被拆分报错如何解决
问题根源
- 错误使用
AddItem方法参数:AddItem(Item, [RowIndex])的第二个参数是要插入的行号,不是列号,你现有代码会把三个字段分别插入三行的第一列,逻辑本身就不符合需求。 - 特殊字符自动拆分:多列列表框的
AddItem方法默认将分号、逗号、单引号等识别为列分隔符,内容包含这些字符时就会被自动拆分到多列。
直接修复方案
不需要更换实现逻辑,直接修正代码写法即可,修复后代码如下:
Private Sub btnAddUser_Click() ' 修正变量声明,避免隐式声明为Variant Dim SelectUser As Variant Dim ItemString1 As String, ItemString2 As String, ItemString3 As String Dim RowString As String For Each SelectUser In lstusers.ItemsSelected ' 读取原列表框选中行的三列内容 ItemString1 = lstusers.Column(0, SelectUser) ItemString2 = lstusers.Column(1, SelectUser) ItemString3 = lstusers.Column(2, SelectUser) ' 拼接整行内容:每个字段用双引号包裹,避免特殊字符被识别为分隔符 RowString = """" & Replace(ItemString1, """", """""") & """;" & _ """" & Replace(ItemString2, """", """""") & """;" & _ """" & Replace(ItemString3, """", """""") & """" ' 一次添加一整行到目标列表框 Form_frmAS.lstAddedUsers.AddItem RowString Next SelectUser ' 只需要最后刷新一次即可,循环内重复刷新会严重降低效率 Form_frmAS.lstAddedUsers.Requery End Sub
代码说明
- 用双引号包裹每个列的内容,告知VBA双引号之间的全部内容是单个列的值,不会把内部的特殊符号识别成分隔符
- 对内容本身包含的双引号做转义处理:把内容里的单个双引号替换成两个双引号,避免字符串拼接出错
- 一次调用
AddItem传入整行拼接好的字符串,不用多次调用,也不需要传行索引(默认追加到末尾) - 把
Requery放到循环外,减少不必要的界面刷新,提升运行效率
注意事项
请提前确认目标列表框lstAddedUsers的属性配置:
- 行来源类型:值列表
- 列数:3(和原列表框列数一致)
内容的提问来源于stack exchange,提问作者D Dark2k
相关产品推荐
相关产品推荐

