ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 函数与公式] [第120期]最长连续优良月数[结束]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-2-12 14:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
受教了。

不过,使用 G:M 代替 G$2:M$2 这样表示的,占用资源过于庞大,在我的电脑上运算时间已经很长了。公式虽短,不可推荐啊。

TA的精华主题

TA的得分主题

发表于 2018-2-12 17:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wangg913 发表于 2018-2-10 23:37
答案汇总
2016版(365版)暂未验证
暂未拟定评分

2016版(365版)验证结果如图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-12 21:38 | 显示全部楼层
太阳之子 发表于 2018-2-12 17:14
2016版(365版)验证结果如图:

谢谢支持!
第一次上传的题目附件,没有给出3连A不在6连AB之中的案例(埋了一个坑,真不是故意的),
2月6日重新修改上传了附件,可能部分用户没及时看到,导致失分颇为遗憾。

经过验证,如下用户的答案是正确无误的(有问题请指正),拟评分如下,见下图。



2003版、2007版、2013版、365版的最佳都是14楼“梦幻小丑”的。
其答案极简极精,构思巧妙。
各版本解法依次为
  1. =MAX(ISNUMBER(FIND(222,-SUBSTITUTE(MID(SUM((B3:M3<{"C";"B"})*10^B$2:M$2),ROW($1:7),G$2:M$2),0,B3)))*G$2:M$2)
复制代码
  1. =IFERROR(MAX(FIND({0,222},MAX(--SUBSTITUTE(MID(SUM((B3:M3<{"C";"B"})*10^B$2:M$2),B$2:H$2,13),0,8/9,1),5^8))-1),)
复制代码
  1. =MAX(ISNUMBER(FIND("AAA",BASE(DECIMAL(MID(PHONETIC(B3:M3)&A2,ROW($1:7),G$2:M$2),12),12)))*G$2:M$2)
复制代码
  1. =MAX(ISNUMBER(FIND(111,-MID(CONCAT(IFERROR(FIND(B3:N3,"AB"),B3)),ROW($1:7),G$2:M$2)))*G$2:M$2)
复制代码


我的答案,颇长,也贴上。

  1. =IFNA(LEN(VLOOKUP("*AAA*",PHONETIC(OFFSET(A3,,ROW($1:13)-1,,-6-DAY(FREQUENCY(ROW($1:$13),(B3:M3>"B")*B$2:M$2)-7))),1,)),)
复制代码
  1. =IFNA(13-MATCH("*AAA*",MID(PHONETIC(B3:M3),FIND(REPT(1,13-B$2:H$2),SUM((B3:M3<"C")/10^B$2:M$2))-2,13-B$2:H$2),),)
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-12 22:21 | 显示全部楼层
陆续选几个优秀解法,分析一下。
第一个
14楼
梦幻小丑

  1. =MAX(ISNUMBER(FIND(222,-SUBSTITUTE(MID(SUM((B5:M5<{"C";"B"})*10^B$2:M$2),ROW($1:9),G$2:M$2),0,B5)))*G$2:M$2)
复制代码
1、首先使用 SUM((B5:M5<{"C";"B"})*10^B$2:M$2) 计算出一个数值
这个数值中,2代表A,1表示B,0代表非A非B
以第5行数据为例,该数字为
122211010


2、然后从该数值中分别按行、按列提取长度为6-12的多串数字,生成的多行多列数字串
MID(SUM((B5:M5<{"C";"B"})*10^B$2:M$2),ROW($1:9),G$2:M$2)
122211
1222110
12221101
122211010
122211010
122211010
122211010
222110
2221101
22211010
22211010
22211010
22211010
22211010
221101
2211010
2211010
2211010
2211010
2211010
2211010
211010
211010
211010
211010
211010
211010
211010
11010
11010
11010
11010
11010
11010
11010
1010
1010
1010
1010
1010
1010
1010
010
010
010
010
010
010
010
10
10
10
10
10
10
10
0
0
0
0
0
0
0


3、之后,再将数字0替换为文本
122211
122211B
122211B1
122211B1B
122211B1B
122211B1B
122211B1B
22211B
22211B1
22211B1B
22211B1B
22211B1B
22211B1B
22211B1B
2211B1
2211B1B
2211B1B
2211B1B
2211B1B
2211B1B
2211B1B
211B1B
211B1B
211B1B
211B1B
211B1B
211B1B
211B1B
11B1B
11B1B
11B1B
11B1B
11B1B
11B1B
11B1B
1B1B
1B1B
1B1B
1B1B
1B1B
1B1B
1B1B
B1B
B1B
B1B
B1B
B1B
B1B
B1B
1B
1B
1B
1B
1B
1B
1B
B
B
B
B
B
B
B

