VBA宏开发求助:按选定卫生机构筛选患者数据至新工作表
解决VBA中
Sheets(sName)变量未定义错误并完成机构数据筛选复制功能 错误原因
你遇到的「变量未定义」错误,大概率是因为sName变量没有提前声明,或者未正确从下拉框获取机构名称。VBA默认允许未声明变量,但容易引发这类错误,建议开启Option Explicit强制变量声明。
完整可运行代码
下面是适配需求的完整代码,包含变量声明、机构名称获取、工作表创建、数据筛选复制的全流程:
Option Explicit ' 强制变量声明,避免未定义错误 Sub 筛选机构数据并创建工作表() Dim wsUser As Worksheet, wsData As Worksheet, wsNew As Worksheet Dim sName As String Dim lastRow As Long, targetCol As Integer Dim rngData As Range ' 定义工作表对象 Set wsUser = ThisWorkbook.Sheets("user") Set wsData = ThisWorkbook.Sheets("data") ' 获取下拉框选中的机构名称(假设下拉框在user表的A1单元格,可自行修改) sName = wsUser.Range("A1").Value If sName = "" Then MsgBox "请先选择卫生机构!", vbExclamation Exit Sub End If ' 检查是否已存在同名工作表 On Error Resume Next Set wsNew = ThisWorkbook.Sheets(sName) On Error GoTo 0 If Not wsNew Is Nothing Then MsgBox "机构「" & sName & "」的工作表已存在!", vbInformation Exit Sub End If ' 创建新工作表并命名 Set wsNew = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) wsNew.Name = sName ' 确定data表中机构列的位置(假设机构名称/编号在A列,可自行修改为对应列号) targetCol = 1 ' A列=1,B列=2,以此类推 ' 复制data表表头到新表 wsData.Rows(1).Copy Destination:=wsNew.Rows(1) ' 获取data表数据最后一行 lastRow = wsData.Cells(wsData.Rows.Count, targetCol).End(xlUp).Row ' 筛选并复制对应机构的数据 wsData.Range("A1").AutoFilter Field:=targetCol, Criteria1:=sName wsData.Range("A2:A" & lastRow).SpecialCells(xlCellTypeVisible).EntireRow.Copy _ Destination:=wsNew.Cells(wsNew.Rows.Count, 1).End(xlUp).Offset(1, 0) ' 取消筛选 wsData.AutoFilterMode = False ' 自动调整新表列宽 wsNew.Columns.AutoFit MsgBox "机构「" & sName & "」的数据已成功导出!", vbInformation End Sub
关键说明
- 变量声明:开头的
Option Explicit强制所有变量必须声明,彻底避免「变量未定义」错误。 - 下拉框取值:代码默认从
user表的A1单元格获取选中值,如果你的下拉框是ActiveX控件(比如ComboBox),可把sName = wsUser.Range("A1").Value改成sName = wsUser.ComboBox1.Value。 - 机构列调整:如果
data表中机构编号/名称不在A列,修改targetCol的值即可(比如B列设为2)。 - 工作表重复检查:提前判断是否已存在同名工作表,避免创建重复表。
调用方式
- 打开你的Excel文件,按
Alt + F11打开VBA编辑器; - 插入新模块,粘贴上述代码;
- 回到
user表,给下拉框添加宏关联(右键下拉框→指定宏→选择筛选机构数据并创建工作表)。
内容的提问来源于stack exchange,提问作者andrea65
相关产品推荐
相关产品推荐

