ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 218|回复: 6

[求助] 合并单元格结果不对?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-7-8 15:52 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
image.png

没有用好Set oRng = Union(oRng, Rng(ii, jj))
  1. Sub Macro1()
  2.    Application.DisplayAlerts = False
  3.    Dim Sht As Worksheet
  4.       
  5.    Dim Rng As Range, oRng As Range
  6.        Set Rng = Selection
  7.        Set Sht = Rng.Parent
  8.    Dim Str As String
  9.    Dim ii: ii = 1
  10.        Set Rng = Sht.Cells(20, 1).CurrentRegion
  11.        Debug.Print Rng.Address
  12.        For jj = 1 To 3
  13.            Set oRng = Rng(ii, jj)
  14.            For ii = 1 To Rng.Rows.Count
  15.                ''
  16.                If Rng(ii, jj) = Rng(ii + 1, jj) Then
  17.                    Set oRng = Union(oRng, Rng(ii, jj))
  18.                    Debug.Print oRng.Address
  19.                ElseIf Rng(ii, jj) <> Rng(ii + 1, jj) Then
  20.                    'Debug.Print oRng(2, 1).Resize(oRng.Rows.Count).Address
  21.                    'oRng(2, 1).Resize(oRng.Rows.Count).Merge
  22.                    Debug.Print oRng.Address
  23.                    oRng.Merge
  24.                    Set oRng = Rng(ii, jj)
  25.                End If
  26.            Next ii
  27.            ii = 1
  28.        Next jj
  29.        Application.DisplayAlerts = True
  30. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2024-7-8 16:25 | 显示全部楼层
没有附件,盲猜一下。
包含日期时间的这一列,按已使用列数进行循环,取出第一行的年、月、日,再依次取出第2-N行的年、月、日,逐个和第一行核对,完全一致的,使用union联合,存在不一致的,已经使用union联合的单元格合并。大约是这样的流程。

TA的精华主题

TA的得分主题

发表于 2024-7-8 16:33 | 显示全部楼层
自己调用一下吧
  1. Public Sub MergeSameItem(ByVal RngWithTitle As Range, Optional MergeColumnNo As Long = 1)
  2.     '''禁止合并单元格过程中出现警告提示
  3.     Application.DisplayAlerts = False
  4.     Dim i As Integer
  5.     Dim RowCount As Long
  6.     Dim LastRow As Long
  7.     Dim FirstRow As Long
  8.     With RngWithTitle
  9.         '''根据A列序号合并A列
  10.         RowCount = .Cells.Rows.count
  11.         LastRow = RowCount
  12.         For i = RowCount To 2 Step -1
  13.             If .Cells(i, MergeColumnNo).Value <> .Cells(i - 1, MergeColumnNo).Value Then     '若前后行内容不同
  14.                 FirstRow = i    '记下合并区域的起始行
  15.                 .Cells(FirstRow, MergeColumnNo).Resize(LastRow - FirstRow + 1, 1).Merge '拓展选区
  16.                 LastRow = i - 1    '调整下一个区域的终止行
  17.             End If
  18.         Next i
  19.     End With
  20.     Application.DisplayAlerts = True    '恢复警告提示
  21. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-7-8 16:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-7-8 16:50 | 显示全部楼层
他这个,是根据B列合并A列,应该不用倒序。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-8 19:45 | 显示全部楼层
wang-way 发表于 2024-7-8 16:33
自己调用一下吧

谢谢解答。