4、再进行负运算,将含有非A非B的连续排除,仅仅保留连续AB的
-122211
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!
#VALUE!


由此,最后再求出连续AB长度

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-12 22:26 | 显示全部楼层
第二个优秀解法
28楼
opqazxc
  1. =MAX((SUBSTITUTE(SUBSTITUTE(MID(PHONETIC(B5:M5)&1,ROW($1:9),G$2:M$2),"AAA",,1),"A","B")=REPT("B",D$2:J$2))*G$2:M$2)
复制代码

此解法和解法1有些相似
1、将 PHONETIC(B5:M5) 按行、按列提取文本串
MID(PHONETIC(B5:M5)&1,ROW($1:9),G$2:M$2)

BCBBAA
BCBBAAA
BCBBAAAB
BCBBAAABC
BCBBAAABCC
BCBBAAABCCD
BCBBAAABCCDD
CBBAAA
CBBAAAB
CBBAAABC
CBBAAABCC
CBBAAABCCD
CBBAAABCCDD
CBBAAABCCDD1
BBAAAB
BBAAABC
BBAAABCC
BBAAABCCD
BBAAABCCDD
BBAAABCCDD1
BBAAABCCDD1
BAAABC
BAAABCC
BAAABCCD
BAAABCCDD
BAAABCCDD1
BAAABCCDD1
BAAABCCDD1
AAABCC
AAABCCD
AAABCCDD
AAABCCDD1
AAABCCDD1
AAABCCDD1
AAABCCDD1
AABCCD
AABCCDD
AABCCDD1
AABCCDD1
AABCCDD1
AABCCDD1
AABCCDD1
ABCCDD
ABCCDD1
ABCCDD1
ABCCDD1
ABCCDD1
ABCCDD1
ABCCDD1
BCCDD1
BCCDD1
BCCDD1
BCCDD1
BCCDD1
BCCDD1
BCCDD1
CCDD1
CCDD1
CCDD1
CCDD1
CCDD1
CCDD1
CCDD1


2、将提取后的文本的第一个3连A去除后,将A替换为B
这样没有3连A的文本,超出限定长度3到9,将被排除掉
此后,可对全是B的文本进行操作即可
BCBBBB
BCBB
BCBBB
BCBBBC
BCBBBCC
BCBBBCCD
BCBBBCCDD
CBB
CBBB
CBBBC
CBBBCC
CBBBCCD
CBBBCCDD
CBBBCCDD1
BBB
BBBC
BBBCC
BBBCCD
BBBCCDD
BBBCCDD1
BBBCCDD1
BBC
BBCC
BBCCD
BBCCDD
BBCCDD1
BBCCDD1
BBCCDD1
BCC
BCCD
BCCDD
BCCDD1
BCCDD1
BCCDD1
BCCDD1
BBBCCD
BBBCCDD
BBBCCDD1
BBBCCDD1
BBBCCDD1
BBBCCDD1
BBBCCDD1
BBCCDD
BBCCDD1
BBCCDD1
BBCCDD1
BBCCDD1
BBCCDD1
BBCCDD1
BCCDD1
BCCDD1
BCCDD1
BCCDD1
BCCDD1
BCCDD1
BCCDD1
CCDD1
CCDD1
CCDD1
CCDD1
CCDD1
CCDD1
CCDD1

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-12 22:37 | 显示全部楼层
本帖最后由 wangg913 于 2018-2-12 22:39 编辑

第三个
14楼
梦幻小丑

  1. =IFERROR(MAX(FIND({0,222},MAX(--SUBSTITUTE(MID(SUM((B3:M3<{"C";"B"})*10^B$2:M$2),B$2:H$2,13),0,8/9,1),5^8))-1),)
复制代码


1、首先使用 SUM((B5:M5<{"C";"B"})*10^B$2:M$2) 计算出一个数值
这个数值中,2代表A,1表示B,0代表非A非B
以第5行数据为例,该数字为
122211010



2、然后从该数值中分别从位置1到7提取长度为13的数字,生成的多行数字串
MID(SUM((B5:M5<{"C";"B"})*10^B$2:M$2),B$2:H$2,13)
122211010
22211010
2211010
211010
11010
1010
010


