设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 25565|回复: 75
打印 上一主题 下一主题

[VBA编程/宏] 浅谈Excel查询

[复制链接]
跳转到指定楼层
1#
发表于 2011-3-12 23:37:00 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 roych 于 2011-3-13 15:04 编辑

       跟Access相比,Excel的查询功能尽管比较弱,但还是可以进行的,大体有以下几种方法:
       1、自动筛选或者高级筛选法。如果不需要常常更改条件的话,自动筛选或者高级筛选,不失为一种好办法。毕竟操作的步骤并不多,即便条件再多,一分钟内应该也可以完成。
       2、公式法:用Index+Small,再加上条件数组,是可以进行一定的查询的。格式一般是:{=Index(区域,small(if(条件,区域行数,),row(1:1)))},详细见附件。
       3、导入数据法。要领在于导入之后再编辑SQL语句,以达到查询的目的。需要注意的是,数据源位置必须正确,详细看附件中的“说明”工作表。
       4、利用内置函数,写VBA进行查询。利用内置函数的Countif、CountA等函数,再加上For语句,逐个历遍,以达到查询的目的。
       5、利用ADO对象,编写数据集语句执行。

       好,方法说完了,有兴趣的可以看看它们之间的优缺点了:
       前面三个针对单次查询较为有效,可以省却编程的繁琐。

       方法1,如果需要对所筛选的数据进行求和,则需要先筛选出来,再求和(当然,你也可以用状态栏来显示求和结果)。
       方法2,当然也无法求和的了,借助单元格变量,明显比自动筛选方便。而且,你还可以多加几个条件,——把if里的语句改为:(Range1=条件1)*(Range2=条件2)……。而和第一种方法相比,其缺点在于数据较多时,对内存影响比较大。
       方法3,比起方法2,方法3更加灵活,可以随时变更SQL条件而达到多次查询的目的。当然,前提是,您必须知道SQL语句的基本语法。
       方法4,比起方法3,不用每次都更改SQL语句,而只须在单元格填上条件即可,自然方便多了。不足之处在于条件较多,循环语句历遍时,对内存要求比较高,也因此而变得不易于调试。例子来源于Polygala1978
       http://www.office-cn.net/forum.php?mod=viewthread&tid=96395&page=1#pid586469,在此一并谢过。
       方法5,和方法4相比,同样可以达到相同的查询目的,而由于没有用到循环语句(或者循环语句比方法4的要少),从而更加优化了代码的执行效率。在执行查询前,应先调试SQL语句是否有误,还要注意字段类型等,详见附件的代码注释。
       希望大家不要觉得Roy过于罗嗦噢。不过,Excel查询又岂是三言两语可以说得很清楚的呢?如有不清楚之处,请大家随时反馈。
      
游客,如果您要查看本帖隐藏内容请回复

       更新后的附件,有了模糊查询的功能。相信大家更加喜欢吧。O(∩_∩)O~~
       在VBA语言里,Access和Excel的是不同的,前者为星号(*),后者为百分号(%),这很是困惑了我一阵子。在这里顺便提一下,以便新手少走一些弯路。        

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享2 分享淘帖1 订阅订阅
2#
 楼主| 发表于 2011-3-13 13:36:13 | 显示全部楼层
回复 aslxt 的帖子

改成有效性序列时,就相当于组合框了~~但是这个数据较多,可能做成二级下拉菜单要好些。
3#
 楼主| 发表于 2011-3-13 13:41:28 | 显示全部楼层
回复 polygala1978 的帖子

没有啊,我输入两个条件还是可以查询的啊?

你的意思可能是想改成Like语句,用通配符来做是吧?那我抽空再改改了。O(∩_∩)O~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
4#
 楼主| 发表于 2011-3-13 14:59:29 | 显示全部楼层
回复 polygala1978 的帖子

可以实现。详见我更新后的附件。
5#
 楼主| 发表于 2011-3-13 17:55:02 | 显示全部楼层
本帖最后由 roych 于 2011-3-13 18:23 编辑

      上次小妖姐姐在灌水帖里评了-30分,这次只好贴几个实例上来好混点评分,——请让小生自恋三秒钟,(*^__^*) 嘻嘻……)
      没想到,小妖姐姐一上来就刁难Roy。。。
      小妖姐姐说的定位,是不是Move系列方法(MoveFirst、MoveLast等等)。不过由于记录集属于内存数据,没试过,不知道行不行。
      而查找功能,应该是记录集中的Find方法,大家可以试试。语法为:rst.Find (条件, 起始行, [搜索行方式],查找方式 )
例如,从第一行搜索Roy的数据可以这样写:rst.Find("姓名=Roy",1,,adSearchForward),——第一行开始,肯定是向前搜索的了。
      不过,有这个必要么?  
  • 定位功能。Roy觉得查询出来之后,根据记录的条数,再用offset方法来定位岂非简单多了?
  • 查找功能。直接用系统自带的查找功能也不算太烂吧?即便想用VBA,也可以用For语句+Find方法来查找数据啊。是不是?
      狠狠地鄙视下小妖姐姐的无厘头难题~~~

6#
 楼主| 发表于 2011-3-13 18:34:09 | 显示全部楼层
aslxt 发表于 2011-3-13 18:12
简单改成有效性系列时,如何解决以下问题:
1、序列的唯一性
2、序列的排序

问题1:分两种情况:
如果是固定的序列(如中国的省份等等),可以设置一个唯一的数列,定义好名称后在有效性里设置好就行了。
如果不是固定的序列,例如随时增加序列号的话,则需要写数组公式来列出不重复值,然后再动态定义该序列。有时间的话,我会写点这方面的实例。——个人觉得这倒不如用数据透视表做好之后,每次打开时刷新透视表,从而得到动态数据要好些。
问题2、顺序是必须排列好的。当然,你也可以在启用宏的情况下,每次打开时自动对序列进行排序(用Sort方法)。
问题3、Roy暂时没研究。
7#
 楼主| 发表于 2011-3-14 11:21:36 | 显示全部楼层
对于小妖姐姐,这一点我是赞同的。我对所有人都是这么说的,能用命令时决不用公式,能用公式时决不用数组,能用数组时决不用VBA。
不到万不得已,谁会那么有空去调试代码呢?而且,我写这个的初衷,也不是为了鼓励大家去学VBA,更不是为了炫耀我的菜鸟VBA水平,而是希望这个能作为一种工具,能够简化大家的工作。——当然,前提是你必须知道怎么改数据源(这要求应该不算太高吧?),否则也是“授人以鱼”。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-4 00:29 , Processed in 0.140846 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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