设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 5778|回复: 16
打印 上一主题 下一主题

Office PK 第五期,Excel挑战Access:算个数(单条件计数)

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2016-3-26 18:03:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在Excel的单元格里写公式,这是Excel的强项,为了不让Access感到心理崩溃,我也不想弄个类似于要求计算100以内质数之类的BT题,就写个简单的公式吧。
话说我不小心把自己迷失在过往已经中了,请帮忙找一下,这里一共有多少个自己。
计数就行,不必在表上高亮显示。




本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2016-3-26 21:46:44 | 只看该作者
不光崩溃,而且泪奔

点击这里给我发消息

3#
 楼主| 发表于 2016-3-27 09:31:57 | 只看该作者
王站你不用这样吧,你出的第二期里,就用到类似功能的,有贴为证:Excel和AccessPK第二期:Access自定义单号http://www.office-cn.net/thread-121535-1-1.html

我当时不会写这块的代码,就用了个被VBA高手鄙视的法子:用代码调用工作表函数,写成application.countif...
这会你跳出来说你崩溃泪奔?谁信啊?!
4#
发表于 2016-3-27 14:59:04 | 只看该作者
单行或者单列很简单。单列的话,dcount应该没问题。单行使用记录集,move到目标行计算即可。

这个题目难就难在于countif的自由性(任意区域,甚至多区域),为了尽量匹配到,需要用到VBA,这里先假定是任意连续区域(多区域条件暂不考虑):
  1. Function Countif(ByVal strWhere As String, _
  2.             ByVal lngSColumn As Long, _
  3.             ByVal lngEColumn As Long, _
  4.             ByVal lngSRow As Long, _
  5.             ByVal lngERow As Long) As Long
  6.             
  7.     Dim rst As New ADODB.Recordset
  8.     Dim i As Long, j As Long, lngCount As Long
  9.    
  10.    
  11.    
  12.     rst.Open "tbl_Countif", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  13.    
  14.     '初始化,以免出错。数字格式部分暂由数据有效性处理,这里略去。
  15.     lngCount = 0
  16.     If lngSColumn < 1 Then lngEColumn = 1
  17.     If lngEColumn > rst.Fields.count Then lngEColumn = rst.Fields.count
  18.     If lngSRow < 1 Then lngEColumn = 1
  19.     If lngERow > rst.RecordCount Then lngERow = rst.RecordCount

  20.     For i = lngSRow To lngERow
  21.         For j = lngSColumn - 1 To lngEColumn - 1
  22.             If rst(j) Like "*" & strWhere & "*" Then
  23.                 lngCount = lngCount + 1
  24.             End If
  25.         Next
  26.         rst.MoveNext
  27.     Next
  28. Countif = lngCount
  29. End Function
复制代码

暂不做窗体,有兴趣的版友可以尝试做下。建议使用组合框来设置数据的有效性。这个例子支持通配符,例如:
Countif("可*", 1, 7, 1, 2)=1
Countif("可", 1, 7, 1, 2)=0
其它说明【不可能或较困难的任务】:
  • 由于Access的数据格式必须规范化,因此不可能做出同一列数字、文本混排然后再统计数字之类的。
  • 如果需要统计数字或者日期,则需要将条件的文本转换为条件,可能需要提取运算符(and,>=之类),或者使用where子句或者filter方法,实现起来较为困难。
大家可以先参考下,算是抛砖引玉吧。
另外,本例如果用记录集的getrows可能会有更高的效率,不过也更加繁琐(所以没测试)。具体思路大约是:
  • 先根据列标起止位置,获取列名(Field.Name)。
  • 根据引用行数(Rows),起始行数(Start)和1得到的数组作为参数,调用getrows方法,得到一个二维数组。
  • 然后转二维数组为一维数组(或者一列列追加到临时表也行)。
  • 用数组的Filter方法过滤掉,得到新的数组,计算Ubound,即为Countif结果。
  • 如果是追加到临时表,则应该在追加时就使用条件,否则较难判断。追加完毕后,可以使用Count聚合函数来计算或者使用ADO的RecountCount。

本帖子中包含更多资源

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

x

点击这里给我发消息

5#
发表于 2016-3-27 19:50:31 | 只看该作者
妖,变态,眼睛吃不消,我数了好久。

点评

第九行有4个^_^  发表于 2016-3-28 12:14

点击这里给我发消息

6#
 楼主| 发表于 2016-3-27 21:17:49 | 只看该作者
zhuyiwen 发表于 2016-3-27 19:50
妖,变态,眼睛吃不消,我数了好久。

谁让你用肉眼数了?

点击这里给我发消息

7#
发表于 2016-3-28 10:03:22 | 只看该作者
pureshadow 发表于 2016-3-27 21:17
谁让你用肉眼数了?

哈哈

点击这里给我发消息

8#
发表于 2016-3-28 12:00:04 | 只看该作者
roych 发表于 2016-3-27 14:59
单行或者单列很简单。单列的话,dcount应该没问题。单行使用记录集,move到目标行计算即可。

这个题目难 ...

这个函数不错,长access志气,灭Excel威风。

点击这里给我发消息

9#
 楼主| 发表于 2016-3-28 15:54:36 | 只看该作者
tmtony 发表于 2016-3-28 12:00
这个函数不错,长access志气,灭Excel威风。

你以为Excel里没有Dcount?

本帖子中包含更多资源

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

x

点击这里给我发消息

10#
发表于 2016-3-28 17:05:23 | 只看该作者
pureshadow 发表于 2016-3-27 21:17
谁让你用肉眼数了?

本来就是肉眼凡胎
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-24 21:18 , Processed in 0.101548 second(s), 39 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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