Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: che_dream

[已解决]A,B,E,F,G,H,I列相临近相数据一样的自动合并,数据量大,求解。

[复制链接]
发表于 2012-10-5 14:07 | 显示全部楼层
多列合并工作簿1.rar (16.23 KB, 下载次数: 0)
回复

使用道具 举报

 楼主| 发表于 2012-10-5 14:20 | 显示全部楼层
hwc2ycy 发表于 2012-10-5 14:04
你这个表里前面有二行合并的,我帮你把合并的取消,还原数据的本来面目给你试试。

可以是可以,但 是当我的数据更新时候就会没有反应,现在这种情况不能增加新的数据,还有我想C列是数字列,我想和A,B列一样合并,而不是相同合并。谢谢。
回复

使用道具 举报

发表于 2012-10-5 14:34 | 显示全部楼层
  1. Sub aa()
  2. Dim x As Long
  3. Dim y As Long
  4. Dim z As Long
  5. r = Application.InputBox("请输入要操作的列号")
  6. t = Range(r & 1).Column
  7. q = Range(r & 65536).End(3).Row
  8. For x = 5 To q
  9. y = x + 1
  10. ks:
  11. If Cells(x, t) = Cells(y, t) And y <= q Then
  12. y = y + 1: GoTo ks
  13. Else: z = Cells(y, t).Row - 1
  14.   Range(Cells(x, t), Cells(z, t)).Select
  15.     With Selection
  16.         .HorizontalAlignment = xlCenter
  17.         .VerticalAlignment = xlCenter
  18.         .WrapText = False
  19.         .Orientation = 0
  20.         .AddIndent = False
  21.         .IndentLevel = 0
  22.         .ShrinkToFit = True
  23.         .ReadingOrder = xlContext
  24.         .MergeCells = False
  25.     End With
  26.     Selection.Merge
  27.    
  28.     End If
  29.     Next

  30. End Sub
复制代码
谁帮我的看看,有一个缺点是每次合并时都得确认下,如何克服?
回复

使用道具 举报

发表于 2012-10-5 14:40 | 显示全部楼层
che_dream 发表于 2012-10-5 14:20
可以是可以,但 是当我的数据更新时候就会没有反应,现在这种情况不能增加新的数据,还有我想C列是数字列 ...
  1. Sub 取消合并()
  2.     Dim rg As Range
  3.     Dim rg2 As Range
  4.     Dim irow As Long
  5.     irow = [d5].End(xlDown).Row
  6.     If Range("d" & irow).Value = "" Then Exit Sub
  7.     Set rg = Range(Cells(5, "a"), Cells(irow, "l"))
  8.     For Each rg2 In rg
  9.         If rg2.MergeCells Then
  10.             rg.UnMerge
  11.             rg.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
  12.             Exit For
  13.         End If
  14.     Next
  15. End Sub
复制代码
你导入新数据后,先运行这个过程,然后再合并,应该没有问题。
C列的数据呆会再帮你想想。
回复

使用道具 举报

发表于 2012-10-5 14:41 | 显示全部楼层
wp8680 发表于 2012-10-5 14:34
谁帮我的看看,有一个缺点是每次合并时都得确认下,如何克服?

Application.DisplayAlerts = False
回复

使用道具 举报

发表于 2012-10-5 14:45 | 显示全部楼层
其实合并之前做数据是否为空的判断就可以不用再改过程了。
回复

使用道具 举报

