ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 【函数小题】字符串去重及压缩

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-9 15:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
cutecpu 发表于 2020-6-9 02:11
去重: =CONCAT(MID(A3,IF(MID(A3,ROW($1:$11),1)MID(A3,ROW($2:$12),1),ROW($1:$11),12),1))

压缩:

第二个的公式有点小瑕疵,当某个字母连续10个的时候会出现错误。如AAAAAAAAAAB,公式会显示为A1B1

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-9 15:43 | 显示全部楼层
丢丢表格 发表于 2020-6-9 12:36
你的思路很好,就是公式的通用性差一点。。。

=CONCAT(IF(MID(A3,ROW($1:21),1)=MID(A3,ROW($2:22),1) ...

=CONCAT(IF(MID(A3,ROW($1:21),1)=MID(A3,ROW($2:22),1),"",MID(A3,ROW($1:21),1)&FREQUENCY(ROW($1:20),IF(MID(A3,ROW($1:20),1)=MID(A3,ROW($2:21),1),0,ROW($1:20)))))
我测试的时候需要增加"",不然就会出现很多个0

TA的精华主题

TA的得分主题

发表于 2020-6-9 15:47 | 显示全部楼层
本帖最后由 象山海鲜 于 2020-6-9 15:54 编辑
丢丢表格 发表于 2020-6-9 13:59
WPS

是有差别的?。

他要求的是11字符....
老师的字符串是10字符

字符长度 1~98个可用
  1. =CONCAT(TEXT(-FREQUENCY(ROW(INDIRECT("1:"&LEN(A3))),(MID(A3,ROW($1:$98),1)<>MID(A3,ROW($2:$99),1))*ROW($1:$98)),";!"&MID(A3,ROW($1:$99),1)&0))
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-9 17:11 | 显示全部楼层
每次发帖,收获都比较多
贴一下我的公式:
第一个问题:=concat(FILTERXML("<a><b>"&TEXTJOIN("</b><b>",,MID(A3&1,ROW($1:$12),1))&"</b></a>","a/b[not (contains(.,following::b[1]))]"))
第二个问题:
=concat(IFERROR(FILTERXML("<a><b>"&TEXTJOIN("</b><b>",,MID(A3&1,ROW($1:$12),1))&"</b></a>","a/b[not (contains(.,following::b[1]))]")&FREQUENCY(ROW($1:$11),IF(MID(A3,ROW($1:$11),1)=MID(A3,ROW($2:$12),1),"",ROW($1:$11))),""))

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-9 17:11 | 显示全部楼层
dim麻辣君 发表于 2020-6-9 14:41
这样不难啊,替换一下1不就完事

不能简单的替换1,如果有联系10个的字符的话,就会出现问题了

TA的精华主题

TA的得分主题

发表于 2020-6-9 17:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
静听溪流 发表于 2020-6-9 17:11
不能简单的替换1,如果有联系10个的字符的话,就会出现问题了

对哦,还要考虑10以上,又长见识了,多谢

TA的精华主题

TA的得分主题

发表于 2020-6-9 18:45 | 显示全部楼层
本帖最后由 LWQ张无忌 于 2020-6-9 20:39 编辑

去重先上,有点长
=CONCAT(IFERROR(MID(A3,(1-FREQUENCY(IFERROR(FIND(REPT(CHAR(ROW($65:$90)),COLUMN(B:L)),A3)+COLUMN(A:K)-1,""),ROW($1:11)))*ROW($1:11),1),""))
第二个,只能抄了
=CONCAT(IFERROR(MID(A3,IF(MID(A3,ROW($1:11),1)<>MID(A3,ROW($2:12),1),ROW($1:11)),1)&FREQUENCY(ROW($1:11),((MID(A3,ROW($1:11),1)<>MID(A3,ROW($2:12),1))*ROW($1:11))),""))

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-6-9 20:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
shss12 发表于 2020-6-9 09:48
去重 数组  这个用函数有点没头绪,用了最笨的火车法,那个压缩加数字的这个火车法就不能用了,公式超长了 ...

代码都没你的函数长
Sub kk()
Dim regex As Object, rg As Range, aa, aaa, TT$
Set regex = CreateObject("VBSCRIPT.REGEXP")
Range("F3:G5").ClearContents
With regex
    For Each rg In Range("e3:e" & Cells(Rows.Count, "e").End(xlUp).Row)
        .Global = 1
        .IgnoreCase = 1
            .Pattern = "([a-z])\1+|([a-z]){1}"
                Set aaa = .Execute(rg)
                    For Each aa In aaa
                    If Len(aa) > 1 Then
                    TT = .Replace(aa, "$1")
                Else
            TT = aa.Value
        End If
    Cells(rg.Row, "F").Value = Cells(rg.Row, "F").Value & TT
Cells(rg.Row, "G").Value = Cells(rg.Row, "G").Value & IIf(Len(aa) = 1, aa.Value, .Replace(aa, "$1")) & Len(aa)
Next
Next
End With
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-6-9 20:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
象山海鲜 发表于 2020-6-9 13:30
不想开火车,只有高版本才好

image.png
增加难度,这样大家练习下

TA的精华主题

TA的得分主题

发表于 2020-6-9 23:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
1055751654 发表于 2020-6-9 20:05
代码都没你的函数长
Sub kk()
Dim regex As Object, rg As Range, aa, aaa, TT$

如果用正则,可以用同一个正则表达式完成去重、压缩。
其中,解决“压缩”的问题,可以用正则的Replace方法构造公式来实现。

  1. Sub ggmmlol()
  2.     Set reg = CreateObject("VBScript.RegExp")
  3.     reg.Global = True
  4.     reg.Pattern = "(.)(\1*)"
  5.     ar = Range("A1").CurrentRegion.Resize(, 2).Offset(2)
  6.     r = UBound(ar)
  7.     For i = 1 To r - 1
  8.         ar(i, 2) = "=""" & reg.Replace(ar(i, 1), "$1""&len(""$1$2"")&""") & """"
  9.         ar(i, 1) = reg.Replace(ar(i, 1), "$1")
  10.     Next
  11.     Range("B3").Resize(r - 1, 2).NumberFormat = ""
  12.     Range("B3").Resize(r - 1, 2).Value = ar
  13. End Sub
复制代码

评分

3

查看全部评分

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

本版积分规则

关闭

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

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

GMT+8, 2024-12-24 03:58 , Processed in 0.037861 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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