问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Excel VBA SQL如何多表联合查询?

发布网友 发布时间:2022-04-26 14:08

我来回答

5个回答

懂视网 时间:2022-04-10 06:11

Sub NextSeven_CodeFrame()
‘应用程序设置
 Application.ScreenUpdating = False
 Application.DisplayAlerts = False
 Application.Calculation = xlCalculationManual

 ‘错误处理
 On Error GoTo ErrHandler

 ‘计时器
 Dim StartTime, UsedTime As Variant
 StartTime = VBA.Timer

 ‘变量声明
 Dim wb As Workbook
 Dim sht As Worksheet
 Dim Rng As Range
 Dim Arr As Variant
 Dim EndRow As Long

 Dim oSht As Worksheet
 Dim DataPath As String
 Dim SQL As String
 Dim EndDate As Date
 Dim StartDate As Date
 Dim Client As String



 ‘实例化对象
 Set wb = Application.ThisWorkbook
 Set sht = wb.Worksheets("凭证录入")
 Set oSht = wb.Worksheets("客户明细")
 DataPath = wb.FullName



 usertxt = Application.InputBox("请输入开始日期", "开始日期", , , , , , 2)
 If usertxt = False Then Exit Sub
 StartDate = Format(CDate(usertxt), "yyyy-mm-dd")


 usertxt = Application.InputBox("请输入结束日期", "结束日期", , , , , , 2)
 If usertxt = False Then Exit Sub
 EndDate = Format(CDate(usertxt), "yyyy-mm-dd")

 usertxt = Application.InputBox("请输入客户姓名", "客户姓名", , , , , , 2)
 If usertxt = False Then Exit Sub
 Client = CStr(usertxt)


 oSht.UsedRange.Offset(1).Clear
 Set Rng = oSht.Range("A2")

 SQL = "SELECT * FROM [" & sht.Name & "$A3:V] WHERE 出货客户=‘" & Client & "‘ AND ( 出货日期 Between #" & StartDate & "# AND #" & EndDate & "# )"
 SQL = SQL & " ORDER BY 型号 ASC"
 If RecordExistsRunSQL(DataPath, SQL) = True Then
 GetRecordSetIntoRange DataPath, SQL, Rng
 End If



 ‘运行耗时
 UsedTime = VBA.Timer - StartTime
 MsgBox "本次运行耗时:" & Format(UsedTime, "0.0000000秒")
ErrorExit: ‘错误处理结束,开始环境清理
 Set wb = Nothing
 Set sht = Nothing
 Set Rng = Nothing

 Application.ScreenUpdating = True
 Application.DisplayAlerts = True
 Application.Calculation = xlCalculationAutomatic
 Exit Sub
ErrHandler:
 If Err.Number <> 0 Then
 MsgBox Err.Description & "!", vbCritical, "错误提示!"
 ‘Debug.Print Err.Description
 Err.Clear
 Resume ErrorExit
 End If
End Sub

Public Sub GetRecordSetIntoRange(ByVal DataPath As String, ByVal SQL As String, ByVal Rng As Range)
‘对传入数据源地址进行判断
 If Len(DataPath) = 0 Or Len(Dir(DataPath)) = 0 Then _
 MsgBox "数据源地址为空或者数据源文件不存在!", vbInformation, "NS Excel Studio": Exit Sub
 ‘对传入SQL语句进行判断
 If Len(SQL) = 0 Then _
 MsgBox "SQL语句不能为空!", vbInformation, "NS Excel Studio": Exit Sub
 ‘对象变量声明
 Dim cnn As Object
 Dim rs As Object
 ‘数据库引擎——Excel作为数据源
 Const DATA_ENGINE As String = "Provider=Microsoft.jet.OLEDB.4.0;" & _
  "Extended Properties=‘Excel 8.0;HDR=YES;IMEX=2‘; Data Source= "
 ‘创建ADO Connection 连接器 实例
 Set cnn = CreateObject("ADODB.Connection")
 ‘On Error Resume Next
 ‘创建 ADO RecordSet 记录集 实例
 Set rs = CreateObject("ADODB.RecordSet")
 ‘连接数据源
 cnn.Open DATA_ENGINE & DataPath
 ‘执行查询 返回记录集
 rs.Open SQL, cnn, 1, 1
 ‘Set RS = CNN.Execute(SQL)
 ‘复制记录集到指定Range
 Rng.CopyFromRecordset rs
 ‘关闭记录集
 rs.Close
 ‘关闭连接器
 cnn.Close
 ‘释放对象
 Set rs = Nothing
 Set cnn = Nothing