发表于 2012-10-5 14:48 | 显示全部楼层
这样改后,你追加了新数据,也不成问题。
  1. Sub 合并3()
  2.     Dim arr
  3.     Dim i As Long, j As Long, k As Long 'I代表列数组,J代表行,K代表列
  4.     Dim rg As Range     '合并RANGE
  5.     Dim iArr    '需要合并的列号
  6.     Dim irow    '数据行数
  7.     Application.ScreenUpdating = False
  8.     Application.DisplayAlerts = False
  9.     iArr = Array(1, 2, 5, 6, 7, 8, 9)
  10.     arr = Range("a5:i" & [d5].End(xlDown).Row).Value
  11.     irow = UBound(arr)
  12.     For i = 0 To UBound(iArr)
  13.         k = iArr(i)
  14.         For j = 1 To irow
  15.             If j = irow Then Exit For
  16.             Set rg = Cells(j + 4, k)        '行数据与数组中的行数相差为4
  17.             Do While arr(j, k) = arr(j + 1, k) And arr(j, k) <> ""
  18.                 j = j + 1
  19.                 If j = irow Then Exit Do
  20.             Loop
  21.             Set rg = Range(rg, Cells(j + 4, k))
  22.             rg.Merge
  23.         Next
  24.     Next
  25. End Sub
复制代码
回复

使用道具 举报

发表于 2012-10-5 15:30 | 显示全部楼层
好了,楼主测测,C列也按要求能合并,然后你新加的数据你也给测测。
我还理下思路,把代码再优化下。
  1. Sub 合并4()
  2.     Dim arr
  3.     Dim i As Long, j As Long, k As Long 'I代表列数组,J代表行,K代表列
  4.     Dim rg As Range     '合并RANGE
  5.     Dim iArr    '需要合并的列号
  6.     Dim irow    '数据行数
  7.     Dim smerge As String
  8.     Application.ScreenUpdating = False
  9.     Application.DisplayAlerts = False
  10.     iArr = Array(1, 2, 5, 6, 7, 8, 9)
  11.     arr = Range("a5:i" & [d5].End(xlDown).Row).Value
  12.     irow = UBound(arr)
  13.     For i = 0 To UBound(iArr)
  14.         k = iArr(i)
  15.         For j = 1 To irow
  16.             If j = irow Then Exit For
  17.             Set rg = Cells(j + 4, k)        '行数据与数组中的行数相差为4
  18.             Do While arr(j, k) = arr(j + 1, k) And arr(j, k) <> ""
  19.                 j = j + 1
  20.                 If j = irow Then Exit Do
  21.             Loop
  22.             Set rg = Range(rg, Cells(j + 4, k))
  23.             rg.Merge
  24.         Next
  25.     Next
  26.     For i = 5 To [d5].End(xlDown).Row
  27.         If Range("a" & i).MergeCells Then
  28.             smerge = smerge & Range("a" & i).MergeArea.Address & ","
  29.             i = Split(Range("a" & i).MergeArea.Address, "$")(4)
  30.         End If
  31.     Next
  32.     Range(Replace(Left(smerge, Len(smerge) - 1), "$A", "$C")).Merge
  33.    
  34. End Sub
复制代码
回复

使用道具 举报

发表于 2012-10-5 16:34 | 显示全部楼层
  1. Sub 合并5()
  2.     '对数据源要求,要求数据源的D列最后一行必须有数据,否则影响程序判断
  3.     Dim arr     '源数据数组
  4.     Dim i As Long, j As Long, k As Long 'I代表列数组,J代表行,K代表列
  5.     Dim rg As Range     '合并RANGE
  6.     Dim iArr    '需要合并的列号
  7.     Dim irow    '数据行数
  8.     Dim sMerge As String    '合并地址
  9.     Dim iLstRow As Long
  10.     Dim iMStart
  11.     Application.ScreenUpdating = False
  12.     Application.DisplayAlerts = False
  13.     iLstRow = [d5].End(xlDown).Row  '最后一行数据行标
  14.     iArr = Array(1, 2, 5, 6, 7, 8, 9)
  15.     arr = Range("a5:i" & [d5].End(xlDown).Row).Value    '数组,取数据区域
  16.     irow = UBound(arr)      '数组维数
  17.     For i = 0 To UBound(iArr)
  18.         k = iArr(i)
  19.         sMerge = ""
  20.         For j = 1 To irow
  21.             If j = irow Then Exit For   '最后一行,不做判断,如果是能合并的单元格,下面的代码会做合并。
  22.             iMStart = j + 4                '保存合并区起码行号
  23.             'Set rg = Cells(iMStart, k)        '行数据与数组中的行数相差为4
  24.             Do While arr(j, k) = arr(j + 1, k) And arr(j, k) <> ""
  25.                 j = j + 1
  26.                 If j = irow Then Exit Do
  27.             Loop
  28.             If j + 4 > iMStart Then
  29.                 sMerge = sMerge & Range(Cells(iMStart, k), Cells(j + 4, k)).Address(False, False) & ","
  30.                 If k = 1 Then sMerge = sMerge & Range(Cells(iMStart, 3), Cells(j + 4, 3)).Address(False, False) & ","
  31.             End If
  32.         Next
  33.         sMerge = Left(sMerge, Len(sMerge) - 1)
  34.         Range(sMerge).Merge
  35.     Next
  36. End Sub
