excel VBA根据表格内容新建工作簿并贴入内容

本文通过对比两种VBA代码,展示了如何使用更简洁高效的代码实现相同的功能,即根据Excel表格中的列名创建多个工作簿,并保留原始格式。通过具体实例,文章强调了代码优化的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sub addRe()
    '1.此脚本用于根据sheet1中的第一列从第三行开始的数据新建工作簿并重命名
    '2.复制第一列和对应的列的值
    '3.调整新建工作簿的列宽
    ScreenUpdating = False '关闭屏幕刷新
    Dim sCount As Long     '列数
    Dim sCol As Long       '行数

    Dim rnG1 As Range '第一列区域
    Dim rnG2 As Range '第二列区域
    Dim rn As Range   '第一列的开头
    Dim arr1() '第一列的数组(静态)
    Dim arr2() '第二列的数组(动态)

    Set rn = Sheet1.Cells(2, 1) '读出新工作簿要用的第一列的开头
    Set rnG1 = Sheet1.Range(rn, rn.End(xlDown)) '读出新工作簿要用的第一列的区域
        sCount = Sheet1.Range("A2").CurrentRegion.Columns.Count - 1 '读出行数
        sCol = rnG1.Rows.Count '读行数
        arr1 = rnG1 '第一列
    Dim arrName() '名字数组
    ReDim arrName(sCount - 1) '调整数组大小
    
    For i = 1 To sCount
        
        Set rn = Sheet1.Cells(2, i + 1) '读出新工作簿要用的第二列的开头
        Set rnG2 = Sheet1.Range(rn, rn.End(xlDown)) '读出新工作簿要用的第二列的区域
        arr2 = rnG2 '转换为数组
        Sheet1.Activate
        Sheets.Add after:=ActiveSheet '新建工作簿
        
        ActiveSheet.Name = Sheet1.Cells(2, i + 1) '工作簿重命名
        arrName(i - 1) = ActiveSheet.Name '记录新建工作簿的名称
        ActiveSheet.Range(Cells(2, 1), Cells(sCol, 1)) = arr1 '第一列赋值
        ActiveSheet.Range(Cells(2, 2), Cells(sCol, 2)) = arr2 '第二列赋值
        
        Columns("A:B").EntireColumn.AutoFit '调整选中所有新建的工作簿AB列的列宽
    Next i

    Sheet1.Activate '回到Sheet1工作簿
    ScreenUpdating = True '打开屏幕刷新
End Sub


在我写完上面的代码之后很快就被啪啪打脸了:

下面这个简单高效,结果一样还保留了格式。。。

Sub fz()
    Dim a As Byte
    For a = 2 To Cells(2, Columns.Count).End(xlToLeft).Column
        With Sheets.Add(after:=Sheets(Sheets.Count))
            .Name = Worksheets(1).Cells(2, a)
            Worksheets(1).Select
            Worksheets(1).Columns(1).Copy .Range("a1")
            Worksheets(1).Columns(a).Copy .Range("b1")
        End With
    Next a
End Sub

 

 

表格内容大概是这样的:

     
时间J2-01(JD0280)_位移(mm)J2-02(JD0267)_位移(mm)J2-03(JD0282)_位移(mm)J2-04(JD0275)_位移(mm)
2019-07-30-0.14-0.24-0.2-0.26
2019-07-29-0.14-0.24-0.2-0.26
2019-07-28-0.14-0.23-0.19-0.26
2019-07-27-0.14-0.23-0.19-0.26
2019-07-26-0.13-0.23-0.19-0.26
2019-07-25-0.13-0.23-0.18-0.25
2019-07-24-0.13-0.22-0.18-0.25
2019-07-23-0.13-0.22-0.18-0.25
2019-07-22-0.13-0.22-0.17-0.24
2019-07-21-0.13-0.22-0.17-0.25
2019-07-20-0.12-0.21-0.16-0.24
2019-07-19-0.12-0.21-0.15-0.24
2019-07-18-0.12-0.2-0.14-0.23
2019-07-17-0.12-0.21-0.16-0.24
2019-07-16-0.12-0.2-0.14-0.23
2019-07-15-0.11-0.19-0.12-0.22
2019-07-14-0.11-0.19-0.11-0.21
2019-07-13-0.1-0.18-0.11-0.21
2019-07-12-0.11-0.19-0.12-0.21
2019-07-11-0.11-0.19-0.12-0.22
2019-07-10-0.11-0.19-0.11-0.21
2019-07-09-0.1-0.18-0.1-0.21
2019-07-08-0.1-0.18-0.1-0.21
2019-07-07-0.1-0.18-0.1-0.21
2019-07-06-0.1-0.18-0.1-0.21

结果是这样的:

### Excel VBA 根据指定列内容自动拆分数据到多个工作簿 以下是基于需求编写的VBA代码示例,该代码能够根据某列中的唯一值将数据拆分至不同的工作簿中: ```vba Sub SplitWorkbookByColumn() Dim wsSource As Worksheet Dim wbTarget As Workbook Dim dict As Object Dim lastRow As Long Dim i As Long, j As Long Dim key As Variant ' 设置源工作表 Set wsSource = ThisWorkbook.Sheets(1) ' 假设数据位于第一个工作表上 Set dict = CreateObject("Scripting.Dictionary") ' 创建字典对象存储唯一键值 ' 获取最后一行的数据位置 lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row ' 遍历目标列(假设为B列),获取唯一的分类项作为键值 For i = 2 To lastRow ' 假设第1行为标题行 key = wsSource.Cells(i, 2).Value ' B列为分类依据列 If Not dict.exists(key) Then dict.Add key, Nothing End If Next i ' 开始逐个创建新的工作簿将对应数据复制过去 Application.ScreenUpdating = False For Each key In dict.keys ' 新建一个工作簿 Set wbTarget = Workbooks.Add ' 复制标题行 wsSource.Rows(1).Copy Destination:=wbTarget.Sheets(1).Rows(1) ' 将匹配当前key的行复制到新工作簿中 j = 2 For i = 2 To lastRow If wsSource.Cells(i, 2).Value = key Then wsSource.Rows(i).Copy Destination:=wbTarget.Sheets(1).Rows(j) j = j + 1 End If Next i ' 保存新工作簿命名 wbTarget.SaveAs Filename:="D:\SplitFiles\" & Replace(key, "/", "-") & ".xlsx", FileFormat:=xlOpenXMLWorkbook wbTarget.Close SaveChanges:=False Next key Application.ScreenUpdating = True MsgBox "数据已成功拆分!", vbInformation End Sub ``` #### 说明 上述代码实现了以下功能: - **读取数据**:从源工作表的第一张表格中读取数据[^1]。 - **识别唯一值**:通过遍历指定列(此处假定为第二列即`B`列)找到所有的唯一值,将其存入字典中用于后续操作[^3]。 - **新建工作簿**:对于每一个唯一值,在循环过程中都会创建一个新的Excel文件[^4]。 - **保存文件**:每个子集被保存成独立的工作簿,路径设置为了 `D:\SplitFiles\` 文件夹下[^2]。 注意调整脚本内的具体参数以适应实际应用场景的需求,比如更改默认使用的Sheet编号或者修改输出目录地址等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值