VBA,拆分Excel工作表 如何用vba拆分excel表到新的工作簿
wptr33 2024-12-16 16:30 27 浏览
又找到一个小工具:
根据设置的参数,自动拆分工作表为多个工作簿文档。
主要代码,如:
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
相关推荐
- Linux高性能服务器设计
-
C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...
- 独立游戏开发者常犯的十大错误
-
...
- 学C了一头雾水该咋办?
-
学C了一头雾水该怎么办?最简单的方法就是你再学一遍呗。俗话说熟能生巧,铁杵也能磨成针。但是一味的为学而学,这个好像没什么卵用。为什么学了还是一头雾水,重点就在这,找出为什么会这个样子?1、概念理解不深...
- C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?
-
上节我们分析了C++基础语法的const,static以及this指针,那么这节内容我们来看一下inline内联函数吧!inline内联函数...
- C语言实战小游戏:井字棋(三子棋)大战!文内含有源码
-
井字棋是黑白棋的一种。井字棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、三子旗等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时...
- C++语言到底是不是C语言的超集之一
-
C与C++两个关系亲密的编程语言,它们本质上是两中语言,只是C++语言设计时要求尽可能的兼容C语言特性,因此C语言中99%以上的功能都可以使用C++完成。本文探讨那些存在于C语言中的特性,但是在C++...
- 在C++中,如何避免出现Bug?
-
C++中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C++中的一...
- ESL-通过事件控制FreeSWITCH
-
通过事件提供的最底层控制机制,允许我们有效地利用工具箱,适时选择使用其中的单个工具。FreeSWITCH是一个核心交换与混合矩阵,它周围有几十个模块提供各种功能特性。我们完全控制了所有的即时信息,这些...
- 物理老师教你学C++语言(中篇)
-
一、条件语句与实验判断...
- C语言入门指南
-
当然!以下是关于C语言入门编程的基础介绍和入门建议,希望能帮你顺利起步:C语言入门指南...
- C++选择结构,让程序自动进行决策
-
什么是选择结构?正常的程序都是从上至下顺序执行,这就是顺序结构...
- C++特性使用建议
-
1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...
- C++程序员学习Zig指南(中篇)
-
1.复合数据类型结构体与方法的对比C++类:...
- 研一自学C++啃得动吗?
-
研一自学C++啃得动吗?在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!个人...
- C++关键字介绍
-
下表列出了C++中的常用关键字,这些关键字不能作为变量名或其他标识符名称。1、autoC++11的auto用于表示变量的自动类型推断。即在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mysql max (33)
- vba instr (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)