ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6143|回复: 16

[求助] 一个工作表按照姓名拆分为多个工作表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-8-17 12:09 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
将表内的数据表按照姓名拆分为多个工作表,大侠帮我一下,谢谢

附件.zip

17.21 KB, 下载次数: 80

TA的精华主题

TA的得分主题

发表于 2019-8-17 12:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-8-17 12:40 | 显示全部楼层
Sub CFGZB()

    Dim myRange As Variant

    Dim myArray

    Dim titleRange As Range, r As Range

    Dim title As String, n&

    Dim columnNum As Integer
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Sheets("数据源")
    myRange = Application.InputBox(prompt:="请选择标题行:", Type:=8)
    n = sh.Cells(Rows.Count, "a").End(xlUp).Row
    Set r = sh.Range("a2:n" & n)
    myArray = WorksheetFunction.Transpose(myRange)

    Set titleRange = Application.InputBox(prompt:="请选择拆分的表头,必须是第一行,且为一个单元格,如:“姓名”", Type:=8)

    title = titleRange.Value

    columnNum = titleRange.Column

    Application.ScreenUpdating = False

    Application.DisplayAlerts = False


    Dim i&, Myr&, Arr, num&

    Dim d, k

    For i = Sheets.Count To 1 Step -1

        If Sheets(i).Name <> "数据源" Then

            Sheets(i).Delete

        End If

    Next i

    Set d = CreateObject("Scripting.Dictionary")

    Myr = Worksheets("数据源").UsedRange.Rows.Count

    Arr = Worksheets("数据源").Range(Cells(2, columnNum), Cells(Myr, columnNum))

    For i = 2 To UBound(Arr)

        d(Arr(i, 1)) = ""

    Next


    k = d.keys

    For i = 0 To UBound(k)


        Set conn = CreateObject("adodb.connection")

        conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName


        Sql = "select * from [数据源$a2:n] where " & title & " ='" & k(i) & "'"


        Worksheets.Add after:=Sheets(Sheets.Count)


        With ActiveSheet

            .Name = k(i)

            For num = 1 To UBound(myArray)

                .Cells(1, num) = myArray(num, 1)

            Next num

            .Range("A2").CopyFromRecordset conn.Execute(Sql)

        End With


        r.Copy


        Worksheets(Sheets.Count).Activate

        ActiveSheet.UsedRange.Select


        Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

        Application.CutCopyMode = False

    Next i


    conn.Close

    Set conn = Nothing

    Application.DisplayAlerts = True

    Application.ScreenUpdating = True

End Sub

TA的精华主题

TA的得分主题

发表于 2019-8-17 12:41 | 显示全部楼层
Option Explicit
Sub test()
Dim d As Object, ar, s$, i%, c%, sh As Worksheet
Application.ScreenUpdating = False
Set d = CreateObject("scripting.dictionary")
Application.DisplayAlerts = False
For Each sh In Sheets
    If sh.Name <> "数据源" Then sh.Delete
Next
Application.DisplayAlerts = True
ReDim br(1 To 14)
With Sheets("数据源")
    For i = 1 To 14
        br(i) = .Columns(i).ColumnWidth
    Next
    ar = .Range("g1:g" & .Cells(.Rows.Count, 7).End(xlUp).Row)
    For i = 3 To UBound(ar)
        s = ar(i, 1)
        If Len(s) Then
            If Not d.exists(s) Then Set d(s) = .[a1].Resize(2, 14)
            Set d(s) = Union(d(s), .Cells(i, 1).Resize(1, 14))
        End If
    Next
End With
For i = 0 To d.Count - 1
    Sheets.Add after:=Sheets(Sheets.Count)
    With ActiveSheet
        For c = 1 To 14
            .Columns(c).ColumnWidth = br(c)
        Next
        .Name = d.keys()(i)
        d.items()(i).Copy .[a1]
    End With
Next
Sheets("数据源").Activate
Set d = Nothing
Application.ScreenUpdating = False
End Sub

TA的精华主题

TA的得分主题

发表于 2019-8-17 12:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
……测试……

20190817.rar

22.18 KB, 下载次数: 210

