暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA 指定字段拆分工作表(数组)

Excel VBA练习 2021-08-05
1726

今天周末,小伙伴周末愉快

小编还是继续写拆分工作表,做我们自己的小插件,

今天我们用数组法练习 来指定字段拆分工作表


示例文件下载
链接:https://pan.baidu.com/s/1B2IMYrOVaPgF1ob2Ds5Spg
提取码:abcd


关注公众号 ↓



在这之前,小编也有写过用字典+数组拆分工作表

VBA 字典 指定列拆分表  在此基础上小编在更改了下


如下图所示


代码如下

    Sub Sht_Array() '数组拆分
    Dim aData, aRes, Dic, Mat, T
    Dim strShtName, strErr$, strMsg$, s$
    Dim x&, y&, iRow&, k&, intY&
    Dim Cell As Range, Rng As Range, TitleRng As Range
    Dim Sht As Worksheet, ActSht As Worksheet
    On Error Resume Next
    Set ActSht = ActiveSheet
    Set Rng = 模块.SetRng("选择需要拆分的所在列" & Chr(10) & "注意:只能选取一列作为拆分依据")
    If Rng Is Nothing Then MsgBox "请重新选择", 64, "提示": Exit Sub
    If Rng.Columns.Count > 1 Then MsgBox "只能选择一列,太多了干不过来~~", 64, "提示": Exit Sub
    iRow = 模块.SetRow("请选择标题的行数,不能为负数")
    If iRow < 0 Then MsgBox "只能是大于0的正数", 64, "提示!": Exit Sub
    T = Timer
    With ActSht
    Set Cell = .UsedRange
    aData = Cell
    Set TitleRng = .Range(.Cells(Cell.Column, 1), .Cells(iRow, UBound(aData, 2)))
    End With
    Set Dic = CreateObject("Scripting.Dictionary") '后期绑定字典
    y = Rng.Column - Cell.Column + 1 '实际需要拆分的所在列位置
    For x = iRow + 1 To UBound(aData)
    Dic(aData(x, y)) = "" '实际拆分列的数据作为关键字存入字典
    Next
    Call 模块.AppEx
    For Each Mat In Dic.keys '遍历字典所有的关键字
    strShtName = Mat
    k = 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 + 1
    For intY = 1 To UBound(aData, 2)
    aRes(k, intY) = aData(x, intY)
    Next
    End If
    Next
    strShtName = 模块.GetShtName(Mat) '根据数据决定工作表名称
    Worksheets(strShtName).Delete '删除工作表
    Err.Clear
    With Sheets.Add(after:=Sheets(Sheets.Count)) '新建工作表
    .Name = strShtName
    End With
    If Err Then '如果出错
    strErr = strErr & Chr(10) & strShtName '记录错误信息
    ActiveSheet.Delete
    Else
    strMsg = strMsg & Chr(10) & strShtName
    With 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 With
    End If
    Next
    ActSht.Select
    If 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 = Nothing
    End Sub


    我们的代码依然写在工作表模块中


    小编觉得这样方便管理一些,比如说我们对单元格的操作就写在单元格的模块中,写对工作表的操作就全部写在工作表的模块中,而自定义的封装,我们就可以写在模块中,en~!~,可以把之前单元格操作写进去....


    代码和前两天用筛选拆分差不多,只是更改了下,用数组装载数据输出

    同时,增加了个模块,对拆分内容返回决定工作表名称


    代码后都有注释就不在解析


    收工!我们明天见

    如果小伙伴有好的思路,可以在小编的公众号留言发给小编研究下

    文章觉得有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力

    文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论