今天周末,小伙伴周末愉快
小编还是继续写拆分工作表,做我们自己的小插件,
今天我们用数组法练习 来指定字段拆分工作表
示例文件下载
链接:https://pan.baidu.com/s/1B2IMYrOVaPgF1ob2Ds5Spg
提取码:abcd
关注公众号 ↓
在这之前,小编也有写过用字典+数组拆分工作表
VBA 字典 指定列拆分表 在此基础上小编在更改了下
如下图所示

代码如下
Sub Sht_Array() '数组拆分Dim aData, aRes, Dic, Mat, TDim strShtName, strErr$, strMsg$, s$Dim x&, y&, iRow&, k&, intY&Dim Cell As Range, Rng As Range, TitleRng As RangeDim Sht As Worksheet, ActSht As WorksheetOn Error Resume NextSet ActSht = ActiveSheetSet Rng = 模块.SetRng("选择需要拆分的所在列" & Chr(10) & "注意:只能选取一列作为拆分依据")If Rng Is Nothing Then MsgBox "请重新选择", 64, "提示": Exit SubIf Rng.Columns.Count > 1 Then MsgBox "只能选择一列,太多了干不过来~~", 64, "提示": Exit SubiRow = 模块.SetRow("请选择标题的行数,不能为负数")If iRow < 0 Then MsgBox "只能是大于0的正数", 64, "提示!": Exit SubT = TimerWith ActShtSet Cell = .UsedRangeaData = CellSet TitleRng = .Range(.Cells(Cell.Column, 1), .Cells(iRow, UBound(aData, 2)))End WithSet Dic = CreateObject("Scripting.Dictionary") '后期绑定字典y = Rng.Column - Cell.Column + 1 '实际需要拆分的所在列位置For x = iRow + 1 To UBound(aData)Dic(aData(x, y)) = "" '实际拆分列的数据作为关键字存入字典NextCall 模块.AppExFor Each Mat In Dic.keys '遍历字典所有的关键字strShtName = Matk = 0 '初始化计数器ReDim aRes(1 To UBound(aData), 1 To UBound(aData, 2)) '遍历数据源For x = iRow + 1 To UBound(aData)If strShtName = aData(x, y) Then '如果符合条件k = k + 1For intY = 1 To UBound(aData, 2)aRes(k, intY) = aData(x, intY)NextEnd IfNextstrShtName = 模块.GetShtName(Mat) '根据数据决定工作表名称Worksheets(strShtName).Delete '删除工作表Err.ClearWith Sheets.Add(after:=Sheets(Sheets.Count)) '新建工作表.Name = strShtNameEnd WithIf Err Then '如果出错strErr = strErr & Chr(10) & strShtName '记录错误信息ActiveSheet.DeleteElsestrMsg = strMsg & Chr(10) & strShtNameWith Worksheets(strShtName) '在工作表中写入表头以及内容TitleRng.Copy .Range("a1").Cells(.Cells(Rows.Count, 1).End(3).Row + 1, 1).Resize(k, UBound(aRes, 2)) = aRes.UsedRange.Borders.LineStyle = 1 '添加边框.Columns.AutoFit '自适应列宽End WithEnd IfNextActSht.SelectIf strMsg <> "" Then s = "成功创建以下工作表:" & Chr(10) & Mid(strMsg, 2)If strErr <> "" Then s = s & Chr(10) & Chr(10) & "您为工作表或图标输入的名称无效。请确保:" & Chr(10) _& "※名称不多于31个字符。" & Chr(10) _& "※名称不包含下列任一字符:\/?*[或]。" & Chr(10) _& "※名称不为空。" & Chr(10) _& "创建失败名称如下 " & Chr(10) & Mid(strErr, 2)MsgBox s & Chr(10) & "总共花费了:" & Format(Timer - T, "0.0000秒")Call 模块.AppEx(True)Set Dic = NothingEnd Sub
我们的代码依然写在工作表模块中

小编觉得这样方便管理一些,比如说我们对单元格的操作就写在单元格的模块中,写对工作表的操作就全部写在工作表的模块中,而自定义的封装,我们就可以写在模块中,en~!~,可以把之前单元格操作写进去....
代码和前两天用筛选拆分差不多,只是更改了下,用数组装载数据输出
同时,增加了个模块,对拆分内容返回决定工作表名称

代码后都有注释就不在解析
收工!我们明天见
如果小伙伴有好的思路,可以在小编的公众号留言发给小编研究下
文章觉得有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力
文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




