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

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的标题存进数组,后面拼接数据的时候直接调用,不用反复读取单元格,效率更高。
  • 遍历行与处理空白:用最后有效值变量记录每列的上一个非空值,遇到空白单元格就自动填充这个值,完美解决"保留最后一个有效值"的需求。
  • 写入新表:这里用了拼接字符串的示例格式,你可以根据自己需要的目标格式修改,比如直接复制整行、拆分到不同列等等。

小提示:

  1. 记得把代码里的"源表"和"格式化后数据"改成你实际的工作表名称;
  2. 如果你的数据起始行不是第2行,或者列范围不是B-G,调整对应的行号和列号就行;
  3. 运行代码前最好先备份工作簿,避免误操作~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:18:43