首页>工作相关>Excel拆分复杂混合数据表至新表

Excel拆分复杂混合数据表至新表

一个拆分数据表的小案例,将混合表按国别拆分为多张数据表,并做一个简单的汇总工作。虽然代码不长,但最近vba用的不多,很多代码知道实现逻辑,但就是忘记了书写的格式,记录一下测试流程,方便查询。另外,简单功能active控件就能够满足要求,就先不要用自定义窗体了,光是让窗体打开数据表自动运行,就又多一道工序。

vba中的数组

定义一个整型数组

Dim array(3) As Integer ' 定义一个大小为4的数组,索引为0到3
array(3) = 10 ' 正确使用索引3来赋值

定义一个字符串数组

Dim strArray() As String
ReDim strArray(3) ' 定义一个长度为4的数组,索引从0到3
strArray(0) = "Apple"
strArray(1) = "Banana"
strArray(2) = "Cherry"
strArray(3) = "Date"

判断是否已存在分表

Public Function SheetExists(sName As String) As Boolean
    On Error GoTo ErrHandler
    Dim sht As Worksheet
    Set sht = ThisWorkbook.Sheets(sName)
    SheetExists = True
    Exit Function
ErrHandler:
    SheetExists = False
End Function

如不存在则创建新表

Public Function NewSheet(sName As String)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    ws.Name = sName
    
End Function

如已有表格则清空

Sub ClearWorksheetData()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1") ' 将Sheet1替换为你要清除数据的工作表名字
    ws.UsedRange.ClearContents ' 清除工作表中的数据
    Set ws = Nothing
End Sub

整合并拆表

Sub splitSheet()
    Dim Country As String
    Dim Count
    CountryArray = Array("美国站", "德国站", "法国站", "意大利站", "比利时站", "荷兰站", "加拿大站", "英国站", "墨西哥站", "土耳其站", "瑞典站", "日本站", "波兰站")
    
    '新建表格
    
    For i = 0 To 12
        
        Country = CountryArray(i)
        
        If SheetExists(Country) Then
    
        Else: NewSheet (Country)
    
        End If
    
    Next i
    
    '清理数据
    
    For i = 0 To 12
        
        Country = CountryArray(i)
        
        If SheetExists(Country) Then ClearWorksheetData (Country)
    
        End If
    
    Next i
    
    '拆分数据
    
    For i = 0 To 12
    
        Count = 3
        
        Country = CountryArray(i)
        
        If Country = "美国站" Or Country = "英国站" Or Country = "加拿大站" Then
              
            For j = 2 To 10240
        
                If j = 2 Then
                                
                    For k = 2 To 100
                    
                        Sheets(Country).Cells(j, k) = Sheets(1).Cells(j, k)
                    
                    Next k
                
                ElseIf Country = "美国站" And Sheets(1).Cells(j, 3) = "美元" Or Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                    
                        For l = 2 To 100
                        
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k

                ElseIf Country = "英国站" And Sheets(1).Cells(j, 3) = "英镑" Or Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                    
                        For l = 2 To 100
                        
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
                    
                ElseIf Country = "加拿大站" And Sheets(1).Cells(j, 3) = "加元" Or Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                    
                        For l = 2 To 100
                        
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
     
                End If
                
            Next j
    
        Else
            
            For j = 2 To 10240
        
                If j = 2 Then
                                
                    For k = 2 To 100
                    
                        Sheets(Country).Cells(j, k) = Sheets(1).Cells(j, k)
                    
                    Next k
                
                ElseIf Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                        
                        For l = 2 To 100
                            
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
     
                End If
        
            Next j
        
        End If
        
    Next i
       
End Sub

Public Function ClearWorksheetData(sName As String) '清理工作表
    
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Worksheets(sName)
    
    ws.UsedRange.ClearContents
    
    Set ws = Nothing
    
End Function

Public Function NewSheet(sName As String) '新建工作表
    
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    
    ws.Name = sName
    
End Function

Public Function SheetExists(sName As String) As Boolean '判断表单是否已存在
    
    On Error GoTo ErrHandler
    
    Dim sht As Worksheet
    
    Set sht = ThisWorkbook.Sheets(sName)
    
    SheetExists = True
    
    Exit Function

