ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 将系列码转换成简缩码的一个示例

将系列码转换成简缩码的一个示例

作者:绿色风 分类: 时间:2022-08-18 浏览:63
楼主
kevinchengcw
对于下面左侧的这种成序列的数字组合,如何将其转换成右侧上方或下方的效果,下面的代码将给予解释,着注要理解的是思路,也许您还能将其简化一下:

         
 
代码如下:
  1. Sub test()
  2. Dim M, N, I As Long
  3. Dim Str, Tmp, Result As String
  4. Dim Arr
  5. With ActiveSheet  '先排个序,这样才能从小到大集中不同的字段到一起
  6.     .Sort.SortFields.Clear
  7.     .Sort.SortFields.Add Key:=Range("A1:A" & .Cells(.Rows.Count, 1).End(3).Row) _
  8.         , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  9.     .Sort.SortFields.Add Key:=Range("B1:B" & .Cells(.Rows.Count, 1).End(3).Row) _
  10.         , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
  11.     With .Sort
  12.         I = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(3).Row
  13.         .SetRange ActiveSheet.Range("A1:B" & I)
  14.         .Header = xlGuess
  15.         .MatchCase = False
  16.         .Orientation = xlTopToBottom
  17.         .SortMethod = xlPinYin
  18.         .Apply
  19.     End With
  20.     M = 1   '设定起始的行号
  21.     Do   '开始循环
  22.         Str = ""   '串接用字符串置为空值
  23.         I = WorksheetFunction.CountIf(Columns(1), .Cells(M, 1).Value)   '判断A列当前行的值一会有几个
  24.         If I > 1 Then   '如果不止一个,则执行下面操作
  25.             Str = .Cells(M, 2).Value   '字符串等于B列当前行的值
  26.             For N = M + 1 To M + I - 1   '循环当前行的下一行到与A列当前行值相同的行的最后一行
  27.                 If .Cells(N, 2).Value - .Cells(N, 2).Offset(-1, 0).Value = 1 Then  '如果循环时的当前行的值与上一行的差为1,则
  28.                     If N <> M + I - 1 Then   '如果当前行不是最后一行
  29.                         Str = Str & "-"  '则字符串后串接一个连接号
  30.                     Else   '否则
  31.                         Str = Str & "-" & .Cells(N, 2).Value   '串接一个连接号后再接上当前行的值
  32.                     End If
  33.                 Else  '如果当前行与上一行的值的差不是1
  34.                     Str = Str & "-" & .Cells(N, 2).Offset(-1, 0).Value & "," & .Cells(N, 2).Value  '则串接上连接符与上一行的值及逗号加当前行的值
  35.                 End If
  36.             Next N
  37.         Else   '如果当前行的A列值在整个序列中只有一个,则
  38.             Str = .Cells(M, 2).Value  '直接等于当前行B列的值
  39.         End If
  40.         '下面是后期处理得到的字符串
  41.         Do While InStr(Str, "--") > 0   '首先将两个以上相连的"--"变成"-"
  42.             Str = Replace(Str, "--", "-")
  43.         Loop
  44.         If InStr(Str, ",") > 0 Or InStr(Str, "-") > 0 Then  '判断是否含有","或"-"
  45.             Arr = Split(Str, ",")   '以逗号分割放入数组
  46.             For N = LBound(Arr) To UBound(Arr)  '循环将字符串中的用"-"相连前后一样数值的项的后段替换为空
  47.                 Str = Replace(Str, "-" & Split(Arr(N), "-")(0), "")
  48.             Next N
  49.             For N = LBound(Arr) To UBound(Arr)   '循环将字符串中"-"后面与前面相同的8位替换为空,为防止将前面的替换了,用前面连接了"-"来表明是后面的
  50.                 Str = Replace(Str, "-" & Left(Arr(N), 8), "-")
  51.             Next N
  52.             Arr = Split(Str, ",")  '重新将替换后的字符串拆分后放入数组中
  53.             Tmp = ""   '将临时用于转换的字符串置为空
  54.             Result = ""   '用于存储结果的字符串也置为空
  55.             For N = LBound(Arr) To UBound(Arr)   '循环新的数组内容
  56.                 If Tmp = "" Or Tmp <> Left(Arr(N), 8) Then   '如果临时字符串为空(开始时)或不等于数组当前项的前8位(数字差较大跳跃时),则
  57.                     Tmp = Left(Arr(N), 8)   '将当前项的前8位赋值给数组
  58.                     Result = Result & ";" & Arr(N)  '将当前数用分号分隔与结果字串相连接
  59.                 Else   '否则
  60.                     Arr(N) = Replace(Arr(N), Tmp, "")  '将前8位替换为空
  61.                     Result = Result & "," & Arr(N)   '将当前数用逗号分隔与结果字串相连接
  62.                 End If
  63.             Next N
  64.             Result = Right(Result, Len(Result) - 1)    '去掉左面的分号
  65.         Else
  66.             Result = .Cells(M, 2).Value  '如果没有","或"-",说明是唯一一个数,直接赋值给结果字符串
  67.         End If
  68.         .Cells(.Rows.Count, 4).End(3).Offset(1, 0) = .Cells(M, 1).Value   '写到相应的单元格位置
  69.         .Cells(.Rows.Count, 4).End(3).Offset(0, 1) = Result
  70.         M = M + I   '跳到下一个A列不同内容的第一行
  71.     Loop While M < .Cells(.Rows.Count, 1).End(3).Row  '如果跳过后超出了最后一行的范围则结束循环
  72. End With
  73. End Sub


附示例文件.
全码变简缩码.rar
2楼
rongjun
学习K版代码
3楼
Dream-SU
来顶下,怎么现在软件好多可以用二次开发了

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap