excel 宏 把一个工作表按照某几个列拆分为多个工作表

前言

这两天接触到excel比较多,才发现使用excel不仅仅是简单的复制粘贴。
excel vb代码是非常强大,学会使用一些常用的功能,可以大大减少工作量。
废话不多少,来看
如下表格学生成绩表
在这里插入图片描述

如果我们要把这个表按照班级拆分为三个表,可能一般我们都是通过筛选后复制粘贴。但这是最土的办法,并且如果分类很多,数据量又大的话,非常浪费时间。
来看使用excel宏轻松搞定。excel宏代码如下:

Option Explicit
Option Base 1
 
Sub 按指定列分组拆分数据()
 
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
 
    Dim self As Worksheet
    Set self = ActiveSheet
    
    Dim nLastRowNum As Long
    Dim nLastColumnNum As Long
    
    Dim i As Long
    
    ' 删除其他的sheet
    
    For i = Sheets.Count To 1 Step -1
        If Sheets(i).Name <> self.Name Then
            Sheets(i).Delete
        End If
    Next i 
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True   
    
    '获取全部数据范围
    nLastRowNum = Cells(Rows.Count, 1).End(xlUp).Row
    nLastColumnNum = Cells(nLastRowNum, Columns.Count).End(xlToLeft).Column
    
    '获取标题
    Dim titleRange As Range
    Set titleRange = Application.InputBox(prompt:="请选择标题区域:将要当做标题行的每一个单元格", Type:=8)
     
    ' 有效数据开始行
    Dim nRowValidData As Long
    nRowValidData = titleRange.Row + titleRange.Rows.Count
 
    ' 获取拆分列的信息,只需要列号
    Dim splitColumnRange As Range
    Set splitColumnRange = Application.InputBox(prompt:="请选择拆分的列:选择任何一个该列的单元格即可", Type:=8)
    Dim columnNumToSplit As Long
    columnNumToSplit = splitColumnRange.Column
    
    ' 需要拆分的值字典
    Dim splitValueDict As Object
    ' 辅助字典用来保证顺序
    Dim splitValueDictReverse As Object
    Dim indexArray() As Long
    
    Set splitValueDict = CreateObject("Scripting.Dictionary")
    Set splitValueDictReverse = CreateObject("Scripting.Dictionary")
    
    Dim cellValue As String
    Dim ws As Worksheet
    
    For i = nRowValidData To nLastRowNum Step 1
        cellValue = Cells(i, columnNumToSplit).Text
        
        '1. 创建新的sheet;
        '2. 拷贝标题信息到新的sheet
        If Not splitValueDict.Exists(cellValue) Then
            splitValueDict(cellValue) = i
            splitValueDictReverse(i) = cellValue
            Set ws = Sheets.Add(After:=Worksheets(Worksheets.Count))
            ws.Name = cellValue
            self.Activate
            
            titleRange.Copy _
                ws.Range(ws.Cells(titleRange.Row, titleRange.Column), ws.Cells(nRowValidData - 1, titleRange.Column))
            
        End If
        
        ' 拷贝其他内容
        
        Range(Cells(i, 1), Cells(i, nLastColumnNum)).Copy _
            GetLastPasteRangeBySheetName(cellValue, nLastColumnNum)
                
    Next i
            
End Sub
 
Public Function GetLastPasteRangeBySheetName(ByRef SheetName As String, columnNum As Long) As Variant
    Dim wks As Worksheet
    Dim nLastRowNum As Long
 
    Set wks = ActiveWorkbook.Worksheets(SheetName)
    nLastRowNum = wks.Cells(wks.Rows.Count, 1).End(xlUp).Row
    
    Set GetLastPasteRangeBySheetName = wks.Range(wks.Cells(nLastRowNum + 1, 1), wks.Cells(nLastRowNum + 1, columnNum))
    
End Function

step 1 进入excel vba编程界面

在excel工作表中标签处右键查看代码
在这里插入图片描述

进入如下界面
在这里插入图片描述

step 2 粘贴代码

然后把代码粘贴窗口中如下图:
在这里插入图片描述

step 3 运行代码

点击下图中红框按钮
在这里插入图片描述
出现下面弹框
在这里插入图片描述
选择需要拆分标题区域。只需要用鼠标拖动选择区域即可
在这里插入图片描述
确定后再选择拆分的单元格,即按照班级拆分,选择班级
在这里插入图片描述
确定,结果如下
在这里插入图片描述

step 4 删除宏代码

如果为了保存方便,我们需要把宏代码删掉,不然保存需要保存为支持宏的格式。
运行成功后删除宏
找到工具 选择宏。
在这里插入图片描述
删除刚刚的宏即可,然后关闭代码,保存即可
在这里插入图片描述

当然可以帮你写一个拆分PDF的Python代码。以下是一个示例代码,你可以根据自己的需求进行调整: ```python import pandas as pd from PyPDF2 import PdfFileWriter, PdfFileReader def split_pdf_by_excel(pdf_path, excel_path, sheet_name): # 读取Excel文件并获取指定工作表的数据 df = pd.read_excel(excel_path, sheet_name=sheet_name) total_pages = df['数量'].sum() # 获取总页数 # 读取PDF文件 pdf = PdfFileReader(pdf_path) # 创建一个PdfFileWriter对象用于输出拆分后的PDF output_pdf = PdfFileWriter() start_page = 0 for index, row in df.iterrows(): order_number = row['订单号'] num_pages = row['数量'] # 拆分PDF,将指定数量的页添加到输出对象中 for i in range(num_pages): page = pdf.getPage(start_page + i) output_pdf.addPage(page) # 将输出对象保存为新的PDF文件 output_filename = f"{order_number}.pdf" with open(output_filename, 'wb') as output_file: output_pdf.write(output_file) start_page += num_pages print(f"成功拆分PDF为{total_pages}页,并保存为对应的订单号命名的多个文件。") # 调用函数进行拆分 split_pdf_by_excel('input.pdf', 'input.xlsx', 'Sheet1') ``` 请确保你已经安装了 `pandas` 和 `PyPDF2` 这两个库。在运行代码之前,请将你的PDF文件命名为 `input.pdf`,将Excel文件命名为 `input.xlsx`,并确保Excel文件中有一个名为 `Sheet1` 的工作表,其中包含 `订单号` 和 `数量` 这两数据。 这段代码会根据Excel中的数量信息拆分PDF,并将拆分后的文件保存为以订单号命名的多个PDF文件。同时,它会计算总页数并打印出来。 希望这能帮到你!如果你有任何问题,请随时问我。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜的中年程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值