excel vba如何将选中的不连续单元格赋值到数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了excel vba如何将选中的不连续单元格赋值到数组相关的知识,希望对你有一定的参考价值。
如题,在某个自定义函数中,参数是用户选择的区域。将参数赋值到数组后,通过数组运算得出结果。但是如果选择的区域是非连续的如何处理呢?
多谢两位,经过启发,得到了想要的代码:
Function test(ParamArray inp())
Dim i, j
Dim score()
For j = 0 To
UBound(inp)
For Each cl In inp(j)
i = i + 1
ReDim Preserve score(i)
score(i) = cl
Next
Next
…
End Function
EXCEL VBA中选中单元格的方法很多,列举如下:
1. 选中单个单元格(以单元格A1为例),可以表述为
range("a1").select或者表述为
cells(1,1).select也可以简写为
[a1].select2. 选中连续单元格(以A1:B2为例),可以表述为
range("a1:b2").select或者
range(range("a1"),range("b2")).select 此处的range("a1")同样可以表述为第一步中的cell与[a1]形式3. 选中不连续单元格(以A1:B2,A5:B7为例),可以表述为
Union(Range("a1:b2"), Range("a5:b7")).Select 同理此处的range可以用第一步的cell与[]来代替。 参考技术A 没试过楼下的行不行,不过楼主可以通过UNION语句把不相连接单元格拼接在一起构成个range然后用for each 的方法把数据装入数组。。但是这样不好的是只能得到一列或一行数据,不能保留源数据所存地址的其他信息。。。追问
不过不知道有多少个Range作为参数,用union怎么写呢?用循环吗?
追答己经忘 了哪人是楼下的了。。
sub 中用 for each in selection 应可是可以的。
但是如果你是自定义函数,你这个选择区域怎么确定呢?
如果非要用function.的话,可能要多定义几个参数。
以下自定义函数是返回区域内第r个的值,一共定义了四个参数,第一是返回数据的次序号,第二个是一个range区域,必需的,后面两个不是必需的区域,可省略
Function test1(ByVal r As Integer, ByVal rng1 As Range, Optional rng2 As Range, Optional rng3 As Range)Dim RNG As Range, arr(), i%
If rng2 Is Nothing And rng3 Is Nothing Then
Set RNG = rng1
ElseIf Not rng2 Is Nothing Then
Set RNG = Union(rng1, rng2)
ElseIf Not rng3 Is Nothing Then
Set RNG = Union(rng1, rng2, rng3)
End If
For Each c In RNG
If c.Value <> "" Then
i = i + 1
ReDim Preserve arr(i)
arr(i) = c
End If
Next
test1 = arr(r)
End Function
修改了下,,但这样的效果也不是很好。。。
注意下,FOR EACH循环是先横着(行)再竖(列)这样一个顺序。
如果要把查找到的内容放入数组内,参考下楼上的redim Preserve Arr(i)
Sub test()
Dim Arr() As Variant
Dim i As Long
For Each cl In Selection
i = i + 1
ReDim Preserve Arr(i)
Arr(i) = cl
Next cl
‘在这里你就可以使用ARR数组了
End Sub追问
这个sub试了下好像是可以的,但是我想弄个自定义函数,好像就不行了?
Function test2(ByVal inp)
Dim Arr() As Variant
Dim i As Long
For Each cl In inp
i = i + 1
ReDim Preserve Arr(i)
Arr(i) = cl
Next cl
test2 = Arr(1)
End Function
你用函数返回一个数组有什么意义
test2 = Arr(1)
你的数组是用来干什么的。
你把整个数组返回了
在EXCEL中,如何使用VBA设置单元格内指定字符串格式
参考技术A Subss()
Dim
j
As
Long
j
=
InStr(Range("A1"),
"格式")
With
Range("A1")
.Font.FontStyle
=
"正常"
.
Characters
(Start:=j,
Length:=2).Font.FontStyle
=
"加粗"
End
With
End
Sub
这个代码可以让你的格式两个字在任意位置
如果你A1是固定的这几个字,那么一句话搞定
Range("A1")
.Characters(Start:=4,
Length:=2).Font.FontStyle
=
"加粗" 参考技术B 查找所有应用区域中包含“hello”字符串的
sub
test1()
dim
v
as
string
dim
r
as
range
v
=
"hello"
for
each
r
in
activesheet.usedrange
if
instr(1,
r,
v)
<>
0
then
msgbox
r.address
end
if
next
end
sub
以上是关于excel vba如何将选中的不连续单元格赋值到数组的主要内容,如果未能解决你的问题,请参考以下文章
excel vba 数组中第1位字符为0,赋给单元格时如何将0保留?