ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 按班级名称拆分为多个工作表

按班级名称拆分为多个工作表

作者:绿色风 分类: 时间:2022-08-18 浏览:96
楼主
杨开科
示例文件见:
按班级名称拆分为多个工作表.rar
  1. Option Explicit
  2. '按班级名称拆分为多个工作表
  3. '着重知识点:数组、字典、ADO
  4. '知识在于积累
  5. Sub Split_Sheet()
  6. '声明变量
  7.     Dim ed As Long, ar(), d As Object, i As Long
  8.     Dim cn As Object, rs As Object, k()
  9.     Dim ws As Worksheet, sql As String, iCols As Integer

  10.     Application.ScreenUpdating = False                  ' 关闭屏幕更新

  11.     With Sheets("学生名单")
  12.         ed = .Range("A" & Rows.Count).End(xlUp).Row                                   ' 将学生名单表中A列数据区域最大行数赋值给变量ed
  13.         ar = .Range("A2:A" & ed).Value                                        '赋值给数组,从A2开始的原因是A1是表格标题
  14.     End With

  15.     Set d = CreateObject("Scripting.Dictionary")      '字典对象引用赋值,后期绑定
  16.     For i = 1 To ed - 1                                                    '建立一个循环
  17.         d(ar(i, 1)) = 0   '赋值为"0"不具实际意义,只起个将学生名单表中班级名称去重复,加入字典的作用。将它改成=1、=""、="什么"都行
  18.     Next i

  19.     Set cn = CreateObject("ADODB.Connection")    '  创建ADO连接,将 CreateObject 返回的对象赋给对象变量cn
  20.     cn.Open "provider=Microsoft.Jet.OLEDB.4.0;extended properties='Excel 8.0;hdr=Yes;IMEX=1';data source=" & ThisWorkbook.FullName  '  打开连接到本工作簿
  21.     '    cn.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.FullName
  22.     k = d.keys   '把字典中存在的所有的关键字赋给变量k,得到的是一个一维数组

  23.     For i = 0 To d.Count - 1                                        '   字典键值数组循环
  24.         Set ws = Worksheets.Add                                ' 新建工作表
  25.         With ws
  26.             '班级名称是一个文本字符串,要加双引号,'" & k(i) & "',双引号加在单引号中间
  27.             sql = "Select * From [学生名单$] Where 班级名称='" & k(i) & " '"
  28.             Debug.Print sql    '按ctrl+G打开“立即窗口”,可查看每条sql
  29.             Set rs = cn.Execute(sql)    '执行查询操作赋值给对象变量rs

  30.             For iCols = 0 To rs.Fields.Count - 1    '为取字段名为新工作表添加表格标题
  31.                 .Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
  32.             Next

  33.             .[A2].CopyFromRecordset rs    ' 自新工作表A2单元格复制查询结果
  34.             .Cells.EntireColumn.AutoFit    '自动调整列宽
  35.             .Name = k(i)    '将新工作表重命名为班级名称
  36.         End With
  37.     Next i    '执行下一次循环,直到 i = d.Count - 1

  38.     cn.Close    '关闭连接
  39.     '释放对象变量
  40.     Set d = Nothing
  41.     Set cn = Nothing
  42.     Set ws = Nothing

  43.     Application.ScreenUpdating = True    '启用屏幕更新
  44.     MsgBox "数据拆分完成!", 64, "提示"
  45. End Sub
2楼
水星钓鱼
异曲同工
3楼
meteorak
能否在输出学生名单前按一定的顺序再排列一次再输出呢?比如按姓名顺序,总分顺序等
在33.            Debug.Print sql    '按ctrl+G打开“立即窗口”,可查看每条sql

    34.            Set rs = cn.Execute(sql)    '执行查询操作赋值给对象变量rs

之后加什么代码可以排列呢?
4楼
bluexuemei
在SQL语句后面加排序语句,order by 字段
5楼
xinya
有注解,太好了,正苦于无法理解这些代码的意思呢,感谢感谢

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap