ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > Excel VBA > 简缩码转全码,复杂的字符串整合方式

简缩码转全码,复杂的字符串整合方式

作者:绿色风 分类: 时间:2022-08-17 浏览:125
楼主
kevinchengcw
如何将缩写后的代码展开成全部的编码,本例为您提供一个示范,代码讲解如下:
  1. Sub test()
  2. Dim Arr1, Arr2, Arr3, Arr4, ArrT
  3. Dim M, N, I, T, A, B, C As Integer
  4. Dim Str, Result As String
  5. For M = 2 To [c65536].End(3).Row  '取得数据循环行号范围
  6.     Result = ""    '初始化并清空结果字符串
  7.     If InStr(Cells(M, 3).Value, "),") > 0 Then  '判断是否有多段文字的特征存在
  8.         Str = Replace(Cells(M, 3).Value, "),", ")" & vbTab)  '在多段特征文字的,号替换成Tab字符便于拆分
  9.         Arr1 = Split(Str, vbTab)  '将拆分放入数组Arr1里
  10.     Else
  11.         ReDim Arr1(0 To 0)  '如果不存在多段则重定义数组Arr1为一个成员的数组,防止出错
  12.         Arr1(0) = Cells(M, 3).Value  '赋值
  13.     End If
  14.     For N = LBound(Arr1) To UBound(Arr1)  '循环处理数组Arr1里的数据
  15.         Str = Replace(Arr1(N), "(", vbTab)   '利用左括号来拆分数据
  16.         Str = Replace(Str, ")", "")    '清除右括号
  17.         Do While InStr(Str, vbTab & vbTab) > 0   '清除连续两个以上的tab字符,以防止拆分时出现空白字符成员
  18.             Str = Replace(Str, vbTab & vbTab, vbTab)
  19.         Loop
  20.         Arr2 = Split(Str, vbTab)   '利用tab字符拆分字符串放到数组Arr2里
  21.         Str = ""
  22.         If UBound(Arr2) >= 1 Then   '如果数组Arr2里存在两个以上的成员,则            
  23.              If InStr(Arr2(1), "-") > 0 And InStr(Arr2(1), ",") > 0 Then   '判断是否存在即有个体又有区间序列存在的情况
  24.                 ArrT = Split(Arr2(1), ",")    '先以逗号处理个体,这样将出现个体与区间并存于数组ArrT里
  25.                 If IsNumeric(Left(ArrT(0), 1)) Then   '判断数组的第一个成员的第一个字符是否为数值
  26.                     For I = LBound(ArrT) To UBound(ArrT)   '循环处理数组ArrT里的各个成员
  27.                         If InStr(ArrT(I), "-") > 0 Then   '如果当前成员含有“-”字符,说明是区间序列,则
  28.                             For T = Val(Split(ArrT(I), "-")(0)) To Val(Split(ArrT(I), "-")(1))   '因前面已判断为数字,则利用“-”拆分成起始及终止两个数值,并利用循环连接到字符串Str
  29.                                 If Str = "" Then
  30.                                     Str = T
  31.                                 Else
  32.                                     Str = Str & "," & T
  33.                                 End If
  34.                             Next T
  35.                         Else   '对不是区间序列的直接连接
  36.                             If Str = "" Then
  37.                                 Str = ArrT(I)
  38.                             Else
  39.                                 Str = Str & "," & ArrT(I)
  40.                             End If
  41.                         End If
  42.                     Next I
  43.                     Arr3 = Split(Str, ",")   '最后利用逗号分割字符串并放入数组Arr3
  44.                 Else
  45.                     For I = LBound(ArrT) To UBound(ArrT)   
  46.                         For T = Asc(UCase(ArrT(0))) To Asc(UCase(ArrT(1)))    '对不是数值的成员,将其字符全部大写,然后取其字符值区间进行循环,并利用chr()函数转换成对应字符进行连接
  47.                             If Str = "" Then
  48.                                 Str = Chr(T)
  49.                             Else
  50.                                 Str = Str & "," & Chr(T)
  51.                             End If
  52.                         Next T
  53.                     Next I
  54.                     Arr3 = Split(Str, ",")
  55.                 End If
  56.             ElseIf InStr(Arr2(1), "-") > 0 Then  '处理只有区间序列的情况
  57.                 ArrT = Split(Arr2(1), ",")
  58.                 If IsNumeric(Left(Split(Arr2(1), "-")(0), 1)) Then
  59.                     For I = LBound(ArrT) To UBound(ArrT)
  60.                         For T = Val(Split(ArrT(I), "-")(0)) To Val(Split(ArrT(I), "-")(1))
  61.                             If Str = "" Then
  62.                                 Str = T
  63.                             Else
  64.                                 Str = Str & "," & T
  65.                             End If
  66.                         Next T
  67.                     Next I
  68.                     Arr3 = Split(Str, ",")
  69.                 Else   '其他情况的处理
  70.                     For I = LBound(ArrT) To UBound(ArrT)
  71.                         If InStr(ArrT(I), "-") > 0 Then
  72.                             For T = Asc(UCase(Split(ArrT(I), "-")(0))) To Asc(UCase(Split(ArrT(I), "-")(1)))
  73.                                 If Str = "" Then
  74.                                     Str = Chr(T)
  75.                                 Else
  76.                                     Str = Str & "," & Chr(T)
  77.                                 End If
  78.                             Next T
  79.                         Else
  80.                             If Str = "" Then
  81.                                 Str = ArrT(I)
  82.                             Else
  83.                                 Str = Str & "," & ArrT(I)
  84.                             End If
  85.                         End If
  86.                     Next I
  87.                     Arr3 = Split(Str, ",")
  88.                 End If
  89.             Else
  90.                 Arr3 = Split(Arr2(1), ",")
  91.             End If
  92.         End If
  93.         Select Case UBound(Arr2)  '生成结果前判断数组的成员数
  94.             Case Is = 2  '有三个成员的,先处理第三个成员
  95.                 If InStr(Arr2(2), "-") Then
  96.                     Str = ""
  97.                     For I = Asc(UCase(Split(Arr2(2), "-")(0))) To Asc(UCase(Split(Arr2(2), "-")(1)))
  98.                         If Str = "" Then
  99.                             Str = Chr(I)
  100.                         Else
  101.                             Str = Str & "," & Chr(I)
  102.                         End If
  103.                     Next I
  104.                     Arr4 = Split(Str, ",")
  105.                 Else
  106.                     Arr4 = Split(Arr2(2), ",")
  107.                 End If
  108.                      For B = LBound(Arr3) To UBound(Arr3)
  109.                         For C = LBound(Arr4) To UBound(Arr4)
  110.                             If Result = "" Then
  111.                                 Result = Arr2(0) & Arr3(B) & Arr4(C)   '对取得的结果循环连接得到结果字符串
  112.                             Else
  113.                                 Result = Result & "," & Arr2(0) & Arr3(B) & Arr4(C)
  114.                             End If
  115.                         Next C
  116.                     Next B
  117.             Case Is = 1   '两个成员时因都已处理完成,直接连接
  118.                     For B = LBound(Arr3) To UBound(Arr3)
  119.                         If Result = "" Then
  120.                             Result = Arr2(0) & Arr3(B)
  121.                         Else
  122.                             Result = Result & "," & Arr2(0) & Arr3(B)
  123.                         End If
  124.                     Next B
  125.             Case Else
  126.                 Result = Arr1(0)  '一个成员时直接等于原值
  127.         End Select
  128.     Next N  '循环到数组下一成员
  129.     Cells(M, 7) = Result   '将结果写入单元格
  130. Next M  '处理下一单元格
  131. End Sub
转换效果如下(红色为源码,绿色为扩展后的编码):
R(13,22,23,25,27,62),R(85,86,88)(A-C)
R13,R22,R23,R25,R27,R62,R85A,R85B,R85C,R86A,R86B,R86C,R88A,R88B,R88C

C(6-9,29,34,36,37,42),CX(2-5,10-13,18-20,1A-1F,Y2),CX22(A,C,E,G),CX25(A-L),C71(A-C),CX(8,27)(A,B),CX(28,29,30)(A-E),CX35(A-C)
C6,C7,C8,C9,C29,C34,C36,C37,C42,CX2,CX3,CX4,CX5,CX10,CX11,CX12,CX13,CX18,CX19,CX20,CX1,CXY2,CX22A,CX22C,CX22E,CX22G,CX25A,CX25B,CX25C,CX25D,CX25E,CX25F,CX25G,CX25H,CX25I,CX25J,CX25K,CX25L,C71A,C71B,C71C,CX8A,CX8B,CX27A,CX27B,CX28A,CX28B,CX28C,CX28D,CX28E,CX29A,CX29B,CX29C,CX29D,CX29E,CX30A,CX30B,CX30C,CX30D,CX30E,CX35A,CX35B,CX35C


综上,所用方法类似于所写的VBA解释器中的断句方法,具体内容请参见附件
整理BOM.rar
2楼
wnianzhong
学习了,谢谢!
3楼
wangqilong1980
无论如何也要顶一下喽,收了好好用。
4楼
lisan
字典要有很强的逻辑性。
5楼
wise

学习
6楼
海洋之星
学习了,谢谢!

免责声明

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

评论列表
sitemap