ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于SQL在工作簿-工作表之间的查询、排序、转置(盖楼中....)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-11-14 19:30 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 opiona 于 2011-11-16 22:46 编辑

'查找查询表给出字段内容(sheet1的A列)在数据表中查找对应的其他字段内容(Sheet2的B列:工资)
Strsql = "SELECT a.姓名, b.工资 from [Sheet2$] as b, [Sheet1$] as a where a.姓名=b.姓名 order by a.姓名"
'工作簿内的查询我已经实现,工作表之间的不想使用循环
'1:想知道: 如果sheet1 和 Sheet2 分别在2个工作簿,SQL应该怎么写?
'这里的SQL的:[数据表.Sheet1$], [查询表.Sheet1$]  不会写


'工作簿内的查询我已经实现,但是查询结果的顺序是Sheet3的顺序
'2:想知道:有没有办法SQL直接给出 按照sheet1中A列顺序 排序的结果

代码弄了一半,剩下的大家帮忙
工作簿之间查询SQL.rar (20.22 KB, 下载次数: 498) .



该贴已经同步到 opiona的微博

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-14 23:12 | 显示全部楼层
本帖最后由 opiona 于 2011-11-14 23:20 编辑

第一个答案找到了:
  1. Sub 工作簿之间汇总() '
  2. Application.ScreenUpdating = False '关闭屏幕刷新
  3. Application.DisplayAlerts = False '关闭提示
  4. Dim Strsql$, Cn As Object
  5. Set y = CreateObject("adodb.recordset")
  6. Set Cn = CreateObject("Adodb.Connection")
  7. t = Timer
  8. Sheet3.Cells.Clear
  9. Cn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;imex=1';data source=" & ThisWorkbook.FullName
  10. Dataname = ThisWorkbook.Path & "\数据表.xls"
  11. 'Strsql = "SELECT a.姓名, b.工资 from [Excel 8.0;Database=" & Dataname & "].[Sheet1$a:b]  as b, [Sheet1$a:b] as a where a.姓名=b.姓名 order by a.姓名"
  12. Strsql = "SELECT  姓名, 工资 from [Excel 8.0;Database=" & Dataname & "].[Sheet1$a:b] where  姓名 in (select 姓名 from [Sheet1$a:b] )"
  13. '答案找到了:[Excel 8.0;Database=" & Dataname & "].[Sheet1$a:b]
  14. '甚至都不用打开工作簿
  15. '两种SQL写法都达到查询目的

  16. Set y = Cn.Execute(Strsql)
  17. Windows(ThisWorkbook.Name).Activate '回到操作主表界面
  18. Sheet3.Range("a2").CopyFromRecordset y
  19. Cn.Close

  20. Sheet3.Select
  21. Application.ScreenUpdating = True
  22. Application.DisplayAlerts = True
  23. MsgBox "一共用时:" & Format(Timer - t, "#0.00") & "秒"

  24. End Sub
复制代码
等待大侠对第二问题的解答,或者是没有办法如此排序??

TA的精华主题

TA的得分主题

发表于 2011-11-14 23:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
外连接:
Sub Macro1()
    Dim cnn, SQL$
    Set cnn = CreateObject("adodb.connection")
    cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.Path & "\数据表.xls"
    SQL = "select b.工资 from [Excel 8.0;Database=" & ThisWorkbook.FullName & "].[Sheet1$] a left join [Sheet1$] b on a.姓名=b.姓名"
    Range("b2").CopyFromRecordset cnn.Execute(SQL)
    cnn.Close
    Set cnn = Nothing
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-14 23:44 | 显示全部楼层

连接数据库语句在EXCEL 2007和2003的区别

本帖最后由 opiona 于 2011-11-21 11:44 编辑

感谢版主!
原来SQL果真如此神奇!

  1. '连接数据库语句在EXCEL 2007和2003的区别:
  2. '    Microsoft.ACE.OLEDB.12.0      Microsoft.jet.OLEDB.4.0
  3. '    Excel 12.0                    Excel 8.0
  4. '    外部链接:[Excel 12.0;Database=" & ThisWorkbook.FullName & "].[Sheet1$]     Excel 8.0;Database=" & ThisWorkbook.FullName & "].[Sheet1$]
  5. '2007可以查询2003,但是2003不能查询2007
  6. Sub Macro2007()
  7.     Dim cnn, SQL$
  8.     Set cnn = CreateObject("adodb.connection")
  9.     cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.Path & "\数据表.xlsx"
  10.     SQL = "select b.工资, b.补贴 from [Excel 12.0;Database=" & ThisWorkbook.FullName & "].[Sheet1$] a left join [Sheet1$] b on a.姓名=b.姓名"
  11. '   ThisWorkbook.Path & "\数据表.xls--------b表是数据表,
  12. '   ThisWorkbook.FullName--------a表是条件表,
  13. '   按照a表顺序,在b表查找,结果按照a表顺序粘贴(原顺序不表,结果对应粘贴)
  14.     Range("b2").CopyFromRecordset cnn.Execute(SQL)
  15.     cnn.Close
  16.     Set cnn = Nothing
  17. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-15 17:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
按照时间段SQL求和.rar (3.97 KB, 下载次数: 164)
表中一个字段为:日期+时间
日期格式为:2011-10-10  18:16:38
求:时间在9:00--12:00之间的数据SQL求和,不考虑日期

日期的用:字段 between 日期1 and 日期2
时间的不会写了,
请帮忙!!!!

TA的精华主题

TA的得分主题

发表于 2011-11-15 19:30 | 显示全部楼层
opiona 发表于 2011-11-15 17:38
表中一个字段为:日期+时间
日期格式为:2011-10-10  18:16:38
求:时间在9:00--12:00之间的数据SQL求 ...

Sub Macro1()
    Dim cnn, SQL$
    Set cnn = CreateObject("adodb.connection")
    cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
    SQL = "select sum(消费金额) from [Sheet1$] where timevalue(right(消费时间,8)) between #9:00# and #12:00#"
    MsgBox cnn.Execute(SQL)(0)
    cnn.Close
    Set cnn = Nothing
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-11-15 19:33 | 显示全部楼层
请看附件


按照时间段SQL求和.rar (10.23 KB, 下载次数: 395)

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-15 19:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
{:soso_e157:}斑竹:
我对你的敬仰,如滔滔江水........................

TA的精华主题

TA的得分主题

发表于 2011-11-15 23:37 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-11-16 19:21 | 显示全部楼层

将SQL查询结果进行行列转置

本帖最后由 opiona 于 2011-11-21 11:45 编辑

Range("a2").CopyFromRecordset y

SQL查询只有一个字段,就是一列
如果查询结果的个数不确定
结果粘贴到表中,就是很多行的那种

怎么做才能:
结果粘贴到表中变成一行,和工作表行列转置相似
好像见过,找不到了。

终于找到了那个行列转置的代码:
  1. Strsql = "SELECT  编号, sum([压实度(%)])  FROM [压实度$a3:j14]  where 编号 is not null  GROUP BY 编号"
  2. Set y = Cn.Execute(Strsql)
  3. '--------查询结果行列转置------------------------
  4. Arr = y.Getrows '把cnn记录赋值为二维数组
  5. 'MsgBox "OK " & UBound(Arr) & "-" & UBound(Arr, 2)
  6. sh1.Cells(5, 2).Resize(UBound(Arr) + 1, UBound(Arr, 2) + 1) = Arr
  7. '关键语句:按照Arr大小,调整指定区域的大小
复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 04:19 , Processed in 0.046184 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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