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

如何使用VBA读取指定工作表行数据、跳过空白单元格输出到目标表

实现指定行数据读取并过滤空白列的VBA方案

以下是可直接使用的VBA代码,全程基于数组操作,效率远高于逐单元格读写,可自动过滤空白列和对应无数据的表头:

Sub FilterEmptyColumnsForTargetUser()
    ' 可自定义参数区域
    Const SOURCE_SHEET As String = "Sheet1" ' 源数据所在工作表名
    Const TARGET_SHEET As String = "输出结果" ' 存放结果的工作表名,不存在会自动创建
    Const TARGET_NAME As String = "Ami" ' 要查询的目标姓名
    Const START_ROW As Long = 1 ' 表头所在行
    Const MAX_DATA_ROW As Long = 170 ' 数据最大行数
    Const COL_COUNT As Long = 21 ' 总列数
    
    Dim srcArr As Variant
    Dim resArr() As Variant
    Dim wsSource As Worksheet, wsTarget As Worksheet
    Dim targetRow As Long, c As Long, resCol As Long
    
    ' 读取源数据到数组
    Set wsSource = ThisWorkbook.Worksheets(SOURCE_SHEET)
    srcArr = wsSource.Cells(START_ROW, 1).Resize(MAX_DATA_ROW, COL_COUNT).Value
    
    ' 查找目标姓名所在行
    For targetRow = 2 To UBound(srcArr, 1)
        If srcArr(targetRow, 1) = TARGET_NAME Then Exit For
    Next targetRow
    If targetRow > UBound(srcArr, 1) Then
        MsgBox "未找到指定姓名:" & TARGET_NAME, vbExclamation
        Exit Sub
    End If
    
    ' 统计非空列数量,构建结果数组
    resCol = 0
    For c = 1 To COL_COUNT
        If Trim(srcArr(targetRow, c)) <> "" Then
            resCol = resCol + 1
            ReDim Preserve resArr(1 To 2, 1 To resCol)
            resArr(1, resCol) = srcArr(1, c) ' 表头
            resArr(2, resCol) = srcArr(targetRow, c) ' 对应值
        End If
    Next c
    
    ' 输出结果到指定工作表
    On Error Resume Next
    Set wsTarget = ThisWorkbook.Worksheets(TARGET_SHEET)
    On Error GoTo 0
    If wsTarget Is Nothing Then
        Set wsTarget = ThisWorkbook.Worksheets.Add(after:=wsSource)
        wsTarget.Name = TARGET_SHEET
    End If
    wsTarget.Cells.Clear
    wsTarget.Cells(1, 1).Resize(2, resCol).Value = resArr
    ' 可选:自动调整列宽
    wsTarget.UsedRange.EntireColumn.AutoFit
    
    MsgBox "数据导出完成,已存放至工作表:" & TARGET_SHEET, vbInformation
End Sub

使用说明

  • 你可以根据实际业务修改代码开头常量区域的参数,适配自己的表格结构
  • 如果需要为每一行都生成单独的工作表,只需把固定的TARGET_NAME改为循环遍历所有姓名行,每次循环对应生成一个新工作表即可
  • 你之前写的过滤逻辑无效的原因有两个:第一Range.Select方法返回的是Range对象本身,不是单元格的内容值,需要用Range.Value获取单元格内容;第二你只判断了单一列,也没有执行删除空白列的操作,所以不会生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:10