ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 工作表多项目计算汇总,请大神帮忙

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-1-6 15:32 | 显示全部楼层
ptjtlt260 发表于 2017-1-5 13:24
上传附件,请帮忙大神再看下,谢谢

Sub a()
Dim sh As Worksheet, sqt1$, sqt2$, bt, i%, T$, sql$, sqa$, sqb$
bt = [{"品名","数量1","数量2","项目1","项目2","项目3","项目4","项目5","项目6","项目7","项目8","项目9","项目10","项目11","项目12","项目13","项目14","项目15","项目16"}]
For Each sh In Sheets
    If sh.Name <> "汇总" Then
        sqt1 = ""
        For i = 4 To UBound(bt)
            sqt1 = sqt1 & "数量1*" & bt(i) & " AS 项目" & i - 3 & ","
        Next
            sqt1 = Left(sqt1, Len(sqt1) - 1)
            sqa = sqa & "SELECT 品名," & sqt1 & " FROM [" & sh.Name & "$A2:T] WHERE 品名 is not null UNION ALL "
    End If
Next
sqa = Left(sqa, Len(sqa) - 11)
For i = 4 To UBound(bt)
    sqt2 = sqt2 & "SUM(" & "项目" & i - 3 & ") as 项目" & i - 3 & ","
Next
sqt2 = Left(sqt2, Len(sqt2) - 1)
sqt1 = "select 品名," & sqt2 & " from (" & sqa & ") group by 品名"
sqt2 = ""
For Each sh In Sheets
    If sh.Name <> "汇总" Then
        sqt2 = sqt2 & "select 品名,数量1,数量2" & " FROM [" & sh.Name & "$A2:T] WHERE 品名 is not null UNION ALL "
    End If
Next
sqt2 = Left(sqt2, Len(sqt2) - 11)
sqt2 = "SELECT 品名,SUM(数量1) as 数量1,SUM(数量2) as 数量2 FROM (" & sqt2 & ") GROUP BY 品名"
For i = 1 To 16
    sqb = sqb & "a.项目" & i & "/b.数量1,"
