EXCEL VBA 窗体:员工信息查询系统
- 2026-11-01 17:27:32
EXCEL VBA 窗体:员工信息查询系统
窗体核心代码: 关注本公众号,后台发消息:26051301 获取代码示例文件 📌 温馨提示:本次分享的版本有效期至2026年10月11日。若您在体验过程中有任何改进建议,欢迎在下方留言交流。

' ================== 查询按钮 ==================Private Sub btnSearch_Click()Dim ws As WorksheetDim i As Long, j As LongDim matchRow As BooleanDim cnt As LongSet ws = ThisWorkbook.Worksheets(DATA_SHEET)' ----- 读取并处理条件 -----Dim nameFilter As String: nameFilter = Trim(txtName.Text)Dim deptFilter As String: deptFilter = cboDept.TextDim dateFrom As Date, dateTo As DateDim hasDateFrom As Boolean, hasDateTo As BooleanhasDateFrom = IsDate(txtDateFrom.Text)hasDateTo = IsDate(txtDateTo.Text)' 使用 DateValue 去掉可能的时间部分If hasDateFrom Then dateFrom = DateValue(CDate(txtDateFrom.Text))If hasDateTo Then dateTo = DateValue(CDate(txtDateTo.Text))' ----- 将数据读入数组(一次性读取,速度快)-----Dim dataArr As VariantdataArr = ws.Range(ws.Cells(dataStartRow, 1), ws.Cells(lastRow, lastCol)).Value' 准备存储结果的数组(最后一列存行号,前面存显示数据)Dim outArr() As VariantReDim outArr(1 To UBound(dataArr, 1), 1 To lastCol + 1)cnt = 0' 清空旧的行号映射rowIndexMap.RemoveAll' ----- 遍历每一行数据 -----For i = 1 To UBound(dataArr, 1)matchRow = True' --- 姓名模糊匹配 (第1列) ---If Len(nameFilter) > 0 ThenIf InStr(1, CStr(dataArr(i, 1)), nameFilter, vbTextCompare) = 0 ThenmatchRow = FalseEnd IfEnd If' --- 部门精确匹配 (第2列) ---If matchRow And Len(deptFilter) > 0 ThenIf StrComp(CStr(dataArr(i, 2)), deptFilter, vbTextCompare) <> 0 ThenmatchRow = FalseEnd IfEnd If' --- 日期范围 (第3列) - 修正版:>=起始 且 <=结束 ---If matchRow ThenDim rowDateRaw As VariantrowDateRaw = dataArr(i, 3)If IsDate(rowDateRaw) ThenDim pureRowDate As DatepureRowDate = DateValue(CStr(rowDateRaw)) ' 去掉时分秒If hasDateFrom ThenIf pureRowDate < dateFrom Then matchRow = FalseEnd IfIf hasDateTo ThenIf pureRowDate > dateTo Then matchRow = FalseEnd IfElse' 不是日期的单元格,如果设置了日期筛选条件则视为不匹配If hasDateFrom Or hasDateTo Then matchRow = FalseEnd IfEnd If' ---------- 可在此继续添加其它列条件 ----------' ----- 如果符合条件,保存该行数据及行号 -----If matchRow Thencnt = cnt + 1' 第一列存真实行号(dataStartRow + i - 1)outArr(cnt, 1) = dataStartRow + i - 1For j = 1 To lastColoutArr(cnt, j + 1) = dataArr(i, j)Next j' 记录映射:ListBox 索引(0-based) -> 源行号rowIndexMap(cnt - 1) = dataStartRow + i - 1End IfNext i' ----- 显示结果到 ListBox -----lstResult.ClearIf cnt > 0 Then' 截取有效行Dim finalArr() As VariantReDim finalArr(1 To cnt, 1 To lastCol + 1)For i = 1 To cntFor j = 1 To lastCol + 1finalArr(i, j) = outArr(i, j)Next jNextlstResult.List = finalArr' 调整列宽(第一列宽度0已预设,此处调整可见列)AutoFitVisibleColumnsElseMsgBox "没有找到匹配的记录。", vbInformation, "提示"End IfEnd Sub
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。