ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 如何将复杂的合并数据区域依特征还原成数据表

如何将复杂的合并数据区域依特征还原成数据表

作者:绿色风 分类: 时间:2022-08-18 浏览:96
楼主
kevinchengcw
本例引用一个合并了数据行的数据区,依据数据特征将其还原成数据表,代码如下:
  1. Sub test()
  2. Dim M, N, I, T As Long
  3. Dim Arr, Arr2, Arr3
  4. Dim Str, BB As String
  5. Application.ScreenUpdating = False  '关闭屏幕刷新
  6. For M = Cells(Rows.Count, 1).End(3).Row To 2 Step -1  '因为要删除无意义的行,所以我们从后向前来
  7.     Str = ""  '处理每行前清空用于记录公司名的字符串变量
  8.     BB = ""  '清空用于记录币种的变量
  9.     Cells(M, 1) = WorksheetFunction.Trim(Cells(M, 1))  '将单元格内容用工作表函数去除多余空格
  10.     If Len(Cells(M, 1).Value) < 20 Or Cells(M, 1) = "" Or InStr(Cells(M, 1).Value, "小計") > 0 Or InStr(Cells(M, 1).Value, "欠") > 0 Or InStr(Cells(M, 1).Value, "天") > 0 Or InStr(Cells(M, 1).Value, "Total") > 0 Then
  11.         Rows(M).Delete  '根据特征字符删除无意义行
  12.     Else  '如果没有特征字符的行则进行正常处理
  13.         If InStr(Cells(M, 1).Value, "USD") > 0 Then BB = " USD "  '判断并记录币种
  14.         If InStr(Cells(M, 1).Value, "EUR") > 0 Then BB = " EUR "
  15.         If InStr(Cells(M, 1).Value, "RMB") > 0 Then BB = " RMB "
  16.         Arr = Split(Cells(M, 1).Value, BB)  '以币种为分隔符分隔成前后两个段放入数组,主要因为币种的列固定,而前面的列不固定
  17.         Arr2 = Split(Arr(0), " ")  '前面的数据段依空格分割放入数组2
  18.         Arr3 = Split(Arr(1), " ")  '后面的数据段依空格分割放入数组3
  19.         I = 2  '设定前面段写入数据的起始列号值,不设成1是因为有些行没有公司名,而公司名要放到A列里
  20.         For N = LBound(Arr2) To UBound(Arr2)   '循环前段数据区的数组各个值
  21.             If Not (IsNumeric(Right(Arr2(N), 1)) Or IsNumeric(Left(Arr2(N), 1))) Then  '如果数组当前值和第一位和最后一位都不是数字(非傳票號碼,客戶PO/NO,訂單號的特征)
  22.                 Do While Not (IsNumeric(Right(Arr2(N), 1)) Or IsNumeric(Left(Arr2(N), 1)))  '一直循环到是为止
  23.                     Str = Str & " " & Arr2(N)  '循环中不停将不是的值用空格分隔串接给变量str(这个就是公司名了)
  24.                     N = N + 1  'N值递增
  25.                 Loop
  26.             End If
  27.             Cells(M, I) = Arr2(N)  '将符合条件的数组值写入对应单元格
  28.             I = I + 1 '写好后移到下一列
  29.         Next N
  30.         Cells(M, 1) = Str  '第一个单元格的值等于公司名字串记录到的内容(可能是空值)
  31.         Cells(M, 5) = Trim(BB) '固定的币种列里写入记录的当前行的币种
  32.         I = 6 '重新设定后面数据段的起始写入列值
  33.         For N = LBound(Arr3) To UBound(Arr3)  '循环后一个数据段的内容
  34.             Cells(M, I) = Arr3(N)  '写入对应单元格
  35.             I = I + 1  '后移一列
  36.         Next N
  37.     End If
  38. Next M
  39. '设定标题行的数据内容
  40. Arr = Split("客戶,傳票號碼,客戶PO/NO,訂單號,幣別,未逾期欠款,逾期30天以內,31--60天,61--90天,91--180天,181天--1年,1年以上--2年,2年以上,欠款總額(原幣),欠款總額(原幣),**日,預計入款日", ",")
  41. For N = LBound(Arr) To UBound(Arr) '循环写入标题行内容并自动适应列宽
  42.     Cells(1, N + 1) = Arr(N)
  43.     Cells(1, N + 1).EntireColumn.AutoFit
  44. Next N
  45. Application.ScreenUpdating = True  '打开屏幕显示
  46. End Sub
公司名称无法完全还原是个遗憾,如果您有好的思路可于下方回复留言,如果切实可行我会加分。

帳齡分析表1_.rar
2楼
msampdoria
好复杂啊,暂时还看不明白,先顶

免责声明

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

评论列表
sitemap