VBA学习笔记之随机数&数组redim

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA学习笔记之随机数&数组redim相关的知识,希望对你有一定的参考价值。

发现更简单的:

a=Application.RandBetween(-10, 10)

直接生成-10到10之间的随机整数

关于二维数组Redim Preserve:

如果使用了 Preserve 关键字,就只能重定义数组最末维的大小,且根本不能改变维数的数目。

具体参考

 1 如果使用了 Preserve 关键字,就只能重定义数组最末维的大小,且根本不能改变维数的数目。例如,如果数组就是一维的,则可以重定义该维的大小,因为它是最末维,也是仅有的一维。不过,如果数组是二维或更多维时,则只有改变其最末维才能同时仍保留数组中的内容。下面的示例介绍了如何在为已有的动态数组增加其最末维大小的同时而不清除其中所含的任何数据。
 2 
 3 ReDim X(10, 10, 10)
 4 . . .
 5 ReDim Preserve X(10, 10, 15)
 6 
 7 同样地,在使用 Preserve 时,只能通过改变上界来改变数组的大小;改变下界则会导致错误。
 8 
 9 如果将数组改小,则被删除的元素中的数据就会丢失。如果按地址将数组传递给某个过程,那么不要在该过程内重定义该数组的各维的大小。
10 
11 在初始化变量时,数值变量被初始化为 0,变长的字符串被初始化为一个零长度的字符串 (""),而定长的字符串则用 0 填充。Variant 变量被初始化为 Empty。用户自定义类型的变量的每个元素作为各自独立的变量进行初始化。在使用引用对象的变量之前,必须使用 Set 语句将一个已有的对象赋给该变量。在被赋值之前,所声明的对象变量有一个特定值 Nothing,这个值表示该变量没有指向任何对象的实例。
12 
13 小心 如果 ReDim 语句所使用的变量在模块级别或过程级别不存在,则该语句就相当于一个声明语句。如果此后在一个更广的范围内又创建了同名的变量,即使使用了 Option ExplicitReDim 也将使用后声明的这个变量,且不会导致编译错误。为了避免这种冲突,就不应把 ReDim 作为声明语句使用,而只应作为重定义数组大小的语句。
14 
15 注意 要改变 Variant 所包含的数组的大小,必须在试图改变其数组大小之前显式声明该 Variant 变量。

 

本来下面的例子想用Redim Preserve,后来意识到根本用不到,就当顺便学习下二维数组的redim了(/ □ \\)

‘生成随机数
Sub test() Dim a(10, 2)‘本来想这样写  Dim a(),然后for循环里redim preserve a(i,2),发现不太对,a(i,1)怎么办? For i = 1 To 10 upperbound = 1 lowerbound = 100 a(i, 1) = Int((upperbound - lowerbound + 1) * Rnd + lowerbound) ‘@1 a(i, 2) = Application.RandBetween(1, 100) ‘@2 Cells(i, 1) = a(i, 1) Cells(i, 4) = a(i, 2) Next End Sub ‘可以看到@1和@2代码效果完全一样

  效果图:技术分享

 

 

 

 

 

 

 

 

以下来自:http://blog.csdn.net/iamlaosong/article/details/38434179


 

语法:Rnd[(number)]
  如果 number 的值是 Randomize 生成
  小于 0 ,每次都使用 number 作为随机数种子得到的相同结果。
  大于 0 ,以上一个随机数为种子产生下一个随机数。
  等于 0 ,产生与最近生成的随机数相同的随机数。
  省略, 以上一个随机数为种子产生下一个随机数(同大于0)。

说明:
  Rnd 函数返回小于 1 但大于或等于 0 的值。
  number 的值决定了 Rnd 生成随机数的方式。
  对最初给定的种子都会生成相同的数列,因为每一次调用 Rnd 函数都用数列中的前一个数作为下一个数的种子。
  在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器(若带参数,则产生由参数对应的一个特定序列的随机数),该生成器具有根据系统计时器得到的种子。如果不使用Randomize 语句,那么每次执行程序时产生的随机数序列是相同的。

  Rnd 后面跟一个负数时,同样的参数可以得到完全相同的两个序列,例如,rnd -1执行后用rnd取1000个随机数,然后再执行rnd -1,然后再用rnd取1000个随机数,这1000个随机数和前面1000个完全相同。为了得到不同的序列,可以用不同的负数,也可以在rnd -1后面执行Randomize number。注意,要得到相同的序列,两次Randomize后面的number必须相同。这种方法用途之一就是用于加密和解密。

  为了生成某个范围内的随机整数,可使用以下公式:
  Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
  这里,upperbound 是随机数范围的上限,而 lowerbound 则是随机数范围的下限。
  注意:若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。

 

‘ 产生20个1-100之间的不重复随机数  
Public Sub RndNumberNoRepeat1()  
      
    Dim RndNumber, temp(20), i, k, Maxrec As Integer  
      
    Randomize (Timer)           ‘初始化随机数生成器  
    Maxrec = 100  
      
      
    ‘ 从A21开始输出随机数  
    k = 0  
    Do While k < 20  
        RndNumber = Int(Maxrec * Rnd) + 1  
        temp(k) = RndNumber  
        Cells(k + 21, 1) = RndNumber  
        For i = 0 To k - 1  
            If temp(i) = RndNumber Then Exit For  
        Next i  
        If i = k Then k = i + 1  
        ‘MsgBox "随机数:" & RndNumber  
    Loop  
    
End Sub  

  


 

 


















以上是关于VBA学习笔记之随机数&数组redim的主要内容,如果未能解决你的问题,请参考以下文章

vba 代码中有二维动态数组S,第1次重定义为50行,但由于只用到j行

VBA学习笔记之End属性&查找最后的单元格方法总结

VBA学习笔记之数据类型

VBA学习笔记之单元格查询系统制作

VBA学习笔记之循环

VBA学习笔记之工作表