Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1838|回复: 8

VBA方法实现查询

[复制链接]
发表于 2017-8-2 09:51 | 显示全部楼层 |阅读模式
最近研究如何运用SQL在VBA中, 在实际中确实有很大的帮助。
例如我有这么一个顾客表,里面只有顾客的详细信息,包括名字,ID,地址等

此外还有一张订单表,里面有顾客的ID,购买日期,发货目的地,总价格。

最后想要实现以下查询:

查找在5月下单,且发货目的地为“NSW”或“QL”的顾客的姓名,ID,日期,destination,price,address,phone。显示在一起,且最后按日期从前往后排序。

用SQL很容易就可以完成,但是对于VBA呢,我是试了试,实在是太复杂,所以特来和大家讨论讨论,有没有简便的VBA方法。

顾客表.png 订单表.png 最终.png

SQL.rar

89.03 KB, 下载次数: 13

 楼主| 发表于 2017-8-2 11:31 | 显示全部楼层
回复

使用道具 举报

发表于 2017-8-2 17:00 | 显示全部楼层
回复

使用道具 举报

发表于 2017-8-2 17:01 | 显示全部楼层
不用sql也方便,用字典串联ID即可。
回复

使用道具 举报

 楼主| 发表于 2017-8-2 17:13 | 显示全部楼层

你好,具体怎么做呢?

ID作为字典的key,然后比如先装进去月份-筛选出5月的,再装进destination,再筛选出剩下的,然后根据ID分别把对应的address,name等复制到新工作表。

以上是我想到的用VBA的方法。。可惜光是想想就很头疼了,再多几个条件就要多筛选几次,多跑好几个循环。

回复

使用道具 举报

发表于 2017-8-2 19:48 | 显示全部楼层
  1. Sub grf()
  2.     arr = Sheets(1).[a1].CurrentRegion
  3.     Set d = CreateObject("scripting.dictionary")
  4.     For i = 2 To UBound(arr)
  5.         d(arr(i, 2)) = i
  6.     Next
  7.     brr = Sheets(2).[a1].CurrentRegion
  8.     ReDim crr(1 To UBound(brr), 1 To 7)
  9.     For i = 2 To UBound(brr)
  10.         If Month(brr(i, 2)) = 5 And (brr(i, 3) = "QL" Or brr(i, 3) = "NSW") Then
  11.             k = d(brr(i, 1))
  12.             If k > 0 Then
  13.                 n = n + 1
  14.                 crr(n, 1) = arr(k, 1)
  15.                 crr(n, 2) = brr(i, 1)
  16.                 crr(n, 3) = brr(i, 2)
  17.                 crr(n, 4) = brr(i, 3)
  18.                 crr(n, 5) = brr(i, 4)
  19.                 crr(n, 6) = arr(k, 3)
  20.                 crr(n, 7) = arr(k, 7)
  21.             End If
  22.         End If
  23.     Next
  24.     [a1].Resize(1, 7) = Array("name", "ID", "date", "destination", "price", "address", "phone")
  25.     If n > 0 Then
  26.         [a2].Resize(n, 7) = crr
  27.         [a2].Resize(n, 7).Sort key1:=[c2]
  28.     End If
  29. End Sub
复制代码

demo.rar

98.35 KB, 下载次数: 6

回复

使用道具 举报

发表于 2017-8-2 19:49 | 显示全部楼层
用字典记录各id在顾客表中的行数即可,然后筛选order表中符合条件的记录,根据id在顾客表对应行提取数据。
回复

使用道具 举报

发表于 2017-8-2 19:51 | 显示全部楼层
另外你的Sql写得太啰嗦,当字段名在各表中唯一时,无需指定表。详见3楼。
回复

使用道具 举报

 楼主| 发表于 2017-8-2 20:25 | 显示全部楼层
grf1973 发表于 2017-8-2 19:51
另外你的Sql写得太啰嗦,当字段名在各表中唯一时,无需指定表。详见3楼。

学习到了

我就没想过是这么来的。

另外,再请教下,SQL指定表的别名是直接 空格 + 别名吗? 字段名是要加as?

回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-3-29 17:31 , Processed in 0.298916 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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