You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)。
  • 工作表重复检查:提前判断是否已存在同名工作表,避免创建重复表。

调用方式

  1. 打开你的Excel文件,按Alt + F11打开VBA编辑器;
  2. 插入新模块,粘贴上述代码;
  3. 回到user表,给下拉框添加宏关联(右键下拉框→指定宏→选择筛选机构数据并创建工作表)。

内容的提问来源于stack exchange,提问作者andrea65

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:45:15