百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

VBA,拆分Excel工作表 如何用vba拆分excel表到新的工作簿

wptr33 2024-12-16 16:30 25 浏览

又找到一个小工具:

根据设置的参数,自动拆分工作表为多个工作簿文档。


主要代码,如:

Sub StartToSplit(strSavedPath As String, ByVal arrNewBookSheets As Variant)

    Dim i As Integer
    
    Dim wbNew As Workbook
    Dim strwbNewName As String
    Dim strwbNewFullName As String
        
    Dim strActiveBookBaseName As String
    strActiveBookBaseName = GetWorkbookBaseName()
    
    Dim strNewSheets As String
    strNewSheets = GetAllCheckedItemsName(Me.ListView1)
    
    intMaxLen = Len(CStr(UBound(arrNewBookSheets)))
    
    Application.ScreenUpdating = False
    
    Dim strSplitFieldValue As String
    
    For i = LBound(arrNewBookSheets) To UBound(arrNewBookSheets)
    
        strSplitFieldValue = arrNewBookSheets(i)
        
        '遇到空白单元格,直接跳出!
        If Len(Trim(strSplitFieldValue)) = 0 Then
            Exit Sub
        End If
 
        
        If Me.规则0.Value = True Then
            strwbNewName = FormatNumberWithLeadingZeros(i + 1, intMaxLen) & ":" & strSplitFieldValue & ".xlsx"
        End If
        
        If Me.规则1.Value = True Then
            strwbNewName = strActiveBookBaseName & "(" & strSplitFieldValue & ")" & ".xlsx"
        End If
        
        If Me.规则2.Value = True Then
            If Trim(Me.TextBox自定义名称.Text) = "" Then
                strwbNewName = strSplitFieldValue & ".xlsx"
            Else
                strwbNewName = CleanFileName(Trim(Me.TextBox自定义名称.Text)) & "(" & strSplitFieldValue & ")" & ".xlsx"
            End If
        End If
        
        '创建的工作簿,有副本?
        
        Set wbNew = CreateWorkbookWithSheets(strNewSheets)
        
        Dim strLines  As String
        strLines = GetAllCheckedItemsAsString(Me.ListView1)
        

        Call CopyLine(activeSourceWorkbook, strLines, strSplitFieldValue, wbNew)
        
        Dim objSheetAdded As Worksheet
        
        
        For Each objSheetAdded In wbNew.Worksheets
            
            objSheetAdded.Columns.AutoFit
        
        Next
        
        
        wbNew.SaveAs (strSavedPath + strwbNewName)
        Call wbNew.Close(True, strSavedPath + strwbNewName)
        Set wbNew = Nothing
  
    Next i
    
    Application.ScreenUpdating = True

End Sub

