ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2912|回复: 28

[求助] 请老师们看看:怎样添加并集判断?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-6-8 09:15 | 显示全部楼层 |阅读模式
本帖最后由 WYS67 于 2019-6-8 11:49 编辑

1.gif (1.61 MB, 下载次数: 0)

把指定范围数字转换成3区余 1.zip (27.38 KB, 下载次数: 3)


如原公式B5=IF($A5="","",INT(($A5-F$2)*3/(F$3+1-F$2))&MOD($A5,3)),增加两个并集判断后,公式变成了:
B5=IF(OR($A5="",$A5<B$2,$A5>B$3),"",INT(($A5-B$2)*3/(B$3+1-B$2))&MOD($A5,3))



那么:代码:
Function SQUYU(rng As Range, y, x)
    Dim ar, b, i
    ar = rng: b = Int((x - y + 1) / 3)
    If Not IsArray(ar) Then
        ReDim ar(1 To 1, 1 To 1): ar(1, 1) = rng
    Else: ar = rng
    End If
    For i = 1 To UBound(ar)
        If ar(i, 1) <> "" Then
            If y = 0 Then ar(i, 1) = Int(ar(i, 1) / b) & ar(i, 1) Mod 3
            If y = 1 Then ar(i, 1) = Int((ar(i, 1) - 1) / b) & ar(i, 1) Mod 3
        Else: ar(i, 1) = ""
        End If
    Next
    SQUYU = ar
End Function


中的If ar(i, 1) <> "" Then 应该怎样修改,才能同时满足AND($A<>"",$A5>=F$2,$A5<=F$3)这三个条件判断?

原先的代码里只有一个判断条件:If ar(i, 1) <> "" Then,现在需要再增加两个并集判断:ar(i, 1) >=x  和   ar(i, 1) <=y   就行了!我写成:
If ar(i, 1) <> "" Then  and  ar(i, 1) >=x   Then  and  ar(i, 1) <=y   提示错误!


    那么正确的写法是什么?




TA的精华主题

TA的得分主题

发表于 2019-6-8 09:20 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-8 09:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 WYS67 于 2019-6-8 10:24 编辑
719404338 发表于 2019-6-8 09:20
没有附件神马都是浮云。

老师:问题很简单,不需要附件了吧?

  原先的代码里只有一个判断条件:ar(i, 1) <> "" Then,现在需要再增加两个并集判断:ar(i, 1) >=x  和   ar(i, 1) <=y   就行了!我写成:

If ar(i, 1) <> "" Then  and  ar(i, 1) >=x   Then  and   ar(i, 1) <=y   提示错误!


    那么正确的写法是什么?

TA的精华主题

TA的得分主题

发表于 2019-6-8 09:33 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-8 09:54 | 显示全部楼层
本帖最后由 WYS67 于 2019-6-8 13:34 编辑
719404338 发表于 2019-6-8 09:33
If ar(i, 1)  ""   or  ar(i, 1) >=x     or  ar(i, 1)

1.gif

把指定范围数字转换成3区余 1.zip (27.38 KB, 下载次数: 9)

老师请看:B5:K41是用函数公式计算的正确结果!    而M:V列是自定义函数SQUYU计算的结果,M5:V41里带三种填充色都是错误的;

问题说明:
1.当数据源A列的数字小于B2:V2指定的最小值时,就会出现如R5:V5错误;
2.当数据源A列的数字大于B3:V3指定的最大值时,就会出现如M8:V33错误;
3.当B2:V3指定范围内的数据总数不能被3整除时,就会出现P,U列里如粉红色填充的错误


解决办法
1.设置:当数据源数字小于第二参数【即最小值】时,屏蔽错误的计算结果为空;
2.设置:当数据源数字大于第三参数【即最大值】时,屏蔽错误的计算结果为空;
3.改进当B2:V3指定范围内的数据总数不能被3整除时的算法,让计算结果与E,J列相同


总而言之,让自定义函数计算的结果和B5:K41显示的那样就行!

