Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2055|回复: 5

[已解决]对单元格的内容进行拆分然后和前两列内容相应对齐

[复制链接]
发表于 2013-1-28 17:51 | 显示全部楼层 |阅读模式
要求在表格里面有说明,麻烦高手看一下能不能解决啊 提取单元格的数据并对其.rar (49.6 KB, 下载次数: 19)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-1-28 18:51 | 显示全部楼层
  1. Sub 数据整理()
  2.     Dim arr, iRow&, i&, j As Byte
  3.     Dim Record&, Temp, Tempstr$
  4.     Dim arrResult()
  5.     Dim reg As Object
  6.     Dim t#
  7.     t = Timer
  8.     iRow = Cells(Rows.Count, 1).End(xlUp).Row
  9.     arr = Range("a1:c" & iRow)
  10.     Record = 1
  11.     Application.ScreenUpdating = False
  12.     ReDim arrResult(1 To 3, 1 To 1)
  13.     For i = 1 To 3
  14.         arrResult(i, 1) = arr(1, i)
  15.     Next

  16.     Set reg = CreateObject("VBScript.regExp")
  17.     With reg
  18.         .Global = True
  19.         .Pattern = "\,?\d+\."

  20.         For i = LBound(arr) + 1 To UBound(arr)
  21.             Tempstr = Replace(arr(i, 3), "1.", "")
  22.             Tempstr = Replace(Tempstr, " ", "")
  23.             Tempstr = Replace(Tempstr, vbLf, "")
  24.             If .test(Tempstr) Then
  25.                 Temp = Split(.Replace(Tempstr, ","), ",")
  26.                 For j = LBound(Temp) To UBound(Temp)
  27.                     Record = Record + 1
  28.                     ReDim Preserve arrResult(1 To 3, 1 To Record)
  29.                     arrResult(1, Record) = arr(i, 1)
  30.                     arrResult(2, Record) = arr(i, 2)
  31.                     arrResult(3, Record) = Temp(j)
  32.                 Next
  33.             Else
  34.                 If Len(Tempstr) = 0 Then
  35.                     Record = Record + 1
  36.                     ReDim Preserve arrResult(1 To 3, 1 To Record)
  37.                     arrResult(1, Record) = arr(i, 1)
  38.                     arrResult(2, Record) = arr(i, 2)
  39.                     arrResult(3, Record) = arr(i, 3)
  40.                 Else

  41.                     Temp = Split(Tempstr, ",")
  42.                     For j = LBound(Temp) To UBound(Temp)
  43.                         Record = Record + 1
  44.                         ReDim Preserve arrResult(1 To 3, 1 To Record)
  45.                         arrResult(1, Record) = arr(i, 1)
  46.                         arrResult(2, Record) = arr(i, 2)
  47.                         arrResult(3, Record) = Temp(j)
  48.                     Next

  49.                 End If
  50.             End If
  51.         Next
  52.     End With
  53.     Worksheets.Add
  54.     Range("a1").Resize(Record, 3) = WorksheetFunction.Transpose(arrResult)
  55.     With Columns("a:c")
  56.         .HorizontalAlignment = xlLeft
  57.         .AutoFit
  58.     End With
  59.     Application.ScreenUpdating = True
  60.     t = Timer - t
  61.     MsgBox "转化完成, 用时一共 " & t & "秒"
  62. End Sub
复制代码

评分

参与人数 1 +20 金币 +20 收起 理由
cbg2008 + 20 + 20 很给力!

查看全部评分

回复

使用道具 举报

