ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用union方法做单元格区域合并方面的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-4-9 08:11 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
各位老师:
      用 union方法做单元格区域合并遇到问题请指点。我的代码如下:
      Sub 单元格区域合并()

'指定需合并的列
Set hbxrng = Application.InputBox("请选择“需合并的列”标题单元格(1个或多个单元格)", "", , , , , , 8)     '返回单元格
hbxcount = hbxrng.Cells.Count
If hbxcount = 1 Then
    hbxcol1 = hbxrng.Column
    Set urng1 = Range(Cells(2, hbxcol1), Cells(21, hbxcol1))
ElseIf hbxcount > 1 Then
    Dim hbxcol()
    ReDim Preserve hbxcol(1 To hbxcount)
    hbxstr = Split(hbxrng.Address, ",")
    For i = 1 To hbxcount
        lwz = InStr(hbxstr(i - 1), "$")
        rwz = InStrRev(hbxstr(i - 1), "$")
        hbxcol(i) = Range(Mid(hbxstr(i - 1), 1 + lwz, rwz - (lwz + 1)) & 1).Column
        'hbxcol(i) = hbxrng(i).Column
        If i = 1 Then
            Set urng1 = Range(Cells(2, hbxcol(i)), Cells(21, hbxcol(i)))
            Debug.Print urng1.Rows.Count
            Debug.Print urng1.Columns.Count
        Else:
            Set urng1 = Union(urng1, Range(Cells(2, hbxcol(i)), Cells(21, hbxcol(i))))
            '当选择2列合并为单元格区域,此处的列数应为2,但结果却为1,错在哪里
            Debug.Print urng1.Rows.Count
            Debug.Print urng1.Columns.Count
        End If
    Next
End If
End Sub

请老师指点 ,谢谢
指定单元格区域合并.zip (15.25 KB, 下载次数: 17)



TA的精华主题

TA的得分主题

发表于 2016-4-9 09:25 | 显示全部楼层
不知道你要干吗,错误在这 Set urng2 = Union(urng1, Range(Cells(2, okmtjxcol(i)), Cells(21, okmtjxcol(i)))),这个对象没有啊,改为urng2

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-4-9 11:33 | 显示全部楼层
Sub 指定单元格区域合并()
'假设选择项目3与项目6
Set okmtjxrng = Application.InputBox("请选择汇总条件项的单元格(1个或多个单元格)", "", , , , , , 8)     '返回单元格
'选定的单元格有两个
okmtjxcount = okmtjxrng.Cells.Count
If okmtjxcount = 1 Then
    okmtjxcol1 = okmtjxrng.Column
    okmtjx = okmtjxrng
    Set urng2 = Range(Cells(2, okmtjxcol1), Cells(21, okmtjxcol1))
ElseIf okmtjxcount > 1 Then
    Dim okmtjxcol()
    ReDim Preserve okmtjxcol(1 To okmtjxcount)
    For i = 1 To okmtjxcount
        okmtjxcol(i) = okmtjxrng(i).Column
        '当i=1时,okmtjxrng(i).Column=3,当i=2时,okmtjxrng(i).Column=6
        '而此处当i=2时,okmtjxrng(i).Column=3,这是为什么,请指点
        '假设选择项目3与项目6,okmtjxrng(1)表示的是C1单元格,okmtjxrng(2)表示的是C2单元格
        If i = 1 Then
            Set urng2 = Range(Cells(2, okmtjxcol(i)), Cells(21, okmtjxcol(i)))
        Else:
            Set urng2 = Union(urng2, Range(Cells(2, okmtjxcol(i)), Cells(21, okmtjxcol(i))))
        End If
    Next
End If
End Sub

Sub 指定单元格区域合并1()
    '假设选择项目3与项目6
    Dim rng As Range, rng2 As Range, cell As Range, ar
    Set rng = Application.InputBox("请选择汇总条件项的单元格(1个或多个单元格)", "", , , , , , 8)    '返回单元格
    '选定的单元格有两个
    ar = ActiveSheet.UsedRange
    For Each cell In rng
        If rng2 Is Nothing Then
            Set rng2 = cell.Offset(1).Resize(UBound(ar) - 1)
        Else
            Set rng2 = Union(rng2, cell.Offset(1).Resize(UBound(ar) - 1))
        End If
    Next