Sub CopyLine(ByVal wbSource As Workbook, ByVal strLines As String, ByVal strSplitFieldValue As String, ByVal wbDestination As Workbook)

    Dim lineArray() As String
    Dim detailArray() As String
    Dim strline As String
    Dim strName As String
    Dim intRow As Integer
    Dim intColumn As Integer
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim lastRow As Long
    Dim copyRange As Range
    Dim cell As Range
    
    lineArray = Split(strLines, "|")
    
    For i = LBound(lineArray) To UBound(lineArray)
        strline = lineArray(i)
        detailArray = Split(strline, ";")
        
        If UBound(detailArray) >= 2 Then
        
            strName = detailArray(0)
            intRow = CInt(detailArray(1))
            intColumn = CInt(detailArray(2))
            
            Set wsSource = wbSource.Sheets(strName)
            Set wsDest = wbDestination.Sheets(strName)
            
            
            Set copyRange = wsSource.Range("A1").Resize(intRow - 1, wsSource.Columns.Count)
            copyRange.Copy
            wsDest.Range("A1").PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            Application.CutCopyMode = False
            

            lastRow = wsDest.Cells(wsDest.Rows.Count, intColumn).End(xlUp).Row + 1
            Dim hasFormula As Boolean
 
    
    
            For Each cell In wsSource.Range(wsSource.Cells(intRow, intColumn), wsSource.Cells(wsSource.Rows.Count, intColumn))
                If cell.Value = strSplitFieldValue Then
                    hasFormula = RowHasFormula(GetUsedCellsInRow2(cell.EntireRow))
                    
                    cell.EntireRow.Copy
                    wsDest.Cells(lastRow, 1).PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            
                    If hasFormula Then
                        wsDest.Cells(lastRow, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                    End If
            
                    wsSource.Rows(cell.Row).Copy
                    wsDest.Rows(lastRow).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            
                    lastRow = lastRow + 1
                End If
            Next cell
            Application.GoTo Reference:=wsDest.Cells(1, 1)
            Application.CutCopyMode = False


            
        End If
    Next i
End Sub



Function GetColumnValues(strSheetName As String, intStartRow As Integer, intSplitColumn As Integer) As Variant

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim values() As Variant
    Dim i As Long
 
    On Error Resume Next
    Set ws = activeSourceWorkbook.Worksheets(strSheetName)
    
    If ws Is Nothing Then
        GetColumnValues = Null
        Exit Function
    End If
    
    lastRow = ws.Cells(ws.Rows.Count, intSplitColumn).End(xlUp).Row
    
    If intStartRow > lastRow Then
        GetColumnValues = Null
        Exit Function
    End If
 
    ReDim values(1 To lastRow - intStartRow + 1)
    For i = intStartRow To lastRow
        values(i - intStartRow + 1) = ws.Cells(i, intSplitColumn).Value
    Next i
    GetColumnValues = values
    
End Function



Function GetFirstCheckedListViewItemValue(ByVal ListViewCtrl As ListView) As String
    Dim i As Integer
    For i = 1 To ListViewCtrl.ListItems.Count
        If ListViewCtrl.ListItems(i).Checked Then
            Dim checkedItem As ListItem
            Set checkedItem = ListViewCtrl.ListItems(i)
            GetFirstCheckedListViewItemValue = checkedItem.Text & ";" & checkedItem.ListSubItems(1).Text & ";" & checkedItem.ListSubItems(2).Text
            Exit Function
        End If
    Next i
    GetFirstCheckedListViewItemValue = ""
End Function


Function GetAllCheckedItemsName(ListViewCtrl As ListView) As String

    Dim i As Integer
    Dim result As String
    result = ""

    For i = 1 To ListViewCtrl.ListItems.Count
        If ListViewCtrl.ListItems(i).Checked Then
            result = result & ListViewCtrl.ListItems(i).Text & ";"
        End If
    Next i

    If Len(result) > 0 Then
        result = Left(result, Len(result) - 1)
    End If

    GetAllCheckedItemsName = result
    
End Function

相关推荐

【推荐】一款开源免费、美观实用的后台管理系统模版

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍...

Android架构组件-App架构指南,你还不收藏嘛

本指南适用于那些已经拥有开发Android应用基础知识的开发人员,现在想了解能够开发出更加健壮、优质的应用程序架构。首先需要说明的是:AndroidArchitectureComponents翻...

高德地图经纬度坐标批量拾取(高德地图批量查询经纬度)

使用方法在桌面上新建一个index.txt文件,把下面的代码复制进去保存,再把文件名改成index.html保存,双击运行打开即可...

flutter系列之:UI layout简介(flutter ui设计)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。...

Android开发基础入门(一):UI与基础控件

Android基础入门前言:...

iOS的布局体系-流式布局MyFlowLayout

iOS布局体系的概览在我的CSDN博客中的几篇文章分别介绍MyLayout布局体系中的视图从一个方向依次排列的线性布局(MyLinearLayout)、视图层叠且停靠于父布局视图某个位置的框架布局(M...

TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

TDesing发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。...

WinForm实现窗体自适应缩放(winform窗口缩放)

众所周知,...

winform项目——仿QQ即时通讯程序03:搭建登录界面

上两篇文章已经对CIM仿QQ即时通讯项目进行了需求分析和数据库设计。winform项目——仿QQ即时通讯程序01:原理及项目分析...

App自动化测试|原生app元素定位方法

元素定位方法介绍及应用Appium方法定位原生app元素...

61.C# TableLayoutPanel控件(c# tabcontrol)

摘要TableLayoutPanel在网格中排列内容,提供类似于HTML元素的功能。TableLayoutPanel控件允许你将控件放在网格布局中,而无需精确指定每个控件的位置。其单元格...

想要深入学习Android性能优化?看完这篇直接让你一步到位

...

12个python数据处理常用内置函数(python 的内置函数)

在python数据分析中,经常需要对字符串进行各种处理,例如拼接字符串、检索字符串等。下面我将对python中常用的内置字符串操作函数进行介绍。1.计算字符串的长度-len()函数str1='我爱py...

如何用Python程序将几十个PDF文件合并成一个PDF?其实只要这四步

假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将...

Python入门知识点总结,Python三大数据类型、数据结构、控制流

Python基础的重要性不言而喻,是每一个入门Python学习者所必备的知识点,作为Python入门,这部分知识点显得很庞杂,内容分支很多,大部分同学在刚刚学习时一头雾水。...