发表于 2013-1-28 19:02 | 显示全部楼层    本楼为最佳答案   
  1. Option Explicit

  2. Sub 数据整理()
  3.     Dim arr, iRow&, i&, j As Byte
  4.     Dim Record&, Temp, Tempstr$
  5.     Dim arrResult()
  6.     Dim reg As Object
  7.     Dim t#
  8.     t = Timer
  9.     iRow = Cells(Rows.Count, 1).End(xlUp).Row
  10.     arr = Range("a1:c" & iRow)
  11.     Record = 1
  12.     Application.ScreenUpdating = False
  13.     ReDim arrResult(1 To 3, 1 To 1)
  14.     For i = 1 To 3
  15.         arrResult(i, 1) = arr(1, i)
  16.     Next

  17.     Set reg = CreateObject("VBScript.regExp")
  18.     With reg
  19.         .Global = True
  20.         .Pattern = "\,?\d+?\.?"

  21.         For i = LBound(arr) + 1 To UBound(arr)
  22.             Tempstr = StrConv(Replace(arr(i, 3), "1.", ""), vbNarrow)
  23.             Tempstr = Replace(Tempstr, " ", "")
  24.             Tempstr = Replace(Tempstr, vbLf, "")
  25.             Tempstr = Replace(Tempstr, ";", ",")
  26.             Tempstr = Replace(Tempstr, "?", ",")
  27.             
  28.             If .test(Tempstr) Then
  29.                 Temp = Split(.Replace(Tempstr, ","), ",")
  30.                 For j = LBound(Temp) To UBound(Temp)
  31.                     Record = Record + 1
  32.                     ReDim Preserve arrResult(1 To 3, 1 To Record)
  33.                     arrResult(1, Record) = arr(i, 1)
  34.                     arrResult(2, Record) = arr(i, 2)
  35.                     arrResult(3, Record) = Temp(j)
  36.                 Next
  37.             Else
  38.                 If Len(Tempstr) = 0 Then
  39.                     Record = Record + 1
  40.                     ReDim Preserve arrResult(1 To 3, 1 To Record)
  41.                     arrResult(1, Record) = arr(i, 1)
  42.                     arrResult(2, Record) = arr(i, 2)
  43.                     arrResult(3, Record) = arr(i, 3)
  44.                 Else

  45.                     Temp = Split(Tempstr, ",")
  46.                     For j = LBound(Temp) To UBound(Temp)
  47.                         Record = Record + 1
  48.                         ReDim Preserve arrResult(1 To 3, 1 To Record)
  49.                         arrResult(1, Record) = arr(i, 1)
  50.                         arrResult(2, Record) = arr(i, 2)
  51.                         arrResult(3, Record) = Temp(j)
  52.                     Next

  53.                 End If
  54.             End If
  55.         Next
  56.     End With
  57.     Worksheets.Add
  58.     Range("a1").Resize(Record, 3) = WorksheetFunction.Transpose(arrResult)
  59.     With Columns("a:c")
  60.         .HorizontalAlignment = xlLeft
  61.         .AutoFit
  62.     End With
  63.     Application.ScreenUpdating = True
  64.     t = Timer - t
  65.     MsgBox "转化完成, 用时一共 " & t & "秒"
  66. End Sub
复制代码
能做出这个表的,绝对是人才。

评分

参与人数 2 +7 收起 理由
wfykhgmqtdh + 1 非常感谢您的帮助,很给力
hoogle + 6 写代码的这位是人才!

查看全部评分

回复

使用道具 举报

发表于 2013-1-28 21:20 | 显示全部楼层
  1. Sub hoogle()
  2. Sheets("原表").Select
  3. Dim arr, i, j, regex, Sr, Temp, m, Result(1 To 60000, 1 To 3)
  4. Set regex = CreateObject("VBScript.RegExp")
  5. arr = Range("a2:c" & Range("a65536").End(3).Row)
  6. For i = 1 To UBound(arr)
  7.     Sr = arr(i, 3)
  8.     If InStr(arr(i, 3), ".") Or InStr(arr(i, 3), ",") Or InStr(arr(i, 3), ",") Then
  9.     With regex
  10.         .Global = True
  11.         .Pattern = "[\u4e00-\u9fa5A-z\(-\)\(-\)\s1-999999]+"
  12.          Set Temp = .Execute(Sr)
  13.             For Each m In Temp
  14.               If Asc(Right(m, 1)) >= 48 And Asc(Right(m, 1)) <= 57 Then m = Left(m, Len(m) - 1)
  15.               If Len(m) > 1 Then
  16.                 j = j + 1
  17.                 Result(j, 1) = arr(i, 1): Result(j, 2) = arr(i, 2): Result(j, 3) = m
  18.               End If
  19.             Next m
  20.     End With
  21.     Else
  22.     With regex
  23.         .Global = True
  24.         .Pattern = "[\u4e00-\u9fa5A-z\(-\)\(-\)\s]+"
  25.          Set Temp = .Execute(Sr)
  26.             For Each m In Temp
  27.               If Asc(Right(m, 1)) >= 48 And Asc(Right(m, 1)) <= 57 Then m = Left(m, Len(m) - 1)
  28.               If Len(m) > 1 Then
  29.                 j = j + 1
  30.                 Result(j, 1) = arr(i, 1): Result(j, 2) = arr(i, 2): Result(j, 3) = m
  31.               End If
  32.             Next m
  33.     End With
  34.     End If
  35. Next
  36. Sheets.Add
  37. Range("a1").Resize(60000, 3) = Result
  38. End Sub
复制代码
回复

使用道具 举报

发表于 2013-1-28 21:25 | 显示全部楼层
提取单元格的数据并对其-hoogle.zip (64.41 KB, 下载次数: 7)

评分

参与人数 1 +1 收起 理由
wfykhgmqtdh + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-1-31 20:35 | 显示全部楼层
hoogle 发表于 2013-1-28 21:25
按附件按钮即可,情况太多,没考虑完全,楼主看下现在的答案是否会有帮助?

非常感谢您的帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 04:19 , Processed in 0.372816 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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