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].select

2. 选中连续单元格(以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)

参考技术B Option Base 1
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 Sub
ss()
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保留?

java的swing编程,Jtable的单元格如何赋值

求VBA高手 ComboBox 自动出现在单元格,选择值后自动赋值给当前单元格的问题

用vba给Excel单元格赋值

用vba给Excel单元格赋值

VBA中如何把A这列数赋值给数组?谢谢