Excel精英培训网

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

[已解决]历遍工作表用代码拆分数据重新组合的问题

[复制链接]
发表于 2013-5-22 08:32 | 显示全部楼层 |阅读模式
附件 拆分数据附件.rar (245.18 KB, 下载次数: 26)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-5-22 09:38 | 显示全部楼层
  1. Sub 重新组合()
  2.     Dim lWorksheet As Long
  3.     Dim arr, arrNew
  4.     Dim lLastRow&
  5.     Dim rg As Range
  6.     Dim t#
  7.     t = Timer
  8.     Application.ScreenUpdating = False
  9.     For lWorksheet = 2 To Worksheets.Count
  10.         With Worksheets(lWorksheet)
  11.             lLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
  12.             Set rg = .Range(.[a1], .Cells(lLastRow, 55))
  13.             arr = rg.Value
  14.             arrNew = arrCombine(arr)
  15.             rg.ClearContents
  16.             .Range("a1").Resize(UBound(arrNew), UBound(arrNew, 2)).Value = arrNew
  17.         End With
  18.     Next
  19.     Application.ScreenUpdating = True
  20.     t = Timer - t
  21.     MsgBox "组合完成" & vbCrLf & _
  22.             "一共用时 " & t & " 秒", vbInformation + vbOKOnly
  23. End Sub

  24. Function arrCombine(arr)
  25.     Dim i As Long, j As Long, k As Long
  26.     'Dim arrNew(1 To 10000, 1 To 55)
  27.     Dim arrNew()
  28.     Dim lArrL&, lArrU&, lArrU2&, lCount&
  29.     Dim btCon As Byte
  30.     lArrL = LBound(arr)
  31.     lArrU = UBound(arr)
  32.     ReDim arrNew(1 To (lArrU ^ 2 - lArrU) / 2 * 3, 1 To 55)
  33.     lArrU2 = UBound(arr, 2)
  34.     For i = lArrL To lArrU
  35.         For j = i + 1 To lArrU
  36.             lCount = lCount + 1
  37.             For k = 1 To lArrU2
  38.                 arrNew(lCount, k) = arr(i, k)
  39.             Next
  40.             lCount = lCount + 1
  41.             For k = 1 To lArrU2
  42.                 arrNew(lCount, k) = arr(j, k)
  43.             Next
  44.             lCount = lCount + 1
  45.         Next
  46.     Next
  47.     arrCombine = arrNew
  48. End Function
复制代码
回复

使用道具 举报

发表于 2013-5-22 09:38 | 显示全部楼层
你现有的表,在我电脑上是40-60秒,中间运行的时候,可能没有反应,也不要管他。
回复

使用道具 举报

发表于 2013-5-22 09:43 | 显示全部楼层    本楼为最佳答案   
  1. Sub 重新组合()
  2.     Dim lWorksheet As Long
  3.     Dim arr, arrNew
  4.     Dim lLastRow&
  5.     Dim rg As Range
  6.     Dim t#
  7.     t = Timer
  8.     On Error GoTo ErrorHandler
  9.     Application.ScreenUpdating = False
  10.     Application.Calculation = xlCalculationManual
  11.     Application.EnableEvents = False

  12.     For lWorksheet = 2 To Worksheets.Count
  13.         With Worksheets(lWorksheet)
  14.             lLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
  15.             Set rg = .Range(.[a1], .Cells(lLastRow, 55))
  16.             arr = rg.Value
  17.             arrNew = arrCombine(arr)
  18.             If IsArray(arrNew) Then
  19.                 rg.ClearContents
  20.                 .Range("a1").Resize(UBound(arrNew), UBound(arrNew, 2)).Value = arrNew
  21.             End If
  22.         End With
  23.     Next
  24.    
  25.     Application.ScreenUpdating = True
  26.     Application.Calculation = xlCalculationAutomatic
  27.     Application.EnableEvents = True

  28.     t = Timer - t
  29.     MsgBox "组合完成" & vbCrLf & _
  30.            "一共用时 " & t & " 秒", vbInformation + vbOKOnly
  31.     Exit Sub

  32. ErrorHandler:
  33.     MsgBox Err.Number & vbCrLf & _
  34.            Err.Description
  35. End Sub

  36. Function arrCombine(arr)


  37.     Dim i As Byte, j As Byte, k As Integer
  38.     'Dim arrNew(1 To 10000, 1 To 55)
  39.     Dim arrNew()
  40.     Dim lArrL&, lArrU&, lArrU2&, lCount&

  41.     On Error GoTo ErrorHandler

  42.     lArrL = LBound(arr)
  43.     lArrU = UBound(arr)
  44.     ReDim arrNew(1 To (lArrU ^ 2 - lArrU) / 2 * 3, 1 To 55)
  45.     lArrU2 = UBound(arr, 2)
  46.     For i = lArrL To lArrU
  47.         For j = i + 1 To lArrU
  48.             lCount = lCount + 1
  49.             For k = 1 To lArrU2
  50.                 arrNew(lCount, k) = arr(i, k)
  51.             Next
  52.             lCount = lCount + 1
  53.             For k = 1 To lArrU2
  54.                 arrNew(lCount, k) = arr(j, k)
  55.             Next
  56.             lCount = lCount + 1
  57.         Next
  58.     Next
  59.     arrCombine = arrNew
  60.     Exit Function

  61. ErrorHandler:
  62.     MsgBox Err.Number & vbCrLf & _
  63.            Err.Description
  64.     Err.Clear
  65.     arrCombine = ""
  66. End Function
复制代码

评分

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

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-5-22 10:24 | 显示全部楼层
hwc2ycy 发表于 2013-5-22 09:43

谢谢老师帮助。再谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 17:48 , Processed in 0.398520 second(s), 18 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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