End Sub
Public Function RecordExistsRunSQL(ByVal DataPath As String, ByVal SQL As String) As Boolean
‘对传入数据源地址进行判断
 If Len(DataPath) = 0 Or Len(Dir(DataPath)) = 0 Then
 RecordExistsRunSQL = False
 MsgBox "数据源地址为空或者数据源文件不存在!", vbInformation, "NS Excel Studio"
 Exit Function
 End If
 ‘对传入SQL语句进行判断
 If Len(SQL) = 0 Then
 RecordExistsRunSQL = False
 MsgBox "SQL语句不能为空!", vbInformation, "NS Excel Studio"
 Exit Function
 End If
 ‘对象变量声明
 Dim cnn As Object
 Dim rs As Object
 ‘数据库引擎——Excel作为数据源
 ‘Const DATA_ENGINE As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
  ‘ "Extended Properties=‘Excel 12.0;HDR=YES;IMEX=2‘; Data Source= "
  
  ‘数据库引擎——Excel作为数据源
 Const DATA_ENGINE As String = "Provider=Microsoft.jet.OLEDB.4.0;" & _
  "Extended Properties=‘Excel 8.0;HDR=YES;IMEX=2‘; Data Source= "
  
  
 ‘创建ADO Connection 连接器 实例
 Set cnn = CreateObject("ADODB.Connection")
 On Error Resume Next
 ‘创建 ADO RecordSet 记录集 实例
 Set rs = CreateObject("ADODB.RecordSet")
 ‘连接数据源
 cnn.Open DATA_ENGINE & DataPath
 ‘执行查询 返回记录集
 rs.Open SQL, cnn, 1, 1
 ‘返回函数结果
 If rs.RecordCount > 0 Then
 RecordExistsRunSQL = True
 Else
 RecordExistsRunSQL = False
 End If
 ‘关闭记录集
 rs.Close
 ‘关闭连接器
 cnn.Close
 ‘释放对象
 Set rs = Nothing
 Set cnn = Nothing
End Function

  

20170112xlVBA查询SQL

标签:orm   form   close   bool   val   bug   sql语句   div   his   

热心网友 时间:2022-04-10 03:19

我也是个新手,趁此机会学习了一下,技术不高,写的太长了,基本符合要求,除了那生产信息,销售信息的合并单元格外

select abcg.型号,阶段,生产日期,生产数,不良数,销售日期,销售数量 from (select abc.型号,阶段,日期,生产日期,生产数,不良数 from (select a.型号,阶段,日期 from [表A$] a left join (select 型号,生产日期 as 日期 from [表B$] UNION select 型号,销售日期 as 日期 from [表C$]) bc on a.型号=bc.型号) abc left join (select 型号,生产日期,SUM(生产数) AS 生产数,SUM(不良数) AS 不良数 from [表B$] group by 型号,生产日期) bg ON abc.型号=bg.型号 and abc.日期=bg.生产日期) abcg left join (select 型号,销售日期,SUM(销售数量) AS 销售数量 from [表C$] group by 型号,销售日期) cg on abcg.型号=cg.型号 and abcg.日期=cg.销售日期 order by abc.型号,abc.日期

刚少了个排序

追问看这个比较头晕呵呵,你能告诉下你的思路吗?

追答1,把BC表的型号和日期用union连接成不重复的,命名为bc,两个字段,型号,日期
2,把a表和bc通过left join生成字段为型号,阶段,日期的新表,命名为abc
3,把b和c表分别按型号和日期汇总,分别命名为bg,cg
4,最后用两个left join把bg,cg,加到abc里去,其中的日期项用来使bg,cg的记录按日期对应

热心网友 时间:2022-04-10 04:37

Excel VBA SQL如何多表联合查询的方法如下:
1、中间结果法,按你自己的想法,根据要实现的结果,分成几个步骤来实现,每一步都把结果存到临时表中,即可。

2、直接sql查询法:
可以按下面的思路来写,具体的还要自己再调试一下:

Select
A.型号,A.阶段,
B.生产日期,生产型号=B.型号,B.生产数,
B.不良数,
C.销售日期,销售型号=C.型号,C.销售数量
From 表A A,
(Select 生产日期,型号,
生产数=Sum(生产数),不良数=Sum(不良数) From 表B
Group By 生产日期,型号
)B,
(Select 销售日期,型号,
销售数量=Sum(销售数量) From 表C
Group By 销售日期,型号
)C
Where A.型号 = B.型号 And A.型号=C.型号