头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2019-8-17 12:58 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-8-17 13:01 | 显示全部楼层
  1. Sub test()
  2.     Dim c As Object, r As Object, rs As Object, sql$, i%, T!
  3.     Application.ScreenUpdating = False
  4.     Set c = CreateObject("adodb.connection")
  5.     Set rs = CreateObject("ADODB.Recordset")
  6.    
  7.     If Application.Version >= 12 Then
  8.         c.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
  9.     Else
  10.         c.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
  11.     End If
  12.     rs.Open "Select distinct 账户名 from [数据源$G2:G] where 账户名 is not null", c
  13.     Do While Not rs.EOF
  14.         Set r = CreateObject("ADODB.Recordset")
  15.         jb rs(0)
  16.         sql = "select * from [数据源$A2:N] where 账户名='" & rs(0) & "'"
  17.         r.Open sql, c
  18.         For i = 0 To r.Fields.Count - 1
  19.             Cells(1, i + 1) = r(i).Name
  20.         Next
  21.         Range("A2").CopyFromRecordset r
  22.         Cells.EntireColumn.AutoFit
  23.         Set r = Nothing
  24.         rs.MoveNext
  25.     Loop
  26.     Set rs = Nothing
  27.     Set c = Nothing
  28.     Sheets("数据源").Select
  29.     Application.ScreenUpdating = True
  30. End Sub
  31. Sub jb(sn$)
  32.     On Error Resume Next
  33.     Application.DisplayAlerts = False
  34.     Sheets(sn).Delete
  35.     Sheets.Add , Sheets(Sheets.Count)
  36.     ActiveSheet.Name = sn
  37. End Sub
复制代码


ADO方式

TA的精华主题

TA的得分主题

发表于 2019-8-17 13:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-8-17 13:28 | 显示全部楼层
Sub 拆分工作表()
    Dim sh As Worksheet, ar, br(), d As Object, i&, r&, j As Byte, s$, k, rg As Range
    With ThisWorkbook
        Application.DisplayAlerts = False
            If .Sheets.Count > 1 Then
                For Each sh In .Worksheets
                    If sh.Name <> "数据源" Then sh.Delete
                Next
            End If
        Application.DisplayAlerts = True
    End With
    Set sh = ThisWorkbook.Sheets("数据源")
    r = sh.Cells(Rows.Count, "g").End(3).Row
    If r > 2 Then
        ar = sh.Range("a2:n" & r)
        Set rg = ThisWorkbook.Sheets(1).Range("a2:n2")
        ReDim br(1 To UBound(ar, 2))
        For j = 1 To UBound(ar, 2)
            br(j) = sh.Columns(j).ColumnWidth
        Next
        Set d = CreateObject("scripting.dictionary")
    Else
        End
    End If
    For i = 2 To UBound(ar)
        s = ar(i, 7)
       If s <> "" Then
            If Not d.exists(s) Then
                Set d(s) = sh.Range("a" & i + 1).Resize(, 14)
            Else
                Set d(s) = Union(d(s), sh.Range("a" & i + 1).Resize(, 14))
            End If
       End If
    Next
    If d.Count > 0 Then
        Application.ScreenUpdating = False
            For Each k In d.keys
                Set sh = Sheets.Add(after:=Sheets(Sheets.Count))
                sh.Name = k
                rg.Copy sh.Range("a1")
                d(k).Copy sh.Range("a2")
                For j = 1 To 14
                    sh.Columns(j).ColumnWidth = br(j)
                Next
            Next
        Application.ScreenUpdating = True
    End If
End Sub

TA的精华主题

TA的得分主题

发表于 2019-8-17 13:42 | 显示全部楼层
最后一个next 上面加一句 sh.UsedRange.EntireRow.AutoFit  貌似效果会好看点,具体请见代码

Sub 拆分工作表()
    Dim sh As Worksheet, ar, br(), d As Object, i&, r&, j As Byte, s$, k, rg As Range
    With ThisWorkbook
        Application.DisplayAlerts = False
            If .Sheets.Count > 1 Then
                For Each sh In .Worksheets
                    If sh.Name <> "数据源" Then sh.Delete
                Next
            End If
        Application.DisplayAlerts = True
    End With
    Set sh = ThisWorkbook.Sheets("数据源")
    r = sh.Cells(Rows.Count, "g").End(3).Row
    If r > 2 Then
        ar = sh.Range("a2:n" & r)
        Set rg = ThisWorkbook.Sheets(1).Range("a2:n2")
        ReDim br(1 To UBound(ar, 2))
        For j = 1 To UBound(ar, 2)
            br(j) = sh.Columns(j).ColumnWidth
        Next
        Set d = CreateObject("scripting.dictionary")
    Else
        End
    End If
    For i = 2 To UBound(ar)
        s = ar(i, 7)
       If s <> "" Then
            If Not d.exists(s) Then
                Set d(s) = sh.Range("a" & i + 1).Resize(, 14)
            Else
                Set d(s) = Union(d(s), sh.Range("a" & i + 1).Resize(, 14))
            End If
       End If
    Next
    If d.Count > 0 Then
        Application.ScreenUpdating = False
            For Each k In d.keys
                Set sh = Sheets.Add(after:=Sheets(Sheets.Count))
                sh.Name = k
                rg.Copy sh.Range("a1")
                d(k).Copy sh.Range("a2")
                For j = 1 To 14
                    sh.Columns(j).ColumnWidth = br(j)
                Next
                sh.UsedRange.EntireRow.AutoFit
            Next
        Application.ScreenUpdating = True
    End If
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 10:39 , Processed in 0.046787 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表