Excel VBA用户窗体联动ComboBox:按条件筛选填充下拉列表求助
完善后的getSpecificData函数实现
以下是符合需求的VBA函数,同时附上调用示例(绑定到ComboBox1的选择变更事件):
' 定义函数:根据用户名筛选可用库存数据 Function getSpecificData(targetUsername As String) As Variant Dim wsInventory As Worksheet Dim lastRow As Long Dim i As Long Dim resultArr() As String Dim arrIndex As Integer ' 初始化结果数组索引 arrIndex = 0 ' 指向Inventory工作表 Set wsInventory = ThisWorkbook.Worksheets("Inventory") ' 获取数据区域最后一行 lastRow = wsInventory.Cells(wsInventory.Rows.Count, "C").End(xlUp).Row ' 遍历数据行(从第2行开始,假设第1行是表头) For i = 2 To lastRow ' 判断第3列(C列)是否等于目标用户名,且第4列(D列)为"Available" If wsInventory.Cells(i, "C").Value = targetUsername And _ UCase(wsInventory.Cells(i, "D").Value) = "AVAILABLE" Then ' 扩展结果数组 ReDim Preserve resultArr(arrIndex) ' 将第1列(A列)的库存数据存入数组 resultArr(arrIndex) = wsInventory.Cells(i, "A").Value arrIndex = arrIndex + 1 End If Next i ' 返回结果数组(如果无匹配数据则返回空数组) getSpecificData = resultArr End Function ' ComboBox1选择变更事件:填充ComboBox2 Private Sub ComboBox1_Change() Dim inventoryList As Variant ' 清空ComboBox2原有内容 ComboBox2.Clear ' 调用函数获取对应库存数据 inventoryList = getSpecificData(ComboBox1.Value) ' 将结果添加到ComboBox2 If IsArray(inventoryList) Then ComboBox2.List = inventoryList End If End Sub
关键说明:
- 函数接收目标用户名作为参数,遍历
Inventory工作表的C列和D列,筛选符合条件的A列数据 - 用
UCase统一大小写判断,避免因大小写不一致导致的匹配失败 - 结果以数组形式返回,直接赋值给ComboBox2的
List属性实现快速填充 - 提前获取最后一行行号,避免遍历整个工作表提升效率
内容的提问来源于stack exchange,提问作者user3544580
相关产品推荐
相关产品推荐