热心网友 时间:2022-04-10 06:12

select abcg.型号,阶段,生产日期,生产数,不良数,销售日期,销售数量 from (select abc.型号,阶段,日期,生产日期,生产数,不良数 from (select a.型号,阶段,日期 from [表A$] a left join (select 型号,生产日期 as 日期 from [表B$] UNION select 型号,销售日期 as 日期 from [表C$]) bc on a.型号=bc.型号) abc left join (select 型号,生产日期,SUM(生产数) AS 生产数,SUM(不良数) AS 不良数 from [表B$] group by 型号,生产日期) bg ON abc.型号=bg.型号 and abc.日期=bg.生产日期) abcg left join (select 型号,销售日期,SUM(销售数量) AS 销售数量 from [表C$] group by 型号,销售日期) cg on abcg.型号=cg.型号 and abcg.日期=cg.销售日期 order by abc.型号,abc.日期

热心网友 时间:2022-04-10 08:03

Select
A.型号,A.阶段,
B.生产日期,生产型号=B.型号,B.生产数,
B.不良数,
C.销售日期,销售型号=C.型号,C.销售数量
From 表A A,
(Select 生产日期,型号,
生产数=Sum(生产数),不良数=Sum(不良数) From 表B
Group By 生产日期,型号
)B,
(Select 销售日期,型号,
销售数量=Sum(销售数量) From 表C
Group By 销售日期,型号
)C
Where A.型号 = B.型号 And A.型号=C.型号
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女人梦见蛇的七大预兆解梦 PHOTOSHOP 怎么把眼睛点大 这些月销量10000+的防晒霜,是噱头还是真的好用? 大宝水凝保湿防晒露适合哪些肤质的人使用? 拥有人口过亿的国家最多的大洲是( )A.非洲B.亚洲C.欧洲D.大洋 世界国家最多的大洲是:( ) A.亚洲 B.大洋州 C.非洲 D.欧 拥有人口过亿的国家最多的大洲是:( ) A.非洲 B.亚洲 C.欧洲 D.大洋 餐厅一般中餐都有哪些摆台要求和标准 如何做味道正宗的中餐? 河南文科跟理科高考分数线相差多少 excel SQL多表查询问题 WPS word一开始编辑就卡死,完全动不了,需要打开任务管理器强制关闭,是什么原因? 怎么关闭wps桌面整理 wps的word文档,打开后选中文字是就会跳出一个这样的框然后强行关闭软件,如何解决? WPS文档打开多个窗口后无法关闭怎么办 WPS word 文档打开后容易卡住不能动?需要用任务管理器强制关闭! 你好,请问怎么关掉电脑Wps文档 微信来消息怎么不显示 佳能新百微可以加装近摄镜吗 佳能18-200mm镜头十近摄镜拍摄微距效果好不 请问佳能18-55mm镜头怎么样才能拍微距(用上近摄镜或近摄圈可以吗?) 单反相机近摄镜的选用 佳能85丨.4的镜头可以装近摄圈吗 佳能85 F1.8镜头可以用近摄镜吗 佳能500D使用近摄镜为什么无法对焦? 佳能77mm近摄镜片 500d 增距延长管 ef12 ii 有什么不同 请教几个佳能镜头的字符含义 佳能60d配什么镜头适合拍近物 新买的佳能18-135镜头有时候拍近的东西对不上焦是怎么回事? 关于佳能“小痰盂”和“近摄镜”的一点疑问?? 怎么在excel中正确使用SQL的查询语句 oppo手机微信隐藏了在哪找出来 我的‘设置’-‘隐私’-‘定位服务’-在这里怎么找不到微信呢 excel使用sql语句查询功能. 彩色皮夹克怎么清洁与保养 Excel表中连接sql并使用sql语句引用excel单元格数据作为查询条件 Excel 如何使用SQL语句联接两个表中的数据 EXCEL中的SQL语句查询并分类汇总 浏览器限制网页站点怎么办?怎么更改安全设置 皮沙发被孩子涂上彩色笔颜色,如何去掉 如何修改浏览器的安全设置啊? 请教,皮沙发被衣服染色,怎样处理 win7在哪里设置缺省web浏览器? 我在学校测量实训两周(就是水准仪,经纬仪,全站仪)现在老师要我们写一千字的实训报告 跪求~ 经纬仪水准仪检校实习报告 土木工程测量实习要用的 水准仪测量高差的实训报告 求一篇关于测量的实训报告 怎么写三四等水准测量实训报告? 谁有水利工程测量实训报告 水准仪的实验目的