image.png

  1. Sub Macro1()
  2.    Application.DisplayAlerts = False
  3.    Dim Sht As Worksheet, Sht1 As Worksheet
  4.        Set Sht = Sheet1
  5.        Set Sht1 = Sheet6
  6.    Dim Rng As Range, oRng As Range
  7.    Dim Str As String
  8.    Dim ii: ii = 1
  9.        With Sht1
  10.            Set Rng = .Cells(10, 1).CurrentRegion
  11.            'Debug.Print Rng.Address
  12.        End With
  13.        ''
  14.        With Sht
  15.           .Cells.Clear
  16.           .Activate
  17.           Rng.Copy
  18.           .Cells(5, 1).PasteSpecial xlPasteAll
  19.          
  20.           Set Rng = .Cells(20, 1).CurrentRegion
  21.           Rng.Select
  22.        End With

  23.        Rng.Sort key1:=Rng(, 4), Order1:=xlAscending  'xlDescending
  24.       
  25.        ''
  26.        For jj = 1 To 3
  27.           MergeRng Rng(, jj).Resize(Rng.Rows.Count, 1)
  28.        Next jj
  29.        With Rng.Borders
  30.            .LineStyle = 1
  31.            .Weight = 3
  32.        End With
  33.       
  34.        Application.DisplayAlerts = True
  35. End Sub

  36. Function MergeRng(Rng As Range)
  37.   Dim LastRow, FirstRow
  38.   Dim ii, jj
  39.   Dim Sht As Worksheet
  40.      Set Sht = Rng.Parent
  41.      With Rng.Parent
  42.         LastRow = Rng.Row + Rng.Rows.Count - 1
  43.         For ii = Rng.Row + Rng.Rows.Count - 1 To 2 Step -1
  44.             If .Cells(ii, Rng.Column).Value <> .Cells(ii - 1, Rng.Column).Value Then
  45.                 FirstRow = ii
  46.                 .Cells(FirstRow, Rng.Column).Resize(LastRow - FirstRow + 1, 1).Merge
  47.                 LastRow = ii - 1
  48.             End If
  49.         Next ii
  50.      End With
  51. End Function
复制代码



Merg.rar

143.36 KB, 下载次数: 4

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-12 03:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
程序优化
                If FirstRow < Rng.Row Then
                    Exit Function
                End If


  1. Function MergeRng(Rng As Range)
  2.   Dim LastRow, FirstRow
  3.   Dim ii, jj
  4.   Dim Sht As Worksheet
  5.      Set Sht = Rng.Parent
  6.      With Rng.Parent
  7.         LastRow = Rng.Row + Rng.Rows.Count - 1
  8.         For ii = Rng.Row + Rng.Rows.Count - 1 To 2 Step -1
  9.             Debug.Print .Cells(ii, Rng.Column).Address
  10.             'Debug.Print Rng.Address
  11.             
  12.             
  13.             If .Cells(ii, Rng.Column).Value <> .Cells(ii - 1, Rng.Column).Value Then
  14.                 FirstRow = ii
  15.                 If FirstRow < Rng.Row Then
  16.                     Exit Function
  17.                 End If
  18.                 .Cells(FirstRow, Rng.Column).Resize(LastRow - FirstRow + 1, 1).Merge
  19.                 LastRow = ii - 1
  20.             End If
  21.         Next ii
  22.      End With
  23. End Function

复制代码


  1. <p>
  2. </p><p>Private Sub deldeldeldeldelde()</p><p>   Application.DisplayAlerts = False</p><p>   Dim Rng As Range, oRng As Range</p><p>       Set Rng = Selection</p><p>   Dim Sht As Worksheet</p><p>       Set Sht = Rng.Parent</p><p>       With Sht</p><p>          Set Rng = .Range(.Cells(4, 1).Formula)</p><p>          Debug.Print Rng.Address</p><p>          Set oRng = Rng(3, 1).Resize(Rng.Rows.Count - 2, Rng.Columns.Count)</p><p>          For jj = 1 To 3</p><p>             'Set oRng = oRng(, 3).Resize(oRng.Rows.Count, 1)</p><p>             MergeRng oRng(, jj).Resize(oRng.Rows.Count, 1)</p><p>          Next jj</p><p>          </p><p>       End With</p><p>       Application.DisplayAlerts = True</p><p>End Sub</p><p></p>
复制代码


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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 01:47 , Processed in 0.048343 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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