ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 山菊花

[讨论] 匪夷所思的Range()合并区域赋值问题

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-13 10:49 | 显示全部楼层
本帖已被收录到知识树中,索引项:Range对象
手工操作与程序操作效果不一样,又是一个疑惑。

点评

这种现象只是数组赋值给单元格,=range.value实质是数组,复制自然不同。  发表于 2013-12-13 11:50

TA的精华主题

TA的得分主题

发表于 2013-12-13 10:51 | 显示全部楼层
本帖最后由 lee1892 于 2013-12-13 11:05 编辑

发现一个非常有意思的现象,貌似为解决Range对象的区域不连续时,微软采用了一些很有趣的做法:

Range对象选定区域连续时:
  1. With ActiveSheet.Range("D1:F5")
  2.     Debug.Print .Cells.Count '-> 15 选定区域的单元格数量
  3.     Debug.Print .Cells.Item(4).Address '-> $D$2 说明是先同行计序数,到达区域列尾返回至下一行的区域内首列
  4.     Debug.Print .Cells.Item(20).Address '-> $E$7 超出区域但不报错,限制在区域的列内
  5.     Debug.Print .Cells(3,3).Address '-> $F$3 以选定区域左上角单元格为起始单元格
  6.     Debug.Print .Cells(5,6).Address '-> $I$5 同上,可以超出选定区域
  7. End With
复制代码
Range对象选定区域不连续时:
  1. With ActiveSheet.Range("D1:E5,G1:H5")
  2.     Debug.Print .Cells.Count '-> 30 选定区域的单元格数量
  3.     Debug.Print .Cells.Item(4).Address '-> $E$2 或许你会以为是 H1
  4.     Debug.Print .Cells.Item(11).Address '-> $D$6 或许你会以为是 G1
  5.     Debug.Print .Cells.Item(66536).Address '-> $E$33268 看来是到不了G列的了
  6.     Debug.Print .Cells(3,3).Address '-> $F$3 以选定区域左上角单元格为起始单元格
  7.     Debug.Print .Cells(5,6).Address '-> $I$5 同上,可以超出选定区域
  8. End With
复制代码
但是用前面提到的 For Each oRng In .Cells 的方法,又可以获得后续的不连续区域的内容,且限定在所选区域内,这实在是非常有意思~

显然.Cells方法返回的是一个类似于Collection集合的对象,对于连续区域而言,下面的两种方法是等效的
  1. With ActiveSheet.Range("D1:F5")
  2.     For Each oRng In .Cells
  3.         Debug.Print oRng.Address
  4.     Next
  5.     For i = 1 To .Cells.Count
  6.         Debug.Print .Cells.Item(i).Address
  7.     Next
  8. End With
复制代码
但对于不连续区域而言,这两者就不一样了
  1. With ActiveSheet.Range("D1:E5,G1:H5")
  2.     For Each oRng In .Cells
  3.         Debug.Print oRng.Address
  4.     Next
  5.     For i = 1 To .Cells.Count
  6.         Debug.Print .Cells.Item(i).Address
  7.     Next
  8. End With
复制代码

TA的精华主题

TA的得分主题

发表于 2013-12-13 11:10 | 显示全部楼层
本帖最后由 Zamyi 于 2013-12-13 11:25 编辑

的确奇怪:

  1. a = [{1;2;3;4;5}]
  2. Range("a1:a5,b1:f1") = a
  3. Range("b11:f11,a11:a15") = a
复制代码
列转行可以,行转列却不行:

  1. a = [{1;2;3;4;5}]
  2. Range("a1,a1:e1") = a

  3. a = [{1,2,3,4,5}]
  4. Range("a10,a10:a14") = a
复制代码

TA的精华主题

TA的得分主题

发表于 2013-12-13 11:33 | 显示全部楼层
看了12楼的,试了下,以下是在2013下的结果:
With ActiveSheet.Range("D1:E5,G1:H5")
    Debug.Print .Cells.Count '20 选定区域的单元格数量
    Debug.Print .Cells.Item(4).Address ' 与.Areas(1).Cells.Item(4).Address等效
    Debug.Print  .Areas(2).Cells.Item(4).Address 得到$h$2
……
End With
区域不连续(即多区域),缺省时默认是Areas(1),并从它的第一个格子开始计行列偏移量。
指定区域时,则从指定区域的第一个格子开始计行列偏移量。
行列偏移量可以偏移出区域范围,只要不超出区域整张sheet的行列范围:
With ActiveSheet.Range("D3:E5,G1:H5")
     Debug.Print .Cells(44,30).Address ' 有结果
     Debug.Print  .Cells(1048576,30) ' 报错
……
End With

点评

嗯,还有这么个Areas方法,有趣~  发表于 2013-12-13 12:06

TA的精华主题

