VBA实现多工作表循环遍历并将数据复制到新工作表
解决Excel VBA遍历行并重新格式化数据到新工作表的问题
嘿,Oliver!刚上手VBA就能精准抓出核心需求点,已经很厉害了~ 我给你写了一段针对性的代码,还会把每个关键步骤拆解开讲,方便你边看边学:
Sub 格式化并复制数据() Dim 源工作表 As Worksheet Dim 目标工作表 As Worksheet Dim 标题数组 As Variant Dim 最后行号 As Long Dim 当前行 As Long Dim 当前列 As Integer Dim 最后有效值 As Variant ' 记录每列的最后非空值 ' 1. 初始化工作表(把"源表"改成你的实际工作表名称) Set 源工作表 = ThisWorkbook.Worksheets("源表") ' 检查目标表是否存在,不存在就新建(把"格式化后数据"改成你想要的表名) On Error Resume Next Set 目标工作表 = ThisWorkbook.Worksheets("格式化后数据") On Error GoTo 0 If 目标工作表 Is Nothing Then Set 目标工作表 = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) 目标工作表.Name = "格式化后数据" End If ' 2. 存储B到G列的标题到数组 标题数组 = 源工作表.Range("B1:G1").Value ' 3. 获取源表最后一行行号(假设数据从A列开始) 最后行号 = 源工作表.Cells(源工作表.Rows.Count, "A").End(xlUp).Row ' 4. 遍历每一行数据(从第二行开始,跳过标题行) For 当前行 = 2 To 最后行号 ' 遍历B到G列,处理空白单元格 For 当前列 = 2 To 7 ' B列是第2列,G列是第7列 ' 如果当前单元格为空,用上一个有效值;否则更新有效值 If 源工作表.Cells(当前行, 当前列).Value = "" Then 源工作表.Cells(当前行, 当前列).Value = 最后有效值 Else 最后有效值 = 源工作表.Cells(当前行, 当前列).Value End If Next 当前列 ' 5. 把处理后的数据写入目标表(这里假设你需要每行对应一条记录,可根据实际格式调整) ' 示例:把A列内容 + 标题拼接内容写入目标表,你可以按需修改 目标工作表.Cells(目标工作表.Rows.Count, "A").End(xlUp).Offset(1, 0).Value = _ 源工作表.Cells(当前行, "A").Value & " | " & _ 标题数组(1, 1) & ":" & 源工作表.Cells(当前行, 2).Value & " | " & _ 标题数组(1, 2) & ":" & 源工作表.Cells(当前行, 3).Value & " | " & _ 标题数组(1, 3) & ":" & 源工作表.Cells(当前行, 4).Value & " | " & _ 标题数组(1, 4) & ":" & 源工作表.Cells(当前行, 5).Value & " | " & _ 标题数组(1, 5) & ":" & 源工作表.Cells(当前行, 6).Value & " | " & _ 标题数组(1, 6) & ":" & 源工作表.Cells(当前行, 7).Value Next 当前行 MsgBox "数据格式化完成!", vbInformation End Sub
关键步骤拆解:
- 初始化工作表:先指定源工作表,再检查目标表是否存在——避免重复建表或者找不到表的问题。
- 存储列标题:把B-G的标题存进数组,后面拼接数据的时候直接调用,不用反复读取单元格,效率更高。
- 遍历行与处理空白:用
最后有效值变量记录每列的上一个非空值,遇到空白单元格就自动填充这个值,完美解决"保留最后一个有效值"的需求。 - 写入新表:这里用了拼接字符串的示例格式,你可以根据自己需要的目标格式修改,比如直接复制整行、拆分到不同列等等。
小提示:
- 记得把代码里的
"源表"和"格式化后数据"改成你实际的工作表名称; - 如果你的数据起始行不是第2行,或者列范围不是B-G,调整对应的行号和列号就行;
- 运行代码前最好先备份工作簿,避免误操作~
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