Function SQUYU(rng As Range, y, x)
    Dim ar, b, i
    ar = rng: b = Int((x - y + 1) / 3)
    If Not IsArray(ar) Then
        ReDim ar(1 To 1, 1 To 1): ar(1, 1) = rng
    Else: ar = rng
    End If
    For i = 1 To UBound(ar)
        If ar(i, 1) <> "" Then
            If y = 0 Then ar(i, 1) = Int(ar(i, 1) / b) & ar(i, 1) Mod 3
            If y = 1 Then ar(i, 1) = Int((ar(i, 1) - 1) / b) & ar(i, 1) Mod 3

        Else: ar(i, 1) = ""
        End If
    Next
    SQUYU = ar
End Function

通用公式举例:B5=IF(OR($A5="",$A5<B$2,$A5>B$3),"",INT(($A5-B$2)*3/(B$3+1-B$2))&MOD($A5,3))

自定义函数运算规则

1.只对数据源A5:A41里,符合最小值,最大值限定范围的所有数字,进行计算,不符合条件的结果一律屏蔽为空白;
2.把A列列符合最小值、最大值指定条件的所有数字,尽可能均匀地分为0、1、2三区;如:
   当最小值为0,最大值为5时,0、1为“0”,2、3为“1”,4、5为“2”;
   当最小值为0,最大值为8时,0、1、2为“0”,3、4、5为“1”,6、7、8为“2”;
   当最小值为0,最大值为26时,0~8为“0”,9~17为“1”,18~26为“2”;
   当最小值为1,最大值为6时,1、2为“0”,3、4为“1”,5、6为“2”;
   当最小值为1,最大值为9时,1、2、3为“0”,4、5、6为“1”,7、8、9为“2”;
   当最小值为1,最大值为27时,1~9为“0”,10~18为“1”,19~27为“2”;
      ……以此类推。
   如果,最小值,最大值限定范围内的数字总个数,不能够被3整除,则取最接近三等分的整数进行0、1、2分区,用函数公式表达为:            INT((数据源数字-最小值)*3/(最大值+1-最小值))数。如0~9共十个数字,则0~3为0区,4~6为1区,7~9为2区。
3,把A列列符合最小值、最大值指定条件的各个数字除以3,求其余数0,1,2;用函数公式表达为:MOD(数据源数字,3)
4.把分区0,1,2和除以3的余数0,1,2,用“&”连接起来

最终的结果就是B5:K41所显示的那样!

函数名称:SQUYU
公式类型:区域数组公式和普通公式两种。
函数语法: {  =SQUYU(数据区域,最小值,最大值),第二三参数可以是指定数值,也可以是单元格引用

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-8 10:03 | 显示全部楼层
719404338 发表于 2019-6-8 09:33
If ar(i, 1)  ""   or  ar(i, 1) >=x     or  ar(i, 1)

恳请老师看看5楼附件里反映的问题应该怎么解决?

貌似下面三行代码的问题,尝试了多次,就是解决不了。
            If ar(i, 1) <> "" Then
            If y = 0 Then ar(i, 1) = Int(ar(i, 1) / b) & ar(i, 1) Mod 3
            If y = 1 Then ar(i, 1) = Int((ar(i, 1) - 1) / b) & ar(i, 1) Mod 3

TA的精华主题

TA的得分主题

发表于 2019-6-8 10:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
要求同时具备多条件才能成立的,每个单条件之间要用and链接,只要满足其中一个条件即可成立的,各个单条件之间用or 链接。复杂条件的扔按照上面的规则组合
例如:if (a>0 and b>0) or (c<1 and d>200) then g=200

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-8 10:10 | 显示全部楼层
renkangjizhen 发表于 2019-6-8 10:05
要求同时具备多条件才能成立的,每个单条件之间要用and链接,只要满足其中一个条件即可成立的,各个单条件 ...

请老师看看5楼附件里

            If ar(i, 1) <> "" Then
            If y = 0 Then ar(i, 1) = Int(ar(i, 1) / b) & ar(i, 1) Mod 3
            If y = 1 Then ar(i, 1) = Int((ar(i, 1) - 1) / b) & ar(i, 1) Mod 3

的这三行代码,怎样修改,得出的结果才能和B5:K41一样【只显示正确的结果,而屏蔽不符合条件的计算结果为空白】?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-8 10:43 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-8 12:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请老师们帮忙!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 15:29 , Processed in 0.056390 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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