TA的得分主题

发表于 2013-12-13 11:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
火前留名。养肥了学习!

TA的精华主题

TA的得分主题

发表于 2014-2-6 11:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 黄金万两︶ㄣ 于 2014-2-6 11:56 编辑

这样想吧:看Worksheet.Range 属性中的这个()里面思考,在这讨论的列子,那么比喻为Range(二维数组(老师侧试时所说的奇数),一维数组(老师侧试时所说的 偶数),二维数组(老师侧试时所说的 奇数),一维数组(老师侧试时所说的 偶数),这样一直下去 )因为与Range("a1")中的a是列(那是说是二维数组),1是行(那是说是一维数组 ),是双双对应。那么得出来的结果就是老师侧试的了 。我才自学vba一个月,且不会英语。说错的请老师见谅

TA的精华主题

TA的得分主题

发表于 2014-7-5 17:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢。。。。。

TA的精华主题

TA的得分主题

发表于 2014-8-25 10:13 | 显示全部楼层
   利用字典设置的有规律变化的多个区域选择,为什么运用到数组函数时会出错,还请老师指导!
Dim rg As Range

For rr = 0 To d2.Count - 1
If rr = 0 Then
Set rg = Range(Cells(7 + rr * (d1.Count + 2), 2), Cells(4 + (rr + 1) * (d1.Count + 2), d.Count + 1))
Else
Set rg = Union(rg, Range(Cells(7 + rr * (d1.Count + 2), 2), Cells(4 + (rr + 1) * (d1.Count + 2), d.Count + 1)))
End If
Next
rg.Select
Range(Cells(4, 2), Cells(er, d2.Count + 3)).FormulaArray = zchj(rg)

TA的精华主题

TA的得分主题

发表于 2014-9-20 12:00 | 显示全部楼层
连续区域给不连续区域赋值问题的解决方案,在大家的提醒中得到的
Dim rng1 As Range, rng2 As Range, arr1, arr2, rng11 As Range, rng22 As Range
Dim a As String, b As String
Sub ddd()
   Set rng1 = Sheet1.Range("a1:a10")
   Set rng2 = Union(Sheet1.Range("b1:b10"), Sheet1.Range("b14:b23"), Sheet1.Range("b28:b37"), Sheet1.Range("b41:b50"))
    For Each rng11 In rng1
        If Len(a) = 0 Then
        a = rng11.Value
        Else
        a = a & "," & rng11.Value
        End If
    Next
    For Each rng22 In rng2
        If Len(b) = 0 Then
        b = rng22.Address
        Else
        b = b & "," & rng22.Address
        End If
    Next
    arr1 = Split(a, ",")
    arr2 = Split(b, ",")
    rng2.Select
    rng2.ClearContents
    For i = 0 To UBound(arr2)
        If i > 1 And i < 2 And i Mod (UBound(arr1) + 1) = 0 Then
            Sheet1.Range(arr2(i)) = arr1(9)
        Else
            Sheet1.Range(arr2(i)) = arr1(i Mod (UBound(arr1) + 1))
        End If
    Next i
End Sub

连续区域给不连续合并区域赋值问题.rar

8.15 KB, 下载次数: 17

TA的精华主题

TA的得分主题

发表于 2014-9-20 12:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
再来一个,
不连续区域给不连续区域赋值问题的解决方案
前提是这两个区域相等
Dim rng1 As Range, rng2 As Range, arr1, arr2, rng11 As Range, rng22 As Range
Dim a As String, b As String
Sub ddd()
   Set rng1 = Union(Sheet1.Range("B1:B23"), Sheet1.Range("B36:B41"), Sheet1.Range("B51:B56"), Sheet1.Range("B69:B74"), Sheet1.Range("B84:B89"))
   Set rng2 = Union(Sheet1.Range("c1:c23"), Sheet1.Range("c36:c41"), Sheet1.Range("c51:c56"), Sheet1.Range("c69:c74"), Sheet1.Range("c84:c89"))
    For Each rng11 In rng1
        If Len(a) = 0 Then
        a = rng11.Value
        Else
        a = a & "," & rng11.Value
        End If
    Next
    For Each rng22 In rng2
        If Len(b) = 0 Then
        b = rng22.Address
        Else
        b = b & "," & rng22.Address
        End If
    Next
    arr1 = Split(a, ",")
    arr2 = Split(b, ",")
    rng2.Select
    rng2.ClearContents
    For i = 0 To UBound(arr1)
        Sheet1.Range(arr2(i)) = arr1(i)
    Next i
End Sub

不连续合并区域给不连续合并区域赋值问题.rar

7.87 KB, 下载次数: 17

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

本版积分规则

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

GMT+8, 2024-3-28 22:47 , Processed in 0.052279 second(s), 13 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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