ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 压缩连续数(含单双)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-14 21:08 | 显示全部楼层 |阅读模式
这题先按照不间断的单双数压缩,再按照连续数压缩,我现在希望用VBA来解决,详细见附件

PS:这题是我根据某大学的课表想到的,然后参考了静版的数据源,根据课表的格式自己增加了一些变成数据源,按照自己的规则手动做出结果
我看到的课表中一个单元格内有好几个信息:课程/周次/地点/教师/教学班组成/选课人数,可能还有多个课程
某个单元格写的是(3-4节)2-8周,12-14周(双),15-17周,后面标记单双是指单双周上课,周次这个格式让我眼前一亮
然后我联想到这个和之前静版的题类似但是有区别,故简化以后给大家做做
【练习小题】压缩连续数-Excel函数与公式-ExcelHome技术论坛 -

压缩连续数(含单双).zip

8.32 KB, 下载次数: 17

TA的精华主题

TA的得分主题

发表于 2024-9-15 11:08 | 显示全部楼层
  1. Sub test()
  2.     Dim r%, i%, m%
  3.     Dim arr, brr, zrr()
  4.     With Worksheets("题目")
  5.         r = .Cells(.Rows.Count, 1).End(xlUp).Row
  6.         arr = .Range("a2:a" & r)
  7.         ReDim brr(1 To UBound(arr), 1 To 1)
  8.         For i = 1 To UBound(arr)
  9.             xm = Split(arr(i, 1), ",")
  10.             m = 1
  11.             ReDim zrr(1 To m)
  12.             zrr(m) = Array(0, 0, -1)
  13.             For j = 1 To UBound(xm)
  14.                 If Val(xm(j)) = Val(xm(j - 1)) + 1 Then
  15.                     If zrr(m)(2) = -1 Or zrr(m)(2) = 1 Then
  16.                         zrr(m)(1) = j
  17.                         zrr(m)(2) = 1
  18.                     Else
  19.                         m = m + 1
  20.                         ReDim Preserve zrr(1 To m)
  21.                         zrr(m) = Array(j, j, -1)
  22.                     End If
  23.                 ElseIf Val(xm(j)) = Val(xm(j - 1)) + 2 Then
  24.                     If zrr(m)(2) = -1 Or zrr(m)(2) = 2 Then
  25.                         zrr(m)(1) = j
  26.                         zrr(m)(2) = 2
  27.                     Else
  28.                         m = m + 1
  29.                         ReDim Preserve zrr(1 To m)
  30.                         zrr(m) = Array(j, j, -1)
  31.                     End If
  32.                 Else
  33.                     m = m + 1
  34.                     ReDim Preserve zrr(1 To m)
  35.                     zrr(m) = Array(j, j, -1)
  36.                 End If
  37.             Next
  38.             For k = 1 To UBound(zrr)
  39.                 If zrr(k)(0) = zrr(k)(1) Then
  40.                     brr(i, 1) = brr(i, 1) & "," & xm(zrr(k)(0))
  41.                 Else
  42.                     If zrr(k)(2) = 1 Then
  43.                         brr(i, 1) = brr(i, 1) & "," & xm(zrr(k)(0)) & "-" & xm(zrr(k)(1))
  44.                     Else
  45.                         If xm(zrr(k)(0)) Mod 2 = 1 Then
  46.                             brr(i, 1) = brr(i, 1) & "," & xm(zrr(k)(0)) & "-" & xm(zrr(k)(1)) & "(单)"
  47.                         Else
  48.                             brr(i, 1) = brr(i, 1) & "," & xm(zrr(k)(0)) & "-" & xm(zrr(k)(1)) & "(双)"
  49.                         End If
  50.                     End If
  51.                 End If
  52.             Next
  53.         Next
  54.         For i = 1 To UBound(brr)
  55.             If brr(i, 1) <> Empty Then
  56.                 brr(i, 1) = Mid(brr(i, 1), 2)
  57.             End If
  58.         Next
  59.         .Range("c2").Resize(UBound(brr), 1) = brr
  60.     End With
  61. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-9-15 11:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
详见附件。

压缩连续数(含单双).rar

17.96 KB, 下载次数: 5

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-15 13:02 | 显示全部楼层
Option Explicit
Sub TEST1()
    Dim ar, br, cr, i&, j&
   
    ar = [A1].CurrentRegion.Value
    For i = 2 To UBound(ar)
        br = Split(ar(i, 1), ",")
        ReDim cr(0 To UBound(br))
        For j = 0 To UBound(br)
            cr(j) = br(j)
        Next j
        br = JoinConsecutiveNums(cr, "-")
        ar(i, 3) = Join(br, ",")
    Next i
   
    [A11].Resize(UBound(ar), UBound(ar, 2)) = ar
    Beep
End Sub
Function JoinConsecutiveNums(ar, strSymbol$) As Variant
    Dim br(), cr, iStart&, i&, r&
   
    ReDim Preserve ar(LBound(ar) To UBound(ar) + 1)
    iStart = ar(LBound(ar))
    For i = LBound(ar) + 1 To UBound(ar)
       If ar(i) - ar(i - 1) <> 1 Then
          r = r + 1
          ReDim Preserve br(1 To r)
          br(r) = iStart & strSymbol & ar(i - 1)
          iStart = ar(i)
       End If
    Next i
    For i = 1 To UBound(br)
        cr = Split(br(i), strSymbol)
        If cr(0) = cr(1) Then br(i) = cr(0)
    Next i
    JoinConsecutiveNums = br
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-15 13:08 | 显示全部楼层
参与一下。。。

【练习小题】压缩连续数.rar

16.58 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2024-9-15 13:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
用PQ 解决。。。。。


PQ难道不香么??????????

数据增减修改,能自动刷 新 结果 。
捕获.JPG
捕获2.JPG

9-15-1.rar

16.07 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-15 14:09 | 显示全部楼层
WPS里的JSA练习一下——


微信截图_20240915140732.png


240915_压缩连续数(含单双).rar

11.2 KB, 下载次数: 5

用WPS打开并启用宏

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-9-15 19:11 | 显示全部楼层
本帖最后由 笨鸟飞不高 于 2024-9-17 16:36 编辑

压缩连续数(含单双).rar (17.4 KB, 下载次数: 2)

修改一下!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-16 09:21 | 显示全部楼层
本帖最后由 高个子 于 2024-9-22 20:36 编辑

统一回复:感谢各位解答
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 01:32 , Processed in 0.045911 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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