3、将各数字中的第一个0替换为“一个0开头的长数字”,即8/9,其他数也可以(该数字不能含有222),
之后将替换后的文本数字减负转换为数值,
由于第一0替换为0.888888888888889
则原数字第一个0后面所有的数字,因为数字精度(15位有效数字)原因,将被“忽略”掉,
此时,每个数字都含有0
1222110.88888888
222110.888888888
22110.8888888888
2110.88888888888
110.888888888888
10.8888888888888
0.888888888888889


4、转换后的数字,有存在222的(即3连A),如果0的位置小于6(即小于6连AB)的,这时和一个大于222221(5^8)的常数比较,取最大值,就把小于6连AB的情况排除掉了。
大于222221的常数,即5^8=390625,如果MAX=390625,因其不含有222,最终也会被排除掉。

明天继续。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-2-13 08:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
准提部林 发表于 2018-1-23 10:16
贊個題, 佔個樓, 一般思路:
120字:
原來也覺得題目怪怪的~~

祝早日康复。。。。。。。。。。。

TA的精华主题

TA的得分主题

发表于 2018-2-13 08:36 | 显示全部楼层
大体看了一下诸位老师的答案,这道题目的确解法很多,小丑的确很厉害,其他用高版本的等我安装以后在认真学习,有很多函数还不认识,汗~~~

TA的精华主题

TA的得分主题

发表于 2018-2-13 08:45 | 显示全部楼层
wangg913 发表于 2018-2-12 22:21
陆续选几个优秀解法,分析一下。
第一个

头版也别尽拣着优秀答案分析,有时间把我那个也捋一捋呗,好让我学习一下o(* ̄︶ ̄*)o,另外,我感觉好久没见你了,可能与我上线较少有关

点评

你的做法减少几个字没问题,144字,减多了也没想出来。  发表于 2018-2-13 12:52

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-13 11:18 | 显示全部楼层
优秀解法4
24楼
太阳之子
  1. =MAX(IF(ISERR(FIND("AAA",BASE(DECIMAL(MID(CONCAT(B3:M3)&A2,ROW($1:7),G$2:M$2),12),12))),,G$2:M$2))
复制代码


1、将合并后的文本按行、按列提取长度6到12的文本
A2可以用-1代替,置于文本末尾,用于排除不足预设长度的文本
MID(CONCAT(B3:M3)&-1,ROW($1:7),G$2:M$2)

BCBBAA
BCBBAAA
BCBBAAAB
BCBBAAABC
BCBBAAABCC
BCBBAAABCCD
BCBBAAABCCDD
CBBAAA
CBBAAAB
CBBAAABC
CBBAAABCC
CBBAAABCCD
CBBAAABCCDD
CBBAAABCCDD-
BBAAAB
BBAAABC
BBAAABCC
BBAAABCCD
BBAAABCCDD
BBAAABCCDD-
BBAAABCCDD-1
BAAABC
BAAABCC
BAAABCCD
BAAABCCDD
BAAABCCDD-
BAAABCCDD-1
BAAABCCDD-1
AAABCC
AAABCCD
AAABCCDD
AAABCCDD-
AAABCCDD-1
AAABCCDD-1
AAABCCDD-1
AABCCD
AABCCDD
AABCCDD-
AABCCDD-1
AABCCDD-1
AABCCDD-1
AABCCDD-1
ABCCDD
ABCCDD-
ABCCDD-1
ABCCDD-1
ABCCDD-1
ABCCDD-1
ABCCDD-1
BCCDD-
BCCDD-1
BCCDD-1
BCCDD-1
BCCDD-1
BCCDD-1
BCCDD-1
CCDD-1
CCDD-1
CCDD-1
CCDD-1
CCDD-1
CCDD-1
CCDD-1



2、2013版函数 DECIMAL,能将数字转换为指定进制的数值
(数字大于 10 的基数根据需要使用数值 0-9 和字母 A-Z)
比如36进制,各数字依次为0-9,A-Z。12进制,为0-9,A,B
因此,DECIMAL(MID(CONCAT(B3:M3)&A2,ROW($1:7),G$2:M$2),12) 不能识别C/D,含有C/D的文本变为错误值#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
2984099
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!



3、随后,使用BASE函数,将数值再转回12进制
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
BBAAAB
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!
#NUM!


这是一个极佳的排除连续间隔的办法。



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 01:55 , Processed in 0.050234 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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