程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

wps/excel函数技巧:将连续数字合并为范围

balukai 2025-04-27 12:27:59 文章精选 1 ℃


一、功能概述

目标:将杂乱数字序列中的连续部分合并为范围格式(如1,2,3,4 → 1~4),非连续数字单独保留。
适用场景:电段编号、实验数据分组等需要简化显示的场合。


二、公式与示意图解析

完整公式

=LET(
  a, SORT(--REGEXP(I11,"[0-9]+"), 1, 1),
  b, REDUCE("", a, LAMBDA(x, y, VSTACK(x, 
    LET(
      c, ISNUMBER(XMATCH(y+1, a)),
      d, ISNUMBER(XMATCH(y-1, a)),
      IFS(AND(d, c), "", d, "`"&y, 1, y)
    )
  ))),
  SUBSTITUTE(TEXTJOIN(",", 1, b), ",`", "~")
)

步骤1:提取并排序数字

公式片段
a, SORT(--REGEXP(I11,"[0-9]+"), 1, 1)
示意图

原始数据

提取数字

排序后数字

电-144-143-145...

[144,143,145...

[11,89,90,91,...]

解析

  • REGEXP(I11, "[0-9]+"):从文本中提取所有数字(返回文本数组)。
  • --:将文本转为数值。
  • SORT(..., 1, 1):升序排序(参数修正为按列升序)。

步骤2:标记连续数字的起点与终点

公式片段

REDUCE("", a, LAMBDA(x, y, 
  LET(
    c, ISNUMBER(XMATCH(y+1, a)),  -- 检查y+1是否存在
    d, ISNUMBER(XMATCH(y-1, a)),  -- 检查y-1是否存在
    IFS(
      AND(d, c), "",  -- 中间连续数(如90):留空
      d, "`"&y,       -- 连续起点(如94):标记为`94
      1, y            -- 非连续数(如147):直接保留
    )
  )
))

示意图

当前数字

前数是否存在

后数是否存在

标记结果

89

89

90

94

·94

解析

  • 若数字的前后均有连续数(如90),则跳过,避免重复标记。
  • 若只有后数(如89),标记为89,表示范围的起点。
  • 若只有前数(如94),标记为·94,表示范围的起点。
  • 若前后均无连续数(如147),直接保留。

步骤3:拼接最终结果

公式片段
SUBSTITUTE(TEXTJOIN(",", 1, b), ",~", "~")`
示意图

中间结果

替换符号后

11,89,~94,142...

11,89~94,142...

解析

  • TEXTJOIN:将标记后的数组用逗号连接。
  • SUBSTITUTE:将“,~”替换为“~”,形成范围格式(如89~94`)。



三、完整示例演示

输入数据:电-1-2-3-4-70-71-72段
处理过程

  1. 提取并排序 → [1,2,3,4,70,71,72]
  2. 标记范围 → [1, , ,4 ,70, , ,72]
  3. 拼接替换 → 1~4,70~72

四、注意事项

  1. 重复数字处理:若数据包含重复项(如1,1,2),需先使用UNIQUE去重。
  2. 多段数据支持:公式可同时处理多段文本(如“电段”、“水段”)。
  3. 错误检查:若原始数据无数字,公式会返回空值。

五、示意图总结

原始输入 → 提取数字 → 排序 → 遍历标记 → 拼接结果

"电-144-143-145-142-147" → [144,143,145,142,147] → [142,143,144,145,147] → [142,空,空,.~145,147] → "142~145,147"
(示意图说明:展示从原始数据到最终结果的完整流程,包含提取、排序、标记、拼接步骤。)


通过此公式,可高效将杂乱数字转换为易读的范围格式。尝试修改数据或扩展公式逻辑,满足更多场景需求!

最近发表
标签列表