End Sub

对于模块2的问题

Columns 属性Office 2013 and later



返回一个 Range 对象,它代表指定区域中的列。


语法


表达式.Columns

表达式 一个代表 Range 对象的变量。



注解


在不使用对象识别符的情况下使用此属性等效于使用 ActiveSheet.Columns。

此属性在应用于一个是多重选定区域的 Range 对象时,会只从该区域的第一个子区域中返回列。例如,如果 Range 对象有两个子区域 A1:B2 和 C3:D4,那么,Selection.Columns.Count 的返回值是 2,而不是 4。若要对一个可能包含多重选定区域的区域使用此属性,请测试 Areas.Count 以确定此区域内是否包含多个子区域。如果包含,请对此区域内的每个子区域进行循环





TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-9 23:18 | 显示全部楼层
Vicel 发表于 2016-4-9 11:33
Sub 指定单元格区域合并()
'假设选择项目3与项目6
Set okmtjxrng = Application.InputBox("请选择汇总条 ...

谢谢指点,此属性在应用于一个是多重选定区域的 Range 对象时,会只从该区域的第一个子区域中返回列。

TA的精华主题

TA的得分主题

发表于 2023-2-10 18:33 | 显示全部楼层
dd.jpg



用rng(,jj*col+1)方法,容易出错。
Set MergeRng = Union(MergeRng, oRng)方法虽然麻烦,不容易出错。




  1. Sub del10210()
  2.    Dim mRng As Range, Rng As Range, Rng1 As Range, Rng2 As Range
  3.    Dim AddArr, WeaArr
  4.        AddArr = Array("A2", "A11", "A20", "A29", "A38", "A47", "A56")
  5.        WeaArr = Array("C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8")
  6.        Set Rng = Range(Cells(1, 1).Formula)
  7.        Set mRng = Rng(1, 1).MergeArea
  8.       
  9.        For jj = 0 To UBound(AddArr)
  10.             Set Rng1 = Rng(, jj * (mRng.Columns.Count + 1) + 1)
  11.             For jj1 = 0 To UBound(WeaArr)
  12.                    Rng1(3, jj1 + 1) = AddArr(jj) & WeaArr(jj1)
  13.             Next jj1
  14.             Debug.Print Rng1.Address
  15.        Next jj
  16. End Sub
  17. ''
  18. Sub del20210()
  19.    Dim MergeRng As Range, mRng As Range
  20.    Dim Rng As Range, Rng1 As Range, Rng2 As Range
  21.    Dim oRng As Range, oRng1 As Range, oRng2 As Range
  22.    Dim AddArr, WeaArr
  23.        AddArr = Array("A2", "A11", "A20", "A29", "A38", "A47", "A56")
  24.        WeaArr = Array("C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8")
  25.        Set Rng = Range(Cells(1, 1).Formula)
  26.        Set MergeRng = Rng.Find(AddArr(0), LookAt:=xlWhole).MergeArea
  27.        For jj = 1 To UBound(AddArr)
  28.             Set oRng = Rng.Find(AddArr(jj)).MergeArea
  29.             Set MergeRng = Union(MergeRng, oRng)
  30.             'Debug.Print MergeRng.Address
  31.        Next jj
  32.        Set mRng = Rng(1, 1).MergeArea
  33.        ii = 10
  34.        For jj = 1 To MergeRng.Areas.Count
  35.             Set oRng = Cells(ii, MergeRng.Areas(jj).Column)
  36.             ''
  37.             For jj1 = 0 To UBound(WeaArr)
  38.                    oRng(, jj1 + 1) = AddArr(jj - 1) & WeaArr(jj1)
  39.             Next jj1
  40.             
  41.        Next jj
  42. End Sub

复制代码


a.zip

55.35 KB, 下载次数: 0

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

本版积分规则

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

GMT+8, 2024-11-19 08:49 , Processed in 0.033641 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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