Next
sqb = Left(sqb, Len(sqb) - 1)
sql = "select a.品名,null,b.数量1,b.数量2," & sqb & " from (" & sqt1 & ") a inner join (" & sqt2 & ") b on a.品名=b.品名"
Dim cnn As Object
Set cnn = CreateObject("ADODB.CONNECTION")
cnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES'; Data Source=" & ThisWorkbook.FullName
Range("a3:z9999").ClearContents
[a3].CopyFromRecordset cnn.Execute(sql)
cnn.Close: Set cnn = Nothing
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-1-6 16:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
魂断蓝桥 发表于 2017-1-6 15:32
Sub a()
Dim sh As Worksheet, sqt1$, sqt2$, bt, i%, T$, sql$, sqa$, sqb$
bt = [{"品名","数量1"," ...

谢谢大神,计算正确。

TA的精华主题

TA的得分主题

发表于 2017-1-6 16:11 | 显示全部楼层
ptjtlt260 发表于 2017-1-6 16:06
谢谢大神,计算正确。

大神,绝对谈不上。

其实这个不难,就是比较繁琐。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-1-6 16:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
魂断蓝桥 发表于 2017-1-6 16:11
大神,绝对谈不上。

其实这个不难,就是比较繁琐。

老师:我刚才插入一个工作表会提示运行错误,是不是不能再插入工作表?

TA的精华主题

TA的得分主题

发表于 2017-1-6 22:27 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-15 09:46 | 显示全部楼层
魂断蓝桥 发表于 2017-1-6 15:32
Sub a()
Dim sh As Worksheet, sqt1$, sqt2$, bt, i%, T$, sql$, sqa$, sqb$
bt = [{"品名","数量1"," ...

大侠:你好!你写的这处很好用,但现在项目增加我在bt=...这包后面增加了项目17、项目18,下面也改了For i=1 TO18,但是提示错误(至少一个参数没有指定)请问这个要什么办?如果要项目要增加到50列要什么改。请指导,谢谢!
Sub a()
Dim sh As Worksheet, sqt1$, sqt2$, bt, i%, T$, sql$, sqa$, sqb$
bt = [{"品名","数量1","数量2","项目1","项目2","项目3","项目4","项目5","项目6","项目7","项目8","项目9","项目10","项目11","项目12","项目13","项目14","项目15","项目16"}]
For Each sh In Sheets
    If sh.Name <> "汇总" Then
        sqt1 = ""
        For i = 4 To UBound(bt)
            sqt1 = sqt1 & "数量1*" & bt(i) & " AS 项目" & i - 3 & ","
        Next
            sqt1 = Left(sqt1, Len(sqt1) - 1)
            sqa = sqa & "SELECT 品名," & sqt1 & " FROM [" & sh.Name & "$A2:T] WHERE 品名 is not null UNION ALL "
    End If
Next
sqa = Left(sqa, Len(sqa) - 11)
For i = 4 To UBound(bt)
    sqt2 = sqt2 & "SUM(" & "项目" & i - 3 & ") as 项目" & i - 3 & ","
Next
sqt2 = Left(sqt2, Len(sqt2) - 1)
sqt1 = "select 品名," & sqt2 & " from (" & sqa & ") group by 品名"
sqt2 = ""
For Each sh In Sheets
    If sh.Name <> "汇总" Then
        sqt2 = sqt2 & "select 品名,数量1,数量2" & " FROM [" & sh.Name & "$A2:T] WHERE 品名 is not null UNION ALL "
    End If
Next
sqt2 = Left(sqt2, Len(sqt2) - 11)
sqt2 = "SELECT 品名,SUM(数量1) as 数量1,SUM(数量2) as 数量2 FROM (" & sqt2 & ") GROUP BY 品名"
For i = 1 To 16
    sqb = sqb & "a.项目" & i & "/b.数量1,"
Next
sqb = Left(sqb, Len(sqb) - 1)
sql = "select a.品名,null,b.数量1,b.数量2," & sqb & " from (" & sqt1 & ") a inner join (" & sqt2 & ") b on a.品名=b.品名"
Dim cnn As Object
Set cnn = CreateObject("ADODB.CONNECTION")
cnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES'; Data Source=" & ThisWorkbook.FullName
Range("a3:z9999").ClearContents
[a3].CopyFromRecordset cnn.Execute(sql)
cnn.Close: Set cnn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2019-3-15 11:12 | 显示全部楼层
ptjtlt260 发表于 2019-3-15 09:46
大侠:你好!你写的这处很好用,但现在项目增加我在bt=...这包后面增加了项目17、项目18,下面也改了For  ...

至少一个参数没有指定

一般是一个字段没有找到,你再看看是不是标题字段有空格什么的原因。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-15 11:51 | 显示全部楼层
魂断蓝桥 发表于 2019-3-15 11:12
至少一个参数没有指定

一般是一个字段没有找到,你再看看是不是标题字段有空格什么的原因。

是的,标题字段有些列是不需要的,我把那些不需的的标题字段删掉了,这样不行吗?我总共有项目17个,For i=1 To 16这个不改的话,项目1没有数据,改成1 To 17则显示至少一个参数没有指定

TA的精华主题

TA的得分主题

发表于 2019-3-15 13:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ptjtlt260 发表于 2019-3-15 11:51
是的,标题字段有些列是不需要的,我把那些不需的的标题字段删掉了,这样不行吗?我总共有项目17个,For  ...

字段名称对应表格中的标题

注意下区域的选择,比如 [数据$A1:D1]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-15 13:47 | 显示全部楼层
魂断蓝桥 发表于 2019-3-15 13:01
字段名称对应表格中的标题

注意下区域的选择,比如 [数据$A1:D1]

可以了,谢谢老师,还有个问题,项目要增加,但下面这句显示“标识筏太长”。最多只能增加到项目26!这个要什么解决?
bt = [{"品名","数量1","数量2","项目1","项目2","项目3","项目4","项目5","项目6","项目7","项目8","项目9","项目10","项目11","项目12","项目13","项目14","项目15","项目16"}]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-19 17:41 , Processed in 0.042506 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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