|
楼主 |
发表于 2019-6-8 07:45
|
显示全部楼层
把指定范围数字转换成3区余 1.zip
(27.38 KB, 下载次数: 1)
老师:实际应用中,发现14楼的代码存在下面四点问题:
1.当数据源A列的数字小于B2:V2指定的最小值时,就会出现如R5:V5错误;
2.当数据源A列的数字大于B3:V3指定的最大值时,就会出现如M8:V33错误;
3.当B2:V3指定范围内的数据总数不能被3整除时,就会出现P,U列里如粉红色填充的错误4.第二、三参数不能直接指定为数字
解决办法:
1.设置:当数据源数字小于第二参数【即最小值】时,屏蔽错误的计算结果为空;
2.设置:当数据源数字大于第三参数【即最大值】时,屏蔽错误的计算结果为空;
3.改进当B2:V3指定范围内的数据总数不能被3整除时的算法,让计算结果与E,J列相同。
4.让第二、三参数既能调用单元格指定,也可以直接指定为数字。
而通用的函数公式为:=IF(OR($A5="",$A5<B$2,$A5>B$3),"",INT(($A5-B$2)*3/(B$3+1-B$2))&MOD($A5,3))
恳请老师帮忙完善和修改下面的代码为盼:
'可以数组,可以单应用
Function SQUYU(rgSource As Range, rgMin As Range, rgMax As Range) As Variant
Dim arr As Variant, lngRow As Long, strTemp As String
Dim lngInterval As Long, strResult As String
Dim lngSource As Long, lngMin As Long, lngMax As Long
If rgSource.Count = 1 Then
ReDim arr(1 To 1, 1 To 1)
arr(1, 1) = rgSource.Value
Else
arr = rgSource
End If
lngMin = rgMin.Value
lngMax = rgMax.Value
For lngRow = LBound(arr) To UBound(arr)
strTemp = arr(lngRow, 1)
If Trim(strTemp) = "" Then
arr(lngRow, 1) = ""
Else
lngSource = Val(strTemp)
lngInterval = (lngMax - lngMin + 1) \ 3
strResult = (lngSource - lngMin) \ lngInterval
strResult = strResult & (lngSource Mod 3)
arr(lngRow, 1) = strResult
End If
Next
SQUYU = arr
End Function
|
|