ErrHandler:
    
    SheetExists = False

End Function

绑定active按钮控件

Private Sub CommandButton1_Click()

    Run splitSheet

End Sub

Public Function splitSheet()

    Dim Country As String
    
    Dim Count
    
    CountryArray = Array("美国站", "德国站", "法国站", "意大利站", "比利时站", "荷兰站", "加拿大站", "英国站", "墨西哥站", "土耳其站", "瑞典站", "日本站", "波兰站")
    
    '新建表格
    
    For i = 0 To 12
        
        Country = CountryArray(i)
        
        If SheetExists(Country) Then
    
        Else: NewSheet (Country)
    
        End If
    
    Next i
    
    '清理数据
    
    For i = 0 To 12
        
        Country = CountryArray(i)
        
        If SheetExists(Country) Then ClearWorksheetData (Country)
    
    Next i
    
    '拆分数据
    
    For i = 0 To 12
    
        Count = 3
        
        Country = CountryArray(i)
        
        If Country = "美国站" Or Country = "英国站" Or Country = "加拿大站" Then
              
            For j = 2 To 10240
        
                If j = 2 Then
                                
                    For k = 2 To 100
                    
                        Sheets(Country).Cells(j, k) = Sheets(1).Cells(j, k)
                    
                    Next k
                
                ElseIf Country = "美国站" And Sheets(1).Cells(j, 3) = "美元" Or Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                    
                        For l = 2 To 100
                        
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k

                ElseIf Country = "英国站" And Sheets(1).Cells(j, 3) = "英镑" Or Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                    
                        For l = 2 To 100
                        
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
                    
                ElseIf Country = "加拿大站" And Sheets(1).Cells(j, 3) = "加元" Or Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                    
                        For l = 2 To 100
                        
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
     
                End If
                
            Next j
    
        Else
            
            For j = 2 To 10240
        
                If j = 2 Then
                                
                    For k = 2 To 100
                    
                        Sheets(Country).Cells(j, k) = Sheets(1).Cells(j, k)
                    
                    Next k
                
                ElseIf Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                        
                        For l = 2 To 100
                            
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
     
                End If
        
            Next j
        
        End If
        
    Next i
       
End Function

Public Function ClearWorksheetData(sName As String) '清理工作表
    
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Worksheets(sName)
    
    ws.UsedRange.ClearContents
    
    Set ws = Nothing
    
End Function

Public Function NewSheet(sName As String) '新建工作表
    
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    
    ws.Name = sName
    
End Function

Public Function SheetExists(sName As String) As Boolean '判断表单是否已存在
    
    On Error GoTo ErrHandler
    
    Dim sht As Worksheet
    
    Set sht = ThisWorkbook.Sheets(sName)
    
    SheetExists = True
    
    Exit Function

ErrHandler:
    
    SheetExists = False

End Function

最后简单进行汇总

总结数据未进行比对操作,后续需改进。

Private Sub CommandButton1_Click()

    Run splitSheet

End Sub

Public Function splitSheet()

    Dim Country As String
    
    Dim Count As Integer
    
    Dim ResArr(12) As Integer
    
    CountryArray = Array("美国站", "德国站", "法国站", "意大利站", "比利时站", "荷兰站", "加拿大站", "英国站", "墨西哥站", "土耳其站", "瑞典站", "日本站", "波兰站")
    
    '新建表格;
    
    For i = 0 To 12
        
        Country = CountryArray(i)
        
        If SheetExists(Country) Then
    
        Else: NewSheet (Country)
    
        End If
    
    Next i
    
    '清理数据;
    
    For i = 0 To 12
        
        Country = CountryArray(i)
        
        If SheetExists(Country) Then ClearWorksheetData (Country)
    
    Next i
    
    '拆分数据,注意 "cells" 函数的参数先行后列;
    
    For i = 0 To 12
    
        Count = 3
        
        Country = CountryArray(i)
        
        If Country = "美国站" Or Country = "英国站" Or Country = "加拿大站" Then
              
            For j = 2 To 10240
        
                If j = 2 Then
                                
                    For k = 2 To 100
                    
                        Sheets(Country).Cells(j, k) = Sheets(1).Cells(j, k)
                    
                    Next k
                
                ElseIf Country = "美国站" And Sheets(1).Cells(j, 3) = "美元" Or Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                    
                        For l = 2 To 100
                        
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
                    
                    j = j - 1
                    
                ElseIf Country = "英国站" And Sheets(1).Cells(j, 3) = "英镑" Or Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                    
                        For l = 2 To 100
                        
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
                    
                ElseIf Country = "加拿大站" And Sheets(1).Cells(j, 3) = "加元" Or Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                    
                        For l = 2 To 100
                        
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
                    
                    j = j - 1
     
                End If
                
            Next j
            '根据Count的值添加统计;
            SumResult Count, Country
    
        Else
            
            For j = 2 To 10240
        
                If j = 2 Then
                                
                    For k = 2 To 100
                    
                        Sheets(Country).Cells(j, k) = Sheets(1).Cells(j, k)
                    
                    Next k
                
                ElseIf Sheets(1).Cells(j, 3) = Country Then
                    
                    For k = 0 To 3
                        
                        For l = 2 To 100
                            
                            Sheets(Country).Cells(Count, l) = Sheets(1).Cells(j, l)
                        
                        Next l
                        
                        Count = Count + 1
                        
                        j = j + 1
                    
                    Next k
                    
                    j = j - 1
     
                End If
        
            Next j
        '根据Count的值添加统计;
        SumResult Count, Country
        
        End If
    
        ResArr(i) = Count
        
    Next i
    
    If SheetExists("汇总表格") Then
        
        ClearWorksheetData ("汇总表格")
    
    Else:
        
        NewSheet ("汇总表格")
    
    End If
    
    For i = 2 To 100
    
        Sheets("汇总表格").Cells(1, i) = Sheets(1).Cells(2, i)
    
    Next i
    
    For i = 0 To 12
        
        Country = CountryArray(i)
        
        Sheets("汇总表格").Cells(i + 2, 1) = Country
        
        For j = 2 To 100
            
            Sheets("汇总表格").Cells(i + 2, j) = Sheets(Country).Cells(ResArr(i), j)
    
        Next j
    
    Next i
    
    Sheets("汇总表格").Cells(15, 1) = "综合汇总"
    
    For i = 6 To 100
    
        If Sheets("汇总表格").Cells(2, i) <> "" Then
        
            For j = 2 To 14
        
                Sheets("汇总表格").Cells(15, i) = Sheets("汇总表格").Cells(15, i) + Sheets("汇总表格").Cells(j, i)
            
            Next j
    
        End If
    
    Next i

End Function

Public Function ClearWorksheetData(sName As String) '清理工作表函数
    
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Worksheets(sName)
    
    ws.UsedRange.ClearContents
    
    Set ws = Nothing
    
End Function

Public Function NewSheet(sName As String) '新建工作表函数
    
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    
    ws.Name = sName
    
End Function

Public Function SumResult(iNum As Integer, sName As String)  '统计函数
    
    Dim StartPoint As Integer
        
    Sheets(sName).Cells(iNum, 3) = "汇总数据"
    
    If sName = "美国站" Then
    
        StartPoint = 9
    
    Else
    
        StartPoint = 5
        
    End If
    
    For i = 6 To 100
                
        If Sheets(sName).Cells(StartPoint, i) <> "" Then Sheets(sName).Cells(iNum, i) = Sheets(sName).Cells(StartPoint, i) - Sheets(sName).Cells(StartPoint + 4, i) - Sheets(sName).Cells(StartPoint + 8, i) - Sheets(sName).Cells(StartPoint + 12, i) - Sheets(sName).Cells(StartPoint + 16, i)
        
    Next i

End Function

Public Function SheetExists(sName As String) As Boolean '判断表单函数
    
    On Error GoTo ErrHandler
    
    Dim sht As Worksheet
    
    Set sht = ThisWorkbook.Sheets(sName)
    
    SheetExists = True
    
    Exit Function

ErrHandler:
    
    SheetExists = False

End Function

标签: office

移动端可扫我直达哦~

推荐阅读

office 2025-02-12

Sublime 编辑器的正则替换

