技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 22799
|
4#
發(fā)表于 2016-3-27 14:59:04
|
只看該作者
單行或者單列很簡單。單列的話,dcount應(yīng)該沒問題。單行使用記錄集,move到目標(biāo)行計(jì)算即可。
這個題目難就難在于countif的自由性(任意區(qū)域,甚至多區(qū)域),為了盡量匹配到,需要用到VBA,這里先假定是任意連續(xù)區(qū)域(多區(qū)域條件暫不考慮):
- Function Countif(ByVal strWhere As String, _
- ByVal lngSColumn As Long, _
- ByVal lngEColumn As Long, _
- ByVal lngSRow As Long, _
- ByVal lngERow As Long) As Long
-
- Dim rst As New ADODB.Recordset
- Dim i As Long, j As Long, lngCount As Long
-
-
-
- rst.Open "tbl_Countif", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
-
- '初始化,以免出錯。數(shù)字格式部分暫由數(shù)據(jù)有效性處理,這里略去。
- lngCount = 0
- If lngSColumn < 1 Then lngEColumn = 1
- If lngEColumn > rst.Fields.count Then lngEColumn = rst.Fields.count
- If lngSRow < 1 Then lngEColumn = 1
- If lngERow > rst.RecordCount Then lngERow = rst.RecordCount
- For i = lngSRow To lngERow
- For j = lngSColumn - 1 To lngEColumn - 1
- If rst(j) Like "*" & strWhere & "*" Then
- lngCount = lngCount + 1
- End If
- Next
- rst.MoveNext
- Next
- Countif = lngCount
- 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
|