复制代码
回复

使用道具 举报

发表于 2012-10-5 16:59 | 显示全部楼层
本帖最后由 hwc2ycy 于 2012-10-5 17:04 编辑

今天这道题,学到不少了。
继续改了,免得大规模的数据处理会报错。
  1. Sub 合并6()
  2.     '对数据源要求,要求数据源的D列最后一行必须有数据,否则影响程序判断
  3.     Dim arr     '源数据数组
  4.     Dim i As Long, j As Long, k As Long 'I代表列数组,J代表行,K代表列
  5.     Dim rg As Range     '合并RANGE
  6.     Dim iArr    '需要合并的列号
  7.     Dim irow    '数据行数
  8.     Dim sMerge As String    '合并地址
  9.     Dim iLstRow As Long
  10.     Dim iMStart
  11.     Application.ScreenUpdating = False
  12.     Application.DisplayAlerts = False
  13.     iLstRow = [d5].End(xlDown).Row  '最后一行数据行标
  14.     iArr = Array(1, 2, 5, 6, 7, 8, 9)
  15.     arr = Range("a5:i" & [d5].End(xlDown).Row).Value    '数组,取数据区域
  16.     irow = UBound(arr)      '数组维数
  17.     For i = 0 To UBound(iArr)
  18.         k = iArr(i)
  19.         For j = 1 To irow
  20.             If j = irow Then Exit For   '最后一行,不做判断,如果是能合并的单元格,下面的代码会做合并。
  21.             iMStart = j + 4                '保存合并区起码行号
  22.             'Set rg = Cells(iMStart, k)        '行数据与数组中的行数相差为4
  23.             Do While arr(j, k) = arr(j + 1, k) And arr(j, k) <> ""
  24.                 j = j + 1
  25.                 If j = irow Then Exit Do
  26.             Loop
  27.             
  28.             If j + 4 > iMStart Then
  29.                
  30.                 If Len(sMerge & Range(Cells(iMStart, k), Cells(j + 4, k)).Address(False, False) & ",") >= 250 Then
  31.                     sMerge = Left(sMerge, Len(sMerge) - 1)
  32.                     Range(sMerge).Merge
  33.                     sMerge = Range(Cells(iMStart, k), Cells(j + 4, k)).Address(False, False) & ","
  34.                 Else
  35.                     sMerge = sMerge & Range(Cells(iMStart, k), Cells(j + 4, k)).Address(False, False) & ","
  36.                 End If
  37.                
  38.                 If k = 1 Then
  39.                     If Len(sMerge & Range(Cells(iMStart, 3), Cells(j + 4, 3)).Address(False, False) & ",") >= 250 Then
  40.                         sMerge = Left(sMerge, Len(sMerge) - 1)
  41.                         Range(sMerge).Merge
  42.                         sMerge = Range(Cells(iMStart, 3), Cells(j + 4, 3)).Address(False, False) & ","
  43.                     Else
  44.                         sMerge = sMerge & Range(Cells(iMStart, 3), Cells(j + 4, 3)).Address(False, False) & ","
  45.                     End If
  46.                     
  47.                 End If
  48.             End If
  49.         Next
  50.     Next
  51.     With Columns("A:L")
  52.         .HorizontalAlignment = xlCenter
  53.         .VerticalAlignment = xlCenter
  54.     End With
  55. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 01:25 , Processed in 0.232535 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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