作业帮 > 综合 > 作业

VBA找单元格数据的中间名次

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/08 21:55:07
VBA找单元格数据的中间名次
晕,刚才问网友没问完.先看看格式,假定某个单元格里数据是7(25),9(14),01(3),45(2),236(1),8(0),
小括号和逗号全是英文输入法下的,小括号外的的数字是具体数字,小括号内的数字是其次数,相同的次数按升序排列放在一起,不同的次数用逗号隔开,上述数据表示7是25次的,9是14次的,0和1都是3次的,4和5都是2次的,2,3,6都是1次的,8是0次的,可以看到有6个名次,有6个逗号,所有单元格都是这种形式的,逗号个数1-10个,现在就是统计任意单元格中逗号的个数.网友很快给出代码:
Function DouHao(r,c) 'r表示行号,c表示列号
arr = Split(Cells(r,c).Value,",")
DouHao = UBound(arr)
End Function
现在的代码要求是:统计中间名次,如果名次个数(即逗号个数,可以使用上面的代码)大于等于3(1-2个名次不存在中间名次之说,统计结果为空),分为两种情况,是奇数的,很好,直接就是逗号的个数加1再除以2,如果是偶数就直接除以2,截取名次之前的具体数字,例如单元格数据是7(25),9(14),01(3),45(2),236(1),8(0),那么结果就是01 如果单元格数据是347(19),89(8),056(7),1(5),2(2),则结果就是056
自定义函数形式:
Function MiddleTime(r,c)'r表示行号,c表示列号
arr = Split(Cells(r,c).Value,",")
If UBound(arr)>=3 Then
代码
Else
MiddleTime="" '逗号个数小于3个为空
End If
End Function
注意不要把次数和名次混淆了,如7(19),89(12),056(7),1(5),2(2),的中间名次是056,它的次数是7次的,代码要找的是中间名次是哪些数字,而不是其次数,即找的是056,而不是其次数7.
Function MiddleTime(r, c) 'r表示行号,c表示列号
arr = Split(Cells(r, c).Value, ",")
douhao1 = UBound(arr)
If douhao1 >= 3 Then
If douhao1 Mod 2 = 0 Then '偶数
k = Application.WorksheetFunction.Find("@", Application.WorksheetFunction.Substitute(Cells(r, c), ",", "@", douhao1 / 2)) ‘逗号个数的一半的位置
tmp = Mid(Cells(r, c), k + 1, Len(Cells(r, c)) - k) ’截取单元格一半逗号后面的文本
l = InStr(tmp, "(") - 1 ‘查找第一个(号
MiddleTime = Mid(tmp, 1, l) ’取得结果
Else
k = Application.WorksheetFunction.Find("@", Application.WorksheetFunction.Substitute(Cells(r, c), ",", "@", (douhao1 + 1) / 2 - 1)) ‘逗号数+1后除以2得到一半逗号的位置再减去1
tmp = Mid(Cells(r, c), k + 1, Len(Cells(r, c)) - k)
l = InStr(tmp, "(") - 1
MiddleTime = Mid(tmp, 1, l)
End If
Else
MiddleTime = "" '逗号个数小于3个为空
End If
End Function