設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

12下一頁
返回列表 發(fā)新帖
查看: 6499|回復(fù): 16
打印 上一主題 下一主題

Office PK 第五期,Excel挑戰(zhàn)Access:算個數(shù)(單條件計(jì)數(shù))

[復(fù)制鏈接]

點(diǎn)擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2016-3-26 18:03:26 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
在Excel的單元格里寫公式,這是Excel的強(qiáng)項(xiàng),為了不讓Access感到心理崩潰,我也不想弄個類似于要求計(jì)算100以內(nèi)質(zhì)數(shù)之類的BT題,就寫個簡單的公式吧。
話說我不小心把自己迷失在過往已經(jīng)中了,請幫忙找一下,這里一共有多少個自己。
計(jì)數(shù)就行,不必在表上高亮顯示。




本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱

點(diǎn)擊這里給我發(fā)消息

2#
發(fā)表于 2016-3-26 21:46:44 | 只看該作者
不光崩潰,而且淚奔

點(diǎn)擊這里給我發(fā)消息

3#
 樓主| 發(fā)表于 2016-3-27 09:31:57 | 只看該作者
王站你不用這樣吧,你出的第二期里,就用到類似功能的,有貼為證:Excel和AccessPK第二期:Access自定義單號http://ctxi.cn/thread-121535-1-1.html

我當(dāng)時不會寫這塊的代碼,就用了個被VBA高手鄙視的法子:用代碼調(diào)用工作表函數(shù),寫成application.countif...
這會你跳出來說你崩潰淚奔?誰信?!
4#
發(fā)表于 2016-3-27 14:59:04 | 只看該作者
單行或者單列很簡單。單列的話,dcount應(yīng)該沒問題。單行使用記錄集,move到目標(biāo)行計(jì)算即可。

這個題目難就難在于countif的自由性(任意區(qū)域,甚至多區(qū)域),為了盡量匹配到,需要用到VBA,這里先假定是任意連續(xù)區(qū)域(多區(qū)域條件暫不考慮):
  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.     '初始化,以免出錯。數(shù)字格式部分暫由數(shù)據(jù)有效性處理,這里略去。
  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
復(fù)制代碼

暫不做窗體,有興趣的版友可以嘗試做下。建議使用組合框來設(shè)置數(shù)據(jù)的有效性。這個例子支持通配符,例如:
Countif("可*", 1, 7, 1, 2)=1
Countif("可", 1, 7, 1, 2)=0
其它說明【不可能或較困難的任務(wù)】:
  • 由于Access的數(shù)據(jù)格式必須規(guī)范化,因此不可能做出同一列數(shù)字、文本混排然后再統(tǒng)計(jì)數(shù)字之類的。
  • 如果需要統(tǒng)計(jì)數(shù)字或者日期,則需要將條件的文本轉(zhuǎn)換為條件,可能需要提取運(yùn)算符(and,>=之類),或者使用where子句或者filter方法,實(shí)現(xiàn)起來較為困難。
大家可以先參考下,算是拋磚引玉吧。
另外,本例如果用記錄集的getrows可能會有更高的效率,不過也更加繁瑣(所以沒測試)。具體思路大約是:
  • 先根據(jù)列標(biāo)起止位置,獲取列名(Field.Name)。
  • 根據(jù)引用行數(shù)(Rows),起始行數(shù)(Start)和1得到的數(shù)組作為參數(shù),調(diào)用getrows方法,得到一個二維數(shù)組。
  • 然后轉(zhuǎn)二維數(shù)組為一維數(shù)組(或者一列列追加到臨時表也行)。
  • 用數(shù)組的Filter方法過濾掉,得到新的數(shù)組,計(jì)算Ubound,即為Countif結(jié)果。
  • 如果是追加到臨時表,則應(yīng)該在追加時就使用條件,否則較難判斷。追加完畢后,可以使用Count聚合函數(shù)來計(jì)算或者使用ADO的RecountCount。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x

點(diǎn)擊這里給我發(fā)消息

5#
發(fā)表于 2016-3-27 19:50:31 | 只看該作者
妖,變態(tài),眼睛吃不消,我數(shù)了好久。

點(diǎn)評

第九行有4個^_^  發(fā)表于 2016-3-28 12:14

點(diǎn)擊這里給我發(fā)消息

6#
 樓主| 發(fā)表于 2016-3-27 21:17:49 | 只看該作者
zhuyiwen 發(fā)表于 2016-3-27 19:50
妖,變態(tài),眼睛吃不消,我數(shù)了好久。

誰讓你用肉眼數(shù)了?

點(diǎn)擊這里給我發(fā)消息

7#
發(fā)表于 2016-3-28 10:03:22 | 只看該作者
pureshadow 發(fā)表于 2016-3-27 21:17
誰讓你用肉眼數(shù)了?

哈哈

點(diǎn)擊這里給我發(fā)消息

8#
發(fā)表于 2016-3-28 12:00:04 | 只看該作者
roych 發(fā)表于 2016-3-27 14:59
單行或者單列很簡單。單列的話,dcount應(yīng)該沒問題。單行使用記錄集,move到目標(biāo)行計(jì)算即可。

這個題目難 ...

這個函數(shù)不錯,長access志氣,滅Excel威風(fēng)。

點(diǎn)擊這里給我發(fā)消息

9#
 樓主| 發(fā)表于 2016-3-28 15:54:36 | 只看該作者
tmtony 發(fā)表于 2016-3-28 12:00
這個函數(shù)不錯,長access志氣,滅Excel威風(fēng)。

你以為Excel里沒有Dcount?

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x

點(diǎn)擊這里給我發(fā)消息

10#
發(fā)表于 2016-3-28 17:05:23 | 只看該作者
pureshadow 發(fā)表于 2016-3-27 21:17
誰讓你用肉眼數(shù)了?

本來就是肉眼凡胎
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 06:25 , Processed in 0.123234 second(s), 39 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表