ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 在EXCEL中使用SQL语句查询集锦-持续更新中,敬请关注

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-6-12 10:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:ADO技术
变么好的贴,加关注。随时学习

TA的精华主题

TA的得分主题

发表于 2013-6-12 11:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
收藏,谢谢版主分享。好好学sql

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-12 13:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
最近发现一种按照指定顺序排序的方法:
  1. SQL = "select 城市,门店名称,销售 from [明细$] order by instr('广州,北京,上海,深圳',城市) Asc"
复制代码
  1. SQL = "select 城市,门店名称,销售 from [明细$] order by instr('" & Join(Application.Transpose([m2:m5])) & "',城市) asc"
复制代码
Instr('你指定的顺序',指定的字段名)
这样找到的数据就会按照广州,北京,上海,深圳先后顺序进行排序
SQL按列排序采用区域引用,非手写.rar (19.04 KB, 下载次数: 558)

TA的精华主题

TA的得分主题

发表于 2013-6-19 11:43 | 显示全部楼层
本帖最后由 njmxn 于 2013-6-19 11:44 编辑

Book1.rar (15.6 KB, 下载次数: 50)
大师,在使用GET_SQL这个自定义函数查找数据时,如果标题行下面的的内容是用N/A表示,那么这一列的数据整体都查询不到
如附件,如果我想查找STD的数据,Analyte Concentration (ng/mL)这一列的数据就不会出现,请问大师这是什么原因

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-19 12:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Book1.rar (15.68 KB, 下载次数: 149)

;imex=1 ---数字和字符混排的,加一个这个,前面有介绍
你查找是包含[STD]的,上半部分不包含,当然出不来了
具体见附件!

TA的精华主题

TA的得分主题

发表于 2013-6-19 13:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
New Folder.rar (16.25 KB, 下载次数: 45)
真是太谢谢大师了,解决了我的大问题了,因为刚刚接触sql语句,有好多都不懂,所以还想向大师请教个问题,我是在VB中写的sql语句查询,当运行玩程序后,手动关闭excel工作薄,就会出现如下图所示的提示
untitled.JPG
另外第一次运行上述附近中程序时,会出现如下图说是的提示
2.JPG
大师,这些要怎么解决呢,这些问题在vba里是不会出现的,可是运用到VB中就会出现,请大师帮帮忙,谢谢……

TA的精华主题

TA的得分主题

发表于 2013-6-19 15:09 | 显示全部楼层
本帖最后由 wenvay 于 2013-6-19 15:16 编辑
  1. Set cnn = CreateObject("adodb.connection")
  2. myPath = ThisWorkbook.Path & ""
  3. MyFile = ThisWorkbook.Name
  4. '以本EXCEL文件作为一个数据库  cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & myPath & MyFile
  5. '筛选ALLDATA工作表 REMARK字段为空的数据
  6.     SQL = "select * from [AllData$a2:s] where Remark is null" '筛选条件Remark 为空   
  7.     Set wb = GetObject(myPath & MyFile)
  8.     '将数据复制到工作表REMARKS
  9.     With wb
  10.      .Worksheets("remarks").Range("a1").CurrentRegion.Offset(2).ClearContents
  11.      .Worksheets("remarks").Range("a3").CopyFromRecordset cnn.Execute(SQL)
  12.      .Worksheets("remarks").Activate
  13.      .Worksheets("remarks").Range("a3").Select
  14.     End With  
  15.     cnn.Close   
  16. Set cnn = Nothing
复制代码
以EXCEL2007的xlsm文件的AllData工作表为数据库,出现几个问题,清楚的可以帮忙解答一下:
1.工作表AllData超过65535行时,CopyFromRecordset或者cnn.Execute(SQL)没有将数据全部复制到,只能复制到65535行。
2.SQL = "select * from [AllData$a2:s] where Remark is null"  单元格为NULL的并没有完全select到。
3.SQL = "select * from [AllData$a2:s] where Remark is not null"  not null 这个筛选条件并不起作用。
是否Connection strings  有问题或是数据有问题?

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-19 17:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
在vb6.0中我是这样导出SQL查询的:
  1. 'On Error Resume Next   '错误自动执行下一行
  2. 'Application.ScreenUpdating = False   '关闭屏幕刷新
  3. Dim xlApp As Excel.Application
  4. Dim xlBook As Excel.Workbook
  5. Dim xlSheet As Excel.Worksheet

  6.    Set xlApp = CreateObject("Excel.Application") '创建EXCEL对象
  7.    Set xlBook = xlApp.Workbooks.Add
  8.    Set xlSheet = xlBook.Worksheets(1) '设置活动工作表

  9. strSQL = Text1.Text
  10. rs.Open strSQL, Conn, 3, 3
  11. a = rs.RecordCount
  12. xlSheet.Range("a2").CopyFromRecordset rs  '复制RS的全部数据到表中指定开始单元格
  13.     For i = 0 To rs.Fields.Count - 1       '取第一行作标题
  14.         xlSheet.Cells(1, i + 1) = rs.Fields(i).Name
  15.     Next i
  16. rs.Close
  17. MsgBox "自定义台账已经生成,见Excel表!", 32, "北极狐温馨提示!"
  18. xlApp.Visible = True '设置EXCEL对象可见(或不可见)
  19. 'xlSheet.PrintOut '打印工作表
  20. 'xlBook.Close (True) '关闭工作簿
  21. Set xlApp = Nothing '交还控制给Excel
  22. 'xlApp.Quit '结束EXCEL对象
复制代码
SQL = "select * from [AllData$a2:s] where Remark is null or len(Remark)=0"  
SQL = "select * from [AllData$a2:s] where len(Remark)>0

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-19 17:09 | 显示全部楼层
本帖最后由 opiona 于 2013-6-19 17:11 编辑

如果是打开一个存在的Excel
可以将:Set xlBook = xlApp.Workbooks.Add
换成:Set xlBook = xlApp.Workbooks.open(完整路径)

查询结果不完整,也许是字符与数字混排的结果
加上一个: imex=1  试试!

TA的精华主题

TA的得分主题

发表于 2013-6-20 09:13 | 显示全部楼层
本帖最后由 wenvay 于 2013-6-20 10:03 编辑
opiona 发表于 2013-6-19 17:09
如果是打开一个存在的Excel
可以将:Set xlBook = xlApp.Workbooks.Add
换成:Set xlBook = xlApp.Workbo ...


opiona,谢谢。
有没有尝试过,数据超过10W的select呢?
我尝试了,最多也就能把6W多,也就是以前2003的总行数筛选出来

.Worksheets(AllData).Range("B3:B" & m).NumberFormatLocal = "[$-409]mmm-yy;@"
将B列的数据改为日期格式的代码似乎也不行
加了 imex=1  后 出错:找不到可安装的isam
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-5 23:23 , Processed in 0.042802 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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