ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 根据总表拆分成工作表并分为两栏

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-2-8 02:14 | 显示全部楼层 |阅读模式
本帖最后由 foreversun 于 2017-2-8 20:10 编辑

折分成工作表并分为两栏.rar (20.27 KB, 下载次数: 66)
将总表拆分成工作表网上有现成的。但拆分后还要分为两栏,并在每张表前面插入两行。请教如何实现。

新问题
班级        班主任        电话
1班        ww1        1
2班        ww2        2
3班        ww3        3
4班        ww4        4
5班        ww5        5
6班        ww6        6
7班        ww7        7
8班        ww8        8
9班        ww9        9
10班        ww10        10
15班        ww11        15
16班        ww12        16
将班级 班主任 电话信息 放在N1:p13
能否将此信息写入对应工作表.
比如: 1班  
a2="1班班主任"  b2="w1" c2=1
这个要用到字典吧.
对字典不很明白.
应该如何处理呢

TA的精华主题

TA的得分主题

发表于 2017-2-8 10:04 | 显示全部楼层
Sub a()
Dim sh As Worksheet
Application.DisplayAlerts = False
Application.ScreenUpdating = False
For Each sh In Sheets
    If sh.Name <> "总表" Then
        sh.Delete
    End If
Next
Dim cnn, cnn1, rs, rs1, Sqa$, bt, j%, m%, sqb$, arr
bt = [{"姓名","班级","总分","总分排名","总分班级排名"}]
Set cnn = CreateObject("adodb.connection")
Set cnn1 = CreateObject("adodb.connection")
Set rs = CreateObject("adodb.Recordset")
Set rs1 = CreateObject("adodb.Recordset")
cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
cnn1.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
Sqa = "select distinct 班级,COUNT(*) from [总表$b1:b] where 班级 is not null GROUP BY 班级"
rs.Open Sqa, cnn, 1, 1
Do While Not rs.EOF
    Sheets.Add after:=Sheets(Sheets.Count)
    ActiveSheet.Name = rs.Fields(0)
    [a1:j1].Merge
    [a1] = rs.Fields(0) & "成绩表"
    [a1].HorizontalAlignment = xlCenter
    [a2] = rs.Fields(0) & "班主任"
    sqb = "select * from [总表$a1:e] where 班级='" & rs.Fields(0) & "'"
    rs1.Open sqb, cnn1, 1, 1
        For j = 0 To Round(rs.Fields(1) / 30 + 0.49, 0) - 1
            [a3].Offset(0, j * 5).Resize(1, 5) = bt
            arr = Application.Transpose(rs1.getRows(30, 0))
            [a4].Offset(0, j * 5).Resize(UBound(arr), 5) = arr
            [a3].Offset(0, j * 5).Resize(UBound(arr) + 1, 5).Borders.LineStyle = 1
        Next
        rs1.Close
    rs.MoveNext
Loop
Set rs = Nothing
Set cnn = Nothing
Set rs1 = Nothing
Set cnn1 = Nothing
Application.ScreenUpdating = True
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-8 11:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 foreversun 于 2017-2-8 11:19 编辑
魂断蓝桥 发表于 2017-2-8 10:04
Sub a()
Dim sh As Worksheet
Application.DisplayAlerts = False

谢谢你,将sql 发挥得淋漓尽致  但有一点不合意:分的两栏不是平均分的.是左三十.能不能平均分开呢.
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2017-2-8 11:24 | 显示全部楼层
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2017-2-8 11:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-8 11:50 | 显示全部楼层
本帖最后由 foreversun 于 2017-2-8 11:59 编辑

朱老师真是太好了,达到了效果
如果能随意增加减少列字段就好了.找到了.将这里改为
sh.[f3].Resize(1, UBound(arr, 2)) = arr

sh.cells(3,?).Resize(1, UBound(arr, 2)) = arr
?为例数即可.
再次谢谢

TA的精华主题

TA的得分主题

发表于 2017-2-8 11:58 | 显示全部楼层
foreversun 发表于 2017-2-8 11:09
谢谢你,将sql 发挥得淋漓尽致  但有一点不合意:分的两栏不是平均分的.是左三十.能不能平均分开呢.

Sub a()
Dim sh As Worksheet
Application.DisplayAlerts = False
Application.ScreenUpdating = False
For Each sh In Sheets
    If sh.Name <> "总表" Then
        sh.Delete
    End If
Next
Dim cnn, cnn1, rs, rs1, Sqa$, bt, j%, m%, sqb$, arr
bt = [{"姓名","班级","总分","总分排名","总分班级排名"}]
Set cnn = CreateObject("adodb.connection")
Set cnn1 = CreateObject("adodb.connection")
Set rs = CreateObject("adodb.Recordset")
Set rs1 = CreateObject("adodb.Recordset")
cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
cnn1.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
Sqa = "select distinct 班级,COUNT(*) from [总表$b1:b] where 班级 is not null GROUP BY 班级"
rs.Open Sqa, cnn, 1, 1
Do While Not rs.EOF
    Sheets.Add after:=Sheets(Sheets.Count)
    ActiveSheet.Name = rs.Fields(0)
    [a1:j1].Merge
    [a1] = rs.Fields(0) & "成绩表"
    [a1].HorizontalAlignment = xlCenter
    [a2] = rs.Fields(0) & "班主任"
    sqb = "select * from [总表$a1:e] where 班级='" & rs.Fields(0) & "'"
    rs1.Open sqb, cnn1, 1, 1
    m = Round(rs1.RecordCount / 2 + 0.49, 0)
        For j = 0 To 1
            [a3].Offset(0, j * 5).Resize(1, 5) = bt
            arr = Application.Transpose(rs1.getRows(m, 0))
            [a4].Offset(0, j * 5).Resize(UBound(arr), 5) = arr
            [a3].Offset(0, j * 5).Resize(UBound(arr) + 1, 5).Borders.LineStyle = 1
        Next
        rs1.Close
    rs.MoveNext
Loop
Set rs = Nothing
Set cnn = Nothing
Set rs1 = Nothing
Set cnn1 = Nothing
Application.ScreenUpdating = True
End Sub

评分

1

查看全部评分

头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2017-2-8 12:06 | 显示全部楼层
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2017-2-8 12:09 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-8 15:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢 朱荣兴  魂断蓝桥  都实现了我想要的功能.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 14:45 , Processed in 0.050122 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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