【发布时间】:2017-07-30 16:42:08
【问题描述】:
我正在为 Excel 开发一个实用程序 AddIn,它处理可变数量的 Ranges。它可以修改当前选择或创建新选择以供进一步使用:例如应用格式样式、合并和取消合并。
在这个插件中,我需要将许多连续范围组合成一个“多区域范围”说:
"A1:A10","A11:A20","A21:A30",......."A490:A500"
如果范围较少,我会使用“Range”方法,例如:
Addr="A1:A10,A11:A20,A21:A30"
Set Rng=Range(Addr)
它工作正常并创建一个“多区域范围”,其中:
Rng.Areas.Count 'is 3
Rng.Areas(1).address 'is "$A$1:$A$10"
Rng.Areas(2).address 'is "$A$11:$A$20"
Rng.Areas(3).address 'is "$A$21:$A$30"
但问题从地址长度参数大于255开始。在这种情况下,“范围”失败并且 抛出错误:即
Addr="A1:A10,A11:A20,A21:A30,A31:A40,A41:A50,A51:A60,A" & _
"61:A70,A71:A80,A81:A90,A91:A100,A101:A110,A111:A" & _
"120,A121:A130,A131:A140,A141:A150,A151:A160,A161" & _
":A170,A171:A180,A181:A190,A191:A200,A201:A210,A2" & _
"11:A220,A221:A230,A231:A240,A241:A250,A251:A260," & _
"A261:A270,A271:A280,A281:A290,A291:A300,A301:A31" & _
"0,A311:A320,A321:A330,A331:A340,A341:A350,A351:A" & _
"360,A361:A370,A371:A380,A381:A390,A391:A400,A401" & _
":A410,A411:A420,A421:A430,A431:A440,A441:A450,A4" & _
"51:A460,A461:A470,A471:A480,A481:A490,A491:A500"
Set Rng=Range(Addr)
抛出错误:“对象'_Global'的方法'Range'失败”
为了克服“Range”方法的这个限制,我使用了“Union”函数:
Set rng = Union( _
Range("A1:A10,A11:A20,A21:A30,A31:A40,A41:A50,A51:A60"), _
Range("A61:A70,A71:A80,A81:A90,A91:A100,A101:A110,A111:A120"), _
Range("A121:A130,A131:A140,A141:A150,A151:A160,A161:A170"), _
Range("A171:A180,A181:A190,A191:A200,A201:A210,A211:A220"), _
Range("A221:A230,A231:A240,A241:A250,A251:A260,A261:A270"), _
Range("A271:A280,A281:A290,A291:A300,A301:A310,A311:A320"), _
Range("A321:A330,A331:A340,A341:A350,A351:A360,A361:A370"), _
Range("A371:A380,A381:A390,A391:A400,A401:A410,A411:A420"), _
Range("A421:A430,A431:A440,A441:A450,A451:A460,A461:A470"), _
Range("A471:A480,A481:A490,A491:A500"))
很好与 非连续范围一起工作。但是当所有范围都是连续的(如我的情况)时,“Union”将所有范围合并为一个“Single Area Range”。即
Rng.Areas.Count 'is 1
Rng.Areas(1).Address 'is "$A$1:$A$500"
我需要一个“多区域范围”以供进一步使用,在哪里。
Rng.Areas.Count 'Must be 50
Rng.Areas(1).Address 'Must be "$A$1:$A$10"
Rng.Areas(2).address 'Must be "$A$11:$A$20"
Rng.Areas(3).address 'Must be "$A$21:$A$30"
.......
.......
Rng.Areas(50).address 'Must be "$A$491:$A$500"
不幸的是,“Range.Areas”属性是只读的。 所以我不能直接添加或删除任何元素。
请帮助我解决这个问题。
【问题讨论】:
-
为什么不使用连续范围的数组?
-
@YowE3K 你今天很聪明 ;) 连续 12 小时
-
如果我使用数组,我将如何在活动工作表上选择数组包含的所有范围。例如“Rng.Select”将起作用。但是“Rng(0).Select”只会选择第0个范围。并且当“Rng(1).Select”将被执行时,旧的选择(第 0 个)将被取消选择,第 1 个将被选中,依此类推。我正在开发一个插件,它提供了控制当前选择以供进一步使用的高级选项。例如它可以:扩展或缩小选择,将选择移动到上下左右,选择间隔范围。它工作正常,直到地址小于 255。或者它是非连续的。
-
为什么需要
Select任何范围?保留所有输入范围的数组肯定会跟踪这些范围,无论是否连续。很少需要使用 VBA 来Select任何东西,除非您试图以视觉方式为用户突出显示某个区域。 -
是的,它是一个实用插件,其唯一目的是根据多个条件为用户选择范围。这就是我需要它的原因。