如何使用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
相关产品推荐
相关产品推荐