Sublime Text编辑器支持使用正则表达式进行文本搜索和替换,这是一个非常强大的功能,可以大大提高文本处理的效率。在Sublime Text中,你可以通过按下Ctrl+H来打开替换对话框,并点击对话框中的[.*]按钮来启用正则表...

工作相关 office

office 2025-02-10

qq的远程控制不好用?试试TeamViewer

qq也有远程控制功能,偶尔也能解个燃眉之急,不过遇到需要较长时间稳定硬控,qq的这个小功能就有点儿心有余而力不足了。这个时候还得让专业的来,博主常用的就是这个叫TeamViewer的软件。官网地址https://www.teamvie...

工作相关 office

office 2025-02-10

关于CAXA中的拟合样条功能

朋友发过来一张加工图,CAD格式的蚊香状的工件,导入到CAXA中是一条闭环的样条曲线,无法直接打散。尝试了一下CAXA中的拟合样条功能,自动重新生成了一个可编辑标注的图形,严丝合缝。查了一下样条拟合的概念,大致是将复杂曲线分为多段,段...

工作相关 office

office 2024-12-31

女职工延迟法定退休年龄对照表

前几天做了一张男职工延迟退休的文字格式的表格,感觉比图片格式看着清楚点,反正格式已经有了,顺手做张女职工的。女职工的退休年龄分为两档,所以就有两张表格,分别是五十岁退休档和五十五岁退休档。女职工的法定退休年龄从原五十周岁、五十五周岁分...

工作相关 office

office 2024-12-29

男职工延迟法定退休年龄对照表

上班忙完,突然想起延迟退休的事情,就顺手查了一下延迟退休的资料,发现在第十四届全国人民代表大会常务委员会第十一次会议上已经决定:同步启动延迟男、女职工的法定退休年龄,用十五年时间,逐步将男职工的法定退休年龄从原六十周岁延迟至六十三周岁...

工作相关 office

office 2024-10-08

WIN7系统如何共享WIN10的打印机

迫于农行网银升级的压力,给单位的财务电脑升级到了win10,重装后考虑到可能需要打印机共享,所以提前设置了相同的工作组,以便同工作组内的设备相互识别,当然装完系统后也设置好了打印机共享。但是同办公室的win7倒也是识别到了同组中的wi...

工作相关 office

office 2024-07-26

如何将证件照的蓝底修改为白底

想给孩子报名参加csp-j入门组的比赛,体验一下比赛的流程与难度,报名需要提交一张白底的照片,但手头上的照片是蓝色背景的。用ps的魔棒工具直接选取之后,衣服部分的效果尚可,但发丝部位还是有蓝色残留,效果比较粗糙。有过ps的使用经验(但...

工作相关 office

office 2024-04-17

iphone用相机提取照片中的文字

随着手机像素越来越高,平时拍个产品照片,发货唛头什么的绰绰有余,所以自从单位的拍照用的数码相机损坏之后,也没有考虑再次购入,直接用手机操作一下就好。手机集成的功能越来越多,无形中挤掉了很多旧有单一功能电子产品的市场。博主之前一直用的i...

工作相关 office

office 2024-04-02

Coreldraw报错“向程序发送命令时出现问题”

想尝试创建一个使用于全局的宏命令,以实现一个跨文件的小功能,但发现在全局模块内插入时无法保存gms文件,在当前文件内的模块则可以正常保存。既然有保存按钮,按理不应该出现这种情况,考虑到Coreldraw程序被博主安装到了c盘,而c盘文...

工作相关 office

office 2024-03-29

Coreldraw中无法直接粘贴QQ截图

工作多更多的使用台式机,办公需要联络的合作伙伴也都加了QQ,所以一般也都以QQ相互联系。一方面QQ该有的功能都有满足需求,另一方面也能更好的区分公私环境。记得早先Coreldraw是可以直接粘贴QQ截图的,但架不住QQ隔三岔五的更新,...

工作相关 office

office 2023-12-26

硬盘空间不足导致pdf文件打印空白一例

同事的电脑安装的win7,c盘分的比较小---60个g,公司的电脑,办公用的,安装了许多办公软件开票软件之类,重装涉及一堆操作,所以也一直没有去改它,日积月累的,很快60个g就快满了。某天同事找博主,说pdf格式的文件无法打印,于是过...

工作相关 office