隐藏Excel工作簿后UserForm的RowSource属性报运行时错误380
运行时错误380:隐藏工作簿后ListBox RowSource失效的原因及解决办法
核心原因
- 当工作簿被隐藏时,
RowSource仅用命名区域名称"Names"会失效,因为VBA默认从当前活动工作簿/工作表查找区域,隐藏的工作簿不会处于活动状态,导致无法定位目标区域,触发380错误。 - 若命名区域
"Names"的作用域是工作表级(而非工作簿级),隐藏对应工作表后也会出现同样的定位失败问题。
修复方案
方案1:指定完整的区域引用路径
给RowSource加上工作簿和工作表的完整路径,让VBA能精准定位到目标区域,不受工作簿隐藏影响:
' 替换为你的数据所在工作簿和工作表名称 Me.ListBox1.RowSource = ThisWorkbook.Worksheets("员工数据").Range("Names").Address(External:=True) Me.ListBox1.ColumnCount = 3 Me.ListBox1.ColumnHeads = True
方案2:改用ListFillRange属性
ListFillRange对隐藏工作簿的兼容性比RowSource更好,同样指定完整路径即可:
Me.ListBox1.ListFillRange = ThisWorkbook.Worksheets("员工数据").Range("Names").Address(External:=True) Me.ListBox1.ColumnCount = 3 Me.ListBox1.ColumnHeads = True
方案3:手动加载数据(最稳定灵活)
完全绕开区域引用的限制,通过代码把数据逐行加载到ListBox,不管工作簿/工作表是否隐藏都能正常工作:
Dim dataRange As Range Set dataRange = ThisWorkbook.Worksheets("员工数据").Range("Names") Me.ListBox1.Clear Me.ListBox1.ColumnCount = 3 Me.ListBox1.ColumnHeads = True ' 写入表头 Me.ListBox1.AddItem Me.ListBox1.List(0, 0) = dataRange.Cells(1, 1).Value Me.ListBox1.List(0, 1) = dataRange.Cells(1, 2).Value Me.ListBox1.List(0, 2) = dataRange.Cells(1, 3).Value ' 写入数据行 Dim i As Long For i = 2 To dataRange.Rows.Count Me.ListBox1.AddItem Me.ListBox1.List(i - 1, 0) = dataRange.Cells(i, 1).Value Me.ListBox1.List(i - 1, 1) = dataRange.Cells(i, 2).Value Me.ListBox1.List(i - 1, 2) = dataRange.Cells(i, 3).Value Next i
内容的提问来源于stack exchange,提问作者Desslock
相关产品推荐
相关产品推荐

