Excel VBA从其他工作表填充ComboBox时出现运行时错误'438'
解决VBA填充ComboBox时的Run-time error '438'错误
你的代码出现438错误主要有两个问题:
- 错误地在
Sheet_Contacts工作表上调用了属于Sheet_Invoice_Template的ComboBoxClientes控件,且工作表对象无法直接通过控件名称访问ActiveX控件。 - 直接将单元格区域的
Value赋值给ComboBox的方式错误,需使用List属性来设置列表内容。
修正后的代码(两种可选方式)
方式一:通过OLEObjects访问ActiveX控件
Sub Add_ComboBox_From_Another_Worksheet() Dim contacts As Worksheet Dim comboSheet As Worksheet Dim targetCombo As OLEObject Dim sourceRange As Range Set contacts = ThisWorkbook.Worksheets("Sheet_Contacts") Set comboSheet = ThisWorkbook.Worksheets("Sheet_Invoice_Template") ' 获取目标ComboBox控件 Set targetCombo = comboSheet.OLEObjects("ComboBoxClientes") ' 获取数据源范围(从A2到A列最后一行有数据的单元格) Set sourceRange = contacts.Range("A2:A" & contacts.Cells(contacts.Rows.Count, 1).End(xlUp).Row) ' 清空ComboBox原有内容,再赋值新列表 targetCombo.Object.Clear targetCombo.Object.List = sourceRange.Value End Sub
方式二:直接引用工作表的ActiveX控件
Sub Add_ComboBox_From_Another_Worksheet() Dim contacts As Worksheet Dim sourceRange As Range Set contacts = ThisWorkbook.Worksheets("Sheet_Contacts") ' 获取数据源范围 Set sourceRange = contacts.Range("A2:A" & contacts.Cells(contacts.Rows.Count, 1).End(xlUp).Row) ' 操作目标工作表上的ComboBox With ThisWorkbook.Worksheets("Sheet_Invoice_Template").ComboBoxClientes .Clear .List = sourceRange.Value End With End Sub
注意事项
- 确认控件名称准确:打开开发工具的属性窗口(按F4),选中
Sheet_Invoice_Template上的ComboBox,检查(名称)属性是否为ComboBoxClientes。 - 若使用的是表单控件(而非ActiveX控件),需改用
ListFillRange属性赋值,且控件名称格式通常为"Drop Down X",需对应调整。
内容的提问来源于stack exchange,提问作者Cesar Tepetla
相关产品推荐
相关产品推荐

