ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-6-10 00:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1055751654 发表于 2020-6-9 20:05
代码都没你的函数长
Sub kk()
Dim regex As Object, rg As Range, aa, aaa, TT$

Sub demo()
   For r = 3 To Cells(Rows.Count, "E").End(xlUp).Row
      s = Cells(r, "E").Value: p = Left(s, 1): c = 0
      f = "": g = ""
      For i = 1 To Len(s) + 1
         If Mid(s, i, 1) = p Then
            c = c + 1
         Else
            f = f & p: g = g & p & c
            p = Mid(s, i, 1): c = 1
         End If
      Next
      Cells(r, "F").Resize(1, 2) = Array(f, g)
   Next
End Sub


祝順心,南無阿彌陀佛!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-6-10 07:12 来自手机 | 显示全部楼层
ggmmlol 发表于 2020-6-9 23:21
如果用正则,可以用同一个正则表达式完成去重、压缩。
其中,解决“压缩”的问题,可以用正则的Replace ...

好的,谢谢老师,我又看到19楼张无忌的图,中间去重的又怎么弄出来呀?这个号花又没了,得登另一个号才有

TA的精华主题

TA的得分主题

发表于 2020-6-10 07:13 来自手机 | 显示全部楼层
cutecpu 发表于 2020-6-10 00:45
Sub demo()
   For r = 3 To Cells(Rows.Count, "E").End(xlUp).Row
      s = Cells(r, "E").Value: p ...


谢老师,19楼张无忌中间的又怎么弄呀?是不是要递归

TA的精华主题

TA的得分主题

发表于 2020-6-10 08:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
1055751654 发表于 2020-6-10 07:13
谢老师,19楼张无忌中间的又怎么弄呀?是不是要递归

既然用到VBA了,那手段就多了去了。
相对于函数公式构建内存数组的复杂程度,VBA可以灵活地用数组、集合、单变量等来存储中间数据,对源字符串灵活地拆分、合并,可以用多重循环实施降维打击,因此可以轻松搞定。

  1. Sub test2()
  2.     Set reg = CreateObject("VBScript.RegExp")
  3.     reg.Global = True
  4.     ar = Range("A1").CurrentRegion.Resize(, 2).Offset(2)
  5.     r = UBound(ar)
  6.     ReDim br(1 To r, 1 To 2)
  7.     For i = 1 To r - 1
  8.         s = ar(i, 1)
  9.         Do While Len(s) > 0
  10.             cl = Left(s, 1)
  11.             reg.Pattern = cl & "+"
  12.             Set mas = reg.Execute(s)
  13.             br(i, 1) = br(i, 1) & String(mas.Count, cl)
  14.             For Each ma In mas
  15.                 br(i, 2) = br(i, 2) & cl & Len(ma)
  16.             Next
  17.             s = reg.Replace(s, "")
  18.         Loop
  19.     Next
  20.     Range("I3").Resize(r - 1, 2).Value = br
  21. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-6-10 09:41 | 显示全部楼层
本帖最后由 deadzlq 于 2020-6-10 13:09 编辑

PowerQuery M函数参考解法(来凑热闹
QQ截图20200610130844.png

【函数小题】字符串去重_压缩.zip

16.79 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-6-10 10:30 | 显示全部楼层
ggmmlol 发表于 2020-6-10 08:54
既然用到VBA了,那手段就多了去了。
相对于函数公式构建内存数组的复杂程度,VBA可以灵活地用数组、集合 ...

谢谢老师,很强大

TA的精华主题

TA的得分主题

发表于 2020-6-10 12:41 | 显示全部楼层
deadzlq 发表于 2020-6-10 09:41
PowerQuery M函数参考解法(来凑热闹)

你这去重不符合题目要求:连续重复的,才要求去重;如果是不连续的,还是要另算的,

TA的精华主题

TA的得分主题

发表于 2020-6-10 17:57 | 显示全部楼层
deadzlq 发表于 2020-6-10 09:41
PowerQuery M函数参考解法(来凑热闹)

拆成list,table.fromvalues,再group局部分组会不会简单些?

TA的精华主题

TA的得分主题

发表于 2020-6-10 21:10 来自手机 | 显示全部楼层
libo5563 发表于 2020-6-10 17:57
拆成list,table.fromvalues,再group局部分组会不会简单些?

步骤会多点

TA的精华主题

TA的得分主题

发表于 2020-6-11 20:03 | 显示全部楼层
ggmmlol 发表于 2020-6-9 23:21
如果用正则,可以用同一个正则表达式完成去重、压缩。
其中,解决“压缩”的问题,可以用正则的Replace ...

"=""" & reg.Replace(ar(i, 1), "$1""&len(""$1$2"")&""") & """"这个引号真的太难学了好晕
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-12-24 04:10 , Processed in 0.046333 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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