龙空技术网

随机获得非重复元素的数组

VBA语言専攻 139

前言:

眼前各位老铁们对“vba函数返回数组却不输出”大约比较讲究,各位老铁们都想要学习一些“vba函数返回数组却不输出”的相关文章。那么小编也在网络上搜集了一些有关“vba函数返回数组却不输出””的相关文章,希望朋友们能喜欢,咱们一起来学习一下吧!

【分享成果,随喜正能量】每个人都会累,也许是累于身上承担的沉重责任,也许是疲惫于应付各种人际关系。当你很累很累的时候闭上眼睛深呼吸,告诉自己坚持住。因为上天只会给我们能过得去的坎,在一切变好之前,我们总要经历一些不开心的日子。不要因为一点瑕疵和困难就放弃一段坚持。

《VBA信息获取与处理》教程是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。

教程共两册,八十四讲。今日的内容是专题二“随机数(Random)在EXCEL工作表及VBA中的应用”的第4讲:随机获得非重复元素的数组

第四节 获取唯一非重复值的返回数组

讲到这里,大家对于随机数的利用应该有了一个大概的认识,但是,在第三节的程序中我们发现,在多次点击运行后,会出现数据重复的现象,如下面的截图:

而在利用随机数的场景中,有一些特例是不能重复的,比如输入源数组AA()如果是某个公司的人员编号,随机返回的是年终抽奖的结果,这个时候问题来了,在同批次得奖的人员中不可能有重复的啊?如何让返回的随机数组成的数组是唯一非重复的数组呢?我们这节就来解决这个问题。

1 思路分析及代码实现

为了解决这个问题,我们只需要在产生随机数后,在源数组中将这个值的位置调整到最后,然后下一次产生随机数时在余下的源数据中产生即可。思路有了,我们看代码的实现,这节的代码和上一节是相似的,我只讲不同的部分:

T = UBound(AA)

For J = LBound(BB) To UBound(BB)

I = Int((T - Mim + 1) * Rnd + Mim)

BB(J) = AA(I)

'对源数组数据进行处理,将第i个值放到T的位置

Temp = AA(I)

AA(I) = AA(T)

AA(T) = Temp

T = T - 1

Next

代码截图:

代码讲解:上述代码中首先将源数组的最大下标值赋给T,这里的T是可变的,每次将下移一个单位,所取出的值位置I: I = Int((T - Mim + 1) * Rnd + Mim),也就是说这个范围是可变的。

① T = UBound(AA) 将源数据的最大下标值赋给T

② I = Int((T - Mim + 1) * Rnd + Mim)

BB(J) = AA(I)

取得I的随机位置,并给输出数组赋值。

③ Temp = AA(I)

AA(I) = AA(T)

AA(T) = Temp

将源数组的最后的值和第I个值交换位置。

④ T = T – 1

调整下次取得随机数的范围。

我们最后看看利用上述代码的输出:

从上面的输出看,保证了数据的唯一性。

2 获取唯一非重复值返回数组的代码

最后把这节完整的代码贴出如下:

Public Function MyRandomA(Mim As Long, Mam As Long, _

NS As Long, Optional ArrayBase As Long = 1) As Variant

Dim AA() As Long

Dim BB() As Long

If Mim > Mam Then

MyRandomA = Null

Exit Function

End If

If NS > (Mam - Mim + 1) Then

MyRandomA = Null

Exit Function

End If

If NS <= 0 Then

MyRandomA = Null

Exit Function

End If

Randomize

ReDim AA(Mim To Mam)

ReDim BB(ArrayBase To (ArrayBase + NS - 1))

For i = Mim To Mam

AA(i) = i

Next

T = UBound(AA)

For j = LBound(BB) To UBound(BB)

i = Int((T - Mim + 1) * Rnd + Mim)

BB(j) = AA(i)

'对源数组数据进行处理,将第i个值放到T的位置

Temp = AA(i)

AA(i) = AA(T)

AA(T) = Temp

T = T - 1

Next

MyRandomA = BB

End Function

Sub MYNZC()

Sheets("sheet3").Select

UU = MyRandomA(Range("e2"), Range("e3"), Range("e4"))

Range("a:a").ClearContents

Range("A1").Resize(UBound(UU), 1) = Application.Transpose(UU)

End Sub

本节知识点回向:如何实现返回的随机值具有唯一性?思路是怎样的?代码中T的值是变化的,这种变化保证了什么?

本节内容详细代码“参考002工作表.XLSM”

我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序:

① 7→1→3→2→6→5或者7→4→3→2→6→5。

② 7→8

各套教程内容简介:

第7套教程(共三册):《VBA之EXCEL应用》:是对VBA基本的讲解

第1套教程(共三册):《VBA代码解决方案》是入门后的提高教程

第4套教程(16G):VBA代码解决方案之视频(第一套的视频讲解)

第3套教程(共两册):《VBA数组与字典解决方案》:是对数组和字典的专题讲解

第2套教程(共两册):《VBA数据库解决方案》:是对数据库的专题讲解

第6套教程(共两册):《VBA信息获取与处理》:讲解VBA的网络及跨程序应用

第5套教程(共两册):VBA中类的解读和利用:类及接口技术的讲解

第8套教程(共三册):VBA之Word应用(最新教程):word中VBA的利用

第六套教程:VBA信息获取与处理,这是一部高级教程,涉及范围更广,实用性更强,面向中高级人员。教程共二十个专题,包括:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。

标签: #vba函